如何将 php 数组与 sql IN 运算符一起使用


How to use php array with sql IN operator?

我有两个值的数组,我想在选择查询中将其与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

但是,如果您只想使用不受信任的号码,则可以使用 intvalfloatval 来清理输入:

$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')";