【问题标题】:PHP array for an SQL “IN” clause? [duplicate]SQL“IN”子句的PHP数组? [复制]
【发布时间】:2016-10-08 22:51:50
【问题描述】:

我正在尝试使用 html 表单从数据库中搜索多个卷号,例如单个字段中的 2345,7654,8976 现在我正在尝试 php

$query = "SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1";

if(isset($_POST['mroll']))
{
$mroll=$_POST['mroll'];
$query.="and roll IN ('$mroll')";
}

但是 $_POST['mroll'] 会是这样 => 2345,7654,8976 对于 sql 我必须像这样引用它们 => '2345','7654','8976' 在查询中使用它之前 请帮忙。

【问题讨论】:

  • 整数不需要加引号。不过,您对 SQL 注入持开放态度。我不建议这样做,但 and roll IN ($mroll) 会起作用。
  • 列卷是哪种数据类型?
  • explode(',', $_POST['mroll'])
  • 用逗号内爆并使用它无需添加引号
  • 甚至不需要 implode/explode/任何 PHP 函数,如果它真的是 2345,7654,8976。只需去掉引号,它就可以工作(但打开数据库进行注入)。

标签: php sql clause


【解决方案1】:

由于值是整数,如果您取消引用变量,则查询将有效。不过,这将使您面临 SQL 注入。您应该使用参数化查询并将每个值作为占位符传递。尝试类似:

$query = "SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1";
if(isset($_POST['mroll'])) {
     $mroll=$_POST['mroll'];
     foreach(explode(',', $mroll) as $int) {
         $placeholders .= '?, ';
         $params[] = $int; 
     }
     $placeholders = rtrim ($placeholders, ', ');
     $query .= " and roll IN ($placeholders)";
}

演示:https://eval.in/657610

从技术上讲,您可以更改:

$query.="and roll IN ('$mroll')";

$query.="and roll IN ($mroll)";

强烈反对这种方法。

引用时您的查询变为:

SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1and IN ('2345,7654,8976')

这使2345,7654,8976 成为一个值,而不是三个值。

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2012-05-20
    • 2014-10-01
    • 2016-01-12
    • 2014-02-06
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多