1

state属于table2并由以下 varchars 组成:"AL","AK",.. 在我的 php 代码中,我有以下字符串:$states="AL,AK,AZ,IL"; 我尝试通过以下方式在 mySQL 查询中使用它:

$query = SELECT * FROM 'table2' WHERE  'state' IN('$states');

它没有显示任何结果......这些撇号的正确语法是什么?

4

3 回答 3

7

它不起作用的原因是:

  • 语句中的值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,您可以摆脱在值周围使用单引号。

于 2013-05-12T02:30:32.723 回答
5

这个:

$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), '?'));
于 2013-05-12T02:47:05.240 回答
3
$states = explode(',', $states);
$states = array_map(function($value){return "'$value'";}, $states);
$query = "SELECT * FROM `table2` WHERE  `state` IN(".implode(',', $states).")";

但最好使用准备好的语句。阅读相关问题

于 2013-05-12T02:27:07.720 回答