【问题标题】:Mysql where id is in array [duplicate]id在数组中的Mysql [重复]
【发布时间】:2013-12-10 18:27:09
【问题描述】:

我有一串像 1,2,3,4,5 这样的 ID,我希望能够列出 mysql 中 ID 包含在该列表中的所有行。

我认为最简单的方法是将字符串转换为数组,然后在 ($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) 
}

知道我在哪里搞砸了吗?

【问题讨论】:

  • Ids 是字符串还是整数?

标签: php mysql arrays explode


【解决方案1】:
$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')

【讨论】:

  • @bhttoan 它可能工作得很好,但它存在漏洞......
  • 怎么样?我展示了一个非常简化和精简的代码视图(包括实际查询本身)以避免放置太多不必要的代码,但我很高兴数组内容经过清理和安全
  • @bhttoan 你没有参数化任何东西。特别是如果字符串来自客户端,则可能会出现问题。
  • @qwertynl 参数化是防止 sql 注入的可靠方法,但这并不意味着所有其他方法都是错误的。如果我期望值为“10”并且我这样做$string==10,这并不比参数化弱..
  • 你会如何参数化这个语句?
【解决方案2】:

您的查询转换为:

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 
   // ...
}

【讨论】:

    【解决方案3】:

    改变

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

    收件人:

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

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

    【讨论】:

    • 那只是把它变回原来的字符串...有什么意义呢?
    • 我相信这是他要求的。
    • 这看起来与我选择的答案相同的最终结果,但在一行而不是两行中,所以不确定为什么要投反对票?仅供参考@Darius 我没有对此投反对票
    • @bhttoan 这个答案和做的一样:$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$string."')"); 它根本不会改变原始字符串。
    • @qwertynl 好吧,OP 想对数组中的每个值运行 intval() 函数,然后返回一个逗号分隔的字符串。我完成了 OP 的要求,仅此而已,是否需要 array_map()。
    猜你喜欢
    • 2016-08-07
    • 2011-09-07
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2018-05-06
    • 2014-04-30
    • 2014-01-23
    相关资源
    最近更新 更多