我有两个值的数组,我想在选择查询中将它与 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 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))
. "')";
请注意,这不适用于诸如 (将保存为空字符串) 之类的值,并且会在数值周围盲目添加引号,如果使用严格的 mysql 模式NULL
则不起作用。
mysql_real_escape_string
是原始 mysql 驱动程序扩展中的函数,如果使用更新的驱动程序,如 mysqli,请mysqli_real_escape_string
改用。
但是,如果您只想使用不受信任的数字,您可以使用intval
orfloatval
清理输入:
$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 服务器发送一个将被解析的字符串,您需要将您的数组转换为 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)."')";
如果您的数组是整数:
$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')";
之前的几个答案中存在一些 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();