Mysql WHERE IN()的爆炸/内爆列表

时间:2014-12-18 13:57:45

标签: php mysqli explode implode

我真的很困惑这个。

我正在尝试将代码列表传递给MySql语句,但不能以正确的格式传递它。

我的列表来自名为“uniquecode”的表单textarea

文本区域中的示例代码(全部在新行上)将是:

fg3456 tg7844 de3902 .. etc

我尝试用以下内容爆炸并破坏列表:

$ar = $_POST['uniquecode']
$in = "'".implode("','", explode("\n", $ar))."'";

然后将$ in的结果传递给Mysql语句:

$sql = "SELECT code, size, price from stock WHERE code IN ($in)";

当我回显$ sql时,我得到以下内容:

SELECT housecode, name, cost, size, price FROM stock where code IN ('fg3456 ','tg7844 ', ','de3902')

正如您只能看到最后一项,'de3902'格式正确。请注意,列表中的第一项有一个空格,然后是单引号,然后是逗号:'fg3456',

由于这个问题,当我尝试从查询中循环遍历结果集时,只返回最后一项:

$result = $mysqli->query($sql); 
if ($result = mysqli_query($mysqli, $sql)) {
        while($row = $result->fetch_array()) {
            $code = $row['code'];
            $name = $row['name'];
            $size = $row['size'];
            $price = $row['price'];
        }   

 echo $code; //returns last item in the list: de3902

所以我的问题是如何将列表爆炸/内爆为Mysql查询的IN子句的正确格式,以便它正确读取并返回所有代码???

SELECT code, name, size, price from stock WHERE code IN ('fg3456','tg7844','de3902')

亲切的问候

2 个答案:

答案 0 :(得分:1)

为什么你在\n爆炸,似乎你应该在空间(' ')上爆炸。否则,内爆看起来很好。

或者,您可以使用preg_replace替换任意数量的空格(引用逗号引号)。 $in = "'" . preg_replace('/\s+/',"','", $ar) . "'";

答案 1 :(得分:1)

正如评论中所提到的,我会遍历您的值并为每个值添加一个问号,然后在准备好语句后将值绑定到这些占位符。现在你有一个SQL注入问题。

但是,为了确保使用您似乎接收的输入获得所需的字符串,可以使用preg_split()在多个空格,制表符或换行符上进行爆炸。

example

$st = trim(" \n fg3456   tg7844  \n  \n de3902  \n ");
$ar = preg_split('#\s+#', $st);
var_dump($ar);
$in = "'".implode("','", $ar)."'";
var_dump($in);

结果:

array(3) {
  [0]=>
  string(6) "fg3456"
  [1]=>
  string(6) "tg7844"
  [2]=>
  string(6) "de3902"
}
string(26) "'fg3456','tg7844','de3902'"

您可以使用第一部分来准备声明:

$st = trim(" \n fg3456   tg7844  \n  \n de3902  \n ");
$ar = preg_split('#\s+#', $st);
$in = trim(str_repeat('?,', count($ar)), ',');
$sql = "SELECT code, size, price from stock WHERE code IN ($in)";
var_dump($sql);

结果:

string(57) "SELECT code, size, price from stock WHERE code IN (?,?,?)"

顺便说一下,我个人会使用PDO,因为这会使绑定更容易。