MySQL中的where id在数组中的含义

45

我有一个ID字符串,例如1,2,3,4,5,我想要列出mysql中包含在该列表中的所有行。

我认为最简单的方法是将字符串转换为数组,然后在($array)中匹配,但对我来说不起作用-没有错误等,但它不返回任何行:

$string="1,2,3,4,5";
$array=array_map('intval', explode(',', $string));
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')");

如果我对 $array 进行 var_dump,我会得到:

array(5) { 
    [0]=> int(1) 
    [1]=> int(2) 
    [2]=> int(3) 
    [3]=> int(4) 
    [4]=> int(5) 
}

我错在哪里了?


这些 Id 是字符串还是整数? - Hanlet Escaño
3个回答

98
$string="1,2,3,4,5";
$array=array_map('intval', explode(',', $string));
$array = implode("','",$array);
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')");

注意:语法如下:

SELECT * FROM table WHERE column IN('value1','value2','value3')


1
@bhttoan,这可能会很有效,但它存在漏洞的风险... - qwertynl
1
怎么样?我展示了一个非常简化和剥离的代码视图(包括实际查询本身),以避免放置过多不必要的代码,但我很高兴数组内容已经过消毒和安全。 - bhttoan
@bhttoan,你没有对任何东西进行参数化。特别是如果字符串来自客户端,可能会出现问题。 - qwertynl
2
@qwertynl 参数化是防止 SQL 注入的一种可靠方法,但这并不意味着其他方法都是错误的。如果我期望一个值为“10”,并且我执行 $string==10,那么这并不比参数化更弱。 - CrayonViolent
1
你会如何对这个语句进行参数化? - user12173484
@qwertynl 那个数组经过intval()处理,不存在SQL注入的空间。当我只处理数字时,我自己也经常使用intval。 - Daniel Wu

10

您的查询翻译为:

SELECT name FROM users WHERE id IN ('Array');

或者类似的东西。

尝试使用预处理查询,例如:

$numbers = explode(',', $string);
$prepare = array_map(function(){ return '?'; }, $numbers);
$statement = mysqli_prepare($link , "SELECT name FROM users WHERE id IN ('".implode(',', $prepare)."')");
if($statement) {
   $ints = array_map(function(){ return 'i'; }, $numbers);
   call_user_func_array("mysqli_stmt_bind_param", array_merge(
      array($statement, implode('', $ints)), $numbers
   ));
   $results = mysqli_stmt_execute($statement);
   // do something with results 
   // ...
}

4
改变
$array=array_map('intval', explode(',', $string));

致:

$array= implode(',', array_map('intval', explode(',', $string)));

array_map返回的是一个数组,而不是字符串。你需要将该数组转换为逗号分隔的字符串,以便在WHERE子句中使用。


那只是把它转换回原始字符串...这有什么意义吗? - qwertynl
我相信那就是他所请求的。 - Darius
这看起来与我选择的答案结果相同,但只用了一行而不是两行,所以不确定为什么会被踩?顺便说一句,@Darius,我没有踩这个。 - bhttoan
@bhttoan 这个答案与执行以下代码相同:$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$string."')"); 它不会改变原始字符串。 - qwertynl
@qwertynl 好的,OP想要在数组中的每个值上运行intval()函数,然后返回一个逗号分隔的字符串。我完成了OP所要求的,没有更多的要求,无论是否需要使用array_map()。 - Darius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接