用于SQL“IN”子句的PHP数组?

时间:2016-10-07 19:56:16

标签: php sql clause

我试图在数据库中使用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我必须像这样引用它们=> #&39; 2345'' 7654'' 8976' 在查询中使用它之前 请帮忙。

1 个答案:

答案 0 :(得分: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成为一个值,而不是三个值。