列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)
它没有显示任何结果......这些撇号的正确语法是什么?
它不起作用的原因是因为:
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您可以摆脱使用值周围的单引号.
这个:
$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)