列は次の varchars にstate
属し、それらで構成され
て
います:table2
"AL","AK",..
$states="AL,AK,AZ,IL";
$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
値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。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).")";
ただし、準備済みステートメントを使用することをお勧めします。関連する質問を読んでください。