我有这样的陈述:
$q1="SELECT * FROM indexing WHERE keywords IN '(".implode(' , ' , $words). ")";
$result = mysqli_query($con,$q1) ;
我需要根据变量indexing
中的值从$words
表中获取详细信息。
但现在它总是将返回的行数显示为零。
如何在sql语句中正确添加引号以获得正确的结果。
答案 0 :(得分:1)
如果您echo
(或vardump
或printf
)q1
,为了进行调试,您会看到发送到服务器的实际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。