1

列は次の varchars にstate属し、それらで構成され て います:table2"AL","AK",..$states="AL,AK,AZ,IL";

$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値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。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 に答える