如何在php中使用mysql IN()函数?

CHE*_*HKA 1 php mysql sql

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

$query = SELECT * FROM 'table2' WHERE  'state' IN('$states');
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*Woo 7

它不起作用的原因是因为:

  • 在值IN声明中没有与单引号包裹
  • 列名和表名用不应该用单引号括起来,因为它们是标识符而不是字符串文字

试试这个,

$individualStates = explode(",", $states);
$newState = "'" . implode("','", $individualStates) . "'";
$query = "SELECT * FROM table2 WHERE state IN($newState)";
Run Code Online (Sandbox Code Playgroud)

解析时,语句的输出是,

SELECT * FROM table2 WHERE state IN('AL','AK','AZ','IL')
Run Code Online (Sandbox Code Playgroud)

作为一个旁注,查询是脆弱的SQL Injection,如果值(小号变量)从外面走了进来.请查看下面的文章,了解如何防止它.通过使用,PreparedStatements您可以摆脱使用值周围的单引号.


Ali*_*xel 5

这个:

$states_in = "'" . implode("','", $individualStates) . "'";
Run Code Online (Sandbox Code Playgroud)

不好.你正在打开SQL注入.相反,这样做:

$states = explode(',', $states);
$states_in = array_map(array($instancePDO, 'quote'), $states);
$states_in = implode(',', $states_in);
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用预准备语句,这将为您提供占位符字符串:

$states_placeholder = implode(',', array_fill(0, count($individualStates), '?'));
Run Code Online (Sandbox Code Playgroud)