我有两个值的数组,我想在选择查询中将其与sql IN运算符一起使用。
这是我的表的结构
id comp_id
1 2
2 3
3 1
我有一个数组$arr
它有两个值Array ( [0] => 1 [1] => 2 )
我想获取comp_id 1 和 comp_id 2 的记录。所以我写了以下查询。
SELECT * from table Where comp_id IN ($arr)
但它不会返回结果。
由于您有纯整数,因此您可以简单地用逗号连接它们:
$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(',', $arr) . ")";
如果使用字符串,尤其是不受信任的输入:
$sql = "SELECT * FROM table WHERE comp_id IN ('"
. implode("','", array_map('mysql_real_escape_string', $arr))
. "')";
请注意,这不能处理诸如NULL
之类的值(将保存为空字符串(,并且会在数值周围盲目添加引号,如果使用严格的mysql模式,则不起作用。
mysql_real_escape_string
是原始MySQL驱动程序扩展中的函数,如果使用较新的驱动程序(如MySQLLI(,请改用mysqli_real_escape_string
。
但是,如果您只想使用不受信任的号码,则可以使用 intval
或 floatval
来清理输入:
$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(",", array_map('intval', $arr)) . ")";
您需要将数组转换为逗号分隔的字符串:
$condition = implode(', ', $arr);
此外,您可能希望先对值进行转义(如果您不确定输入(:
$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
$arr是一个php数组,你需要向SQL Server发送一个将被解析的字符串您需要将数组转换为 1、2 等列表。
为此,您可以使用函数 http://php.net/implode
所以在运行查询之前尝试
$arr = implode ( ', ', $arr);
你需要用逗号','来内爆你的数组
$imploded_arr = implode(',', $arr);
SELECT * from table Where comp_id IN ($imploded_arr)
你只能将字符串作为查询传递给mysql,所以试试这个
mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
这里的所有人都提出了同样的事情,但由于一个简单的错误,我在WordPress中收到了警告。您需要在内爆字符串中添加逗号。准确地说是这样的事情。
$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";
希望它能帮助像我这样的人。 :)
你混合了 PHP 和 SQL - 对于 IN
SQL 运算符,你需要这样的格式:
SELECT * from table WHERE comp_id IN (1,2)
因此,要在PHP中实现它,您需要执行以下操作:
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"
请记住,这仅在数组由整数组成时才有效。如果每个元素是字符串,则必须对其进行转义。
你需要这样的东西:
$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
实际将$arr
转换为字符串。最简单的方法是使用implode()
$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';
现在,如果您echo
查询,您将看到数组不在IN
语句中,而只是单词"Array">
您需要将数组转换为字符串以在查询中使用:
$list = implode(',', $arr);
然后可以在 IN 子句中使用它:
SELECT * from table Where comp_id IN ($list)
根据@barryhunter的答案,它仅适用于仅包含整数的数组:
$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
我做了一些调整,使其适用于字符串数组:
$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
在前面的一些答案中存在SQL注入的一些风险。如果您完全确定$arr
被消毒(并且会保持这种状态(,那可能会很好。但是,如果您不完全确定,则可能需要使用$stmt->bindValue
来减轻此类风险。这是一种方法:
# PHP
$in_list = array();
for ($i = 0; $i < count($arr); $i++) {
$key = 'in_param_' . i;
$in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
}
$keys = implode(', ', array_keys($in_list));
// Your SQL ...
$sql = "SELECT * FROM table where id IN ($keys)";
foreach ($in_list as $item) {
$stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
}
$stmt = $this->getConnection()->prepare($sql)->execute();
如果你的数组是整数:
$searchStringVar = implode(",",$nameIntAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";
如果您的数组是字符串:
$searchStringVar = implode("','",$nameStringAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";