解析SQL查询以从'implode'获取值

时间:2014-07-08 02:30:48

标签: php html mysql implode

我有这样的陈述:

$q1="SELECT * FROM indexing WHERE keywords IN '(".implode(' , ' , $words). ")";
$result = mysqli_query($con,$q1) ;

我需要根据变量indexing中的值从$words表中获取详细信息。
但现在它总是将返回的行数显示为零。
如何在sql语句中正确添加引号以获得正确的结果。

3 个答案:

答案 0 :(得分:1)

如果您echo(或vardumpprintfq1,为了进行调试,您会看到发送到服务器的实际SQL文本。

这里有一些问题。在paren之前有一个引用,我们希望你打算将$words作为数组,这将在SQL语句中转换为字符串文字列表。

IN '(".implode(' , ' , $words). ")"
   ^           ^^ ^^

看起来你想要这样的东西:

IN ('" . implode("','",$words) . "')";
    ^            ^^ ^^            ^

如果$words为空,那将导致SQL文本:

IN ('') 

如果$words包含元素"abc","def",则会产生SQL文本:

IN ('abc','def')

但是,再次检查实际SQL文本在发送到数据库之前的内容。


如果$words中的某个元素恰好包含可以解释为SQL文本的字符,您可能需要认真考虑生成的SQL语句,例如:

"abc') OR 1=1; -- "

经典SQL注入漏洞ala Little Bobby Tables http://xkcd.com/327/

答案 1 :(得分:0)

说你有,

$words = ["a" ,"b","c","d"];  // i.e an array

然后,

$val = implode(',' , $words) ; 


$q1="SELECT * FROM indexing WHERE keywords IN ($val)";

这样做。

答案 2 :(得分:0)

首先,你使用的是mysqli_query而你应该使用预备语句,至少如果不是pdo。

$query = "SELECT <your code> FROM <your code> IN ('".implode("','",array_values($words))."') ";应该有效。 如果您正在准备声明中寻找解决方案,则已经回答here