我有一个数组:
scanFile()
输出:
$array = array ( option( 'one' ), option( 'two' ) );
和sql选择:
array(2) { [0]=> string(7) "result1" [1]=> string(7) "result2" }
但输出是:
SELECT * FROM xx WHERE url IN (".implode(',',$array).") ORDER BY id DESC
如果我将SELECT运行到mysql中,结果是正确的,但在php页面中无效。
答案 0 :(得分:3)
如果$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注入的攻击。您应该考虑学习准备好的陈述,并开始使用它们
答案 1 :(得分:2)
你忘记了一些引言:
SELECT * FROM xx WHERE url IN ('".implode("','",$array)."') ORDER BY id DESC
^---^
^-------------------------^
没有这些,你就会产生
... IN (one','two) ...
这是一个彻头彻尾的语法错误。而且由于你没有提到任何错误,你可能在代码中完全没有错误处理,只是假设成功 - 这正是错误的事情。