PHP SQL WHERE name IN (array...)

PHP SQL WHERE name IN (array...)

我有一个数组:

$array = array ( option( 'one' ), option( 'two' ) );

输出:

array(2) { [0]=> string(7) "result1" [1]=> string(7) "result2" } 

和一个sql select:

SELECT * FROM xx WHERE url IN (".implode(',',$array).") ORDER BY id DESC

但输出是:

array(0) { }

如果我运行把SELECT改成mysql,结果是正确的,但是在php页面不工作。

您忘记了一些引号:

SELECT * FROM xx WHERE url IN ('".implode("','",$array)."') ORDER BY id DESC
                                          ^---^
                               ^-------------------------^

没有这些,你正在生成

 ... IN (one','two) ...

这是一个彻头彻尾的语法错误。并且由于您没有提到出现任何错误,您的代码中可能完全没有错误处理,并且只是假设成功 - 这完全是错误的做法。

如果 $array 中的值是字符串,则您的查询语法无效。考虑一下:

$array = ['foo', 'bar'];
$q = "SELECT * FROM xx WHERE url IN (".implode(',',$array).") ORDER BY id DESC";

结果查询将是:

SELECT * FROM xx WHERE url IN (foo, bar) ORDER BY id DESC

鉴于您需要:

SELECT * FROM xx WHERE url IN ("foo", "bar") ORDER BY id DESC

将内爆更改为如下内容:

$q = "SELECT * FROM xx WHERE url IN ('".implode("','",$array)."') ORDER BY id DESC";

注意我添加的单引号,现在生成的查询将在 IN 子句中包含带引号的字符串:

SELECT * FROM xx WHERE url IN ('foo', 'bar') ORDER BY id DESC

话虽如此,将字符串连接到查询中仍然会使您容易受到 SQL 注入攻击。您应该考虑了解准备好的语句,并开始使用它们