44

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

但它不返回结果。

4

13 回答 13

83

因为你有纯整数,你可以简单地用逗号连接它们:

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

请注意,这不适用于诸如 (将保存为空字符串) 之类的值,并且会在数值周围盲目添加引号,如果使用严格的 mysql 模式NULL则不起作用。

mysql_real_escape_string是原始 mysql 驱动程序扩展中的函数,如果使用更新的驱动程序,如 mysqli,请mysqli_real_escape_string改用。

但是,如果您只想使用不受信任的数字,您可以使用intvalorfloatval清理输入:

$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(",", array_map('intval', $arr)) . ")";
于 2012-03-08T13:21:15.803 回答
15

您需要将数组转换为逗号分隔的字符串:

$condition = implode(', ', $arr);

此外,您可能希望先转义这些值(如果您不确定输入):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
于 2012-03-08T13:21:39.653 回答
5

$arr 是一个 php 数组,您需要向 sql 服务器发送一个将被解析的字符串,您需要将您的数组转换为 1、2 等列表。

为此,您可以使用函数http://php.net/implode

所以在运行查询之前尝试

$arr = implode ( ', ', $arr);
于 2012-03-08T13:21:35.640 回答
5

你需要用','逗号来内爆你的数组

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)
于 2012-03-08T13:21:41.487 回答
4

你只能将字符串作为查询传递给mysql,所以试试这个

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
于 2012-03-08T13:22:39.767 回答
4

这里的所有人都在提出同样的建议,但由于一个简单的错误,我在 WordPress 中收到了警告。您需要在您的内爆字符串中添加逗号。准确地说是这样的。

$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";

希望它可以帮助像我这样的人。:)

于 2017-08-16T11:18:49.097 回答
3

您正在混合 PHP 和 SQL - 对于INSQL 运算符,您需要如下格式:

SELECT * from table WHERE comp_id IN (1,2)

因此,要在 PHP 中实现这一点,您需要执行以下操作:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"

请记住,这仅在数组包含整数时才有效。如果它们是字符串,则必须转义每个元素。

于 2012-03-08T13:22:24.057 回答
2

你需要类似的东西:

$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
于 2012-03-08T13:21:49.413 回答
2

您需要将您的实际转换$arr为字符串。你正在做的最简单的方法是使用implode()

$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';

现在,如果echo您进行查询,您会看到IN语句中没有数组,而是单词“Array”

于 2012-03-08T13:22:15.010 回答
2

您需要将数组转换为字符串以在查询中使用:

$list = implode(',', $arr);

然后可以在 IN 子句中使用它:

SELECT * from table Where comp_id IN ($list)
于 2012-03-08T13:22:15.210 回答
2

根据@barryhunter 的回答,它仅适用于仅包含整数的数组:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";

我做了一些调整以使其适用于字符串数组:

$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
于 2018-07-05T12:07:47.680 回答
0

如果您的数组是整数:

$searchStringVar = implode(",",$nameIntAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";

如果您的数组是 Strings :

$searchStringVar = implode("','",$nameStringAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";
于 2019-01-21T18:05:50.903 回答
0

之前的几个答案中存在一些 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();
于 2018-08-30T01:49:49.420 回答