列state
属于table2
并由以下 varchars 组成:"AL","AK",..
在我的 php 代码中,我有以下字符串:$states="AL,AK,AZ,IL";
我尝试通过以下方式在 mySQL 查询中使用它:
$query = SELECT * FROM 'table2' WHERE 'state' IN('$states');
它没有显示任何结果......这些撇号的正确语法是什么?
它不起作用的原因是:
IN
不是用单引号引起来的尝试这个,
$individualStates = explode(",", $states);
$newState = "'" . implode("','", $individualStates) . "'";
$query = "SELECT * FROM table2 WHERE state IN($newState)";
解析时,语句的输出是,
SELECT * FROM table2 WHERE state IN('AL','AK','AZ','IL')
作为旁注,SQL Injection
如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements
,您可以摆脱在值周围使用单引号。
这个:
$states_in = "'" . implode("','", $individualStates) . "'";
不好。您正在向 SQL 注入敞开心扉。相反,请执行以下操作:
$states = explode(',', $states);
$states_in = array_map(array($instancePDO, 'quote'), $states);
$states_in = implode(',', $states_in);
如果您更喜欢使用准备好的语句,这将为您提供占位符字符串:
$states_placeholder = implode(',', array_fill(0, count($individualStates), '?'));
$states = explode(',', $states);
$states = array_map(function($value){return "'$value'";}, $states);
$query = "SELECT * FROM `table2` WHERE `state` IN(".implode(',', $states).")";
但最好使用准备好的语句。阅读相关问题。