複数のステートメントMySQL は、ひとつのステートメントの文字列に、 複数のステートメントを埋め込むことをオプションでサポートしています。 しかし、そうするためには特別な操作が必要です。 複数のステートメント、 またはマルチクエリーは、 mysqli::multi_query を使って実行する必要があります。 文字列に埋め込まれる個々のステートメントは、 セミコロンで区切ります。 実行されたステートメントによって返される全ての結果セットは、 取得されなければいけません。 MySQL サーバーは、 結果セットを返すステートメントと、 返さないステートメントを、 ひとつの複数のステートメントに埋め込むことができます。
例1 複数のステートメント
上の例の出力は以下となります。 array(1) { [0]=> array(1) { ["_num"]=> string(1) "0" } } array(1) { [0]=> array(1) { ["_num"]=> string(1) "1" } } セキュリティ上の考慮
mysqli::query や
mysqli::real_query は、
サーバーで複数のクエリを処理するための接続フラグを設定しません。
複数のステートメントを使うことで、
SQLインジェクション攻撃の被害を軽減するためには、
追加のAPI呼び出しが必要です。
攻撃者は、
例2 SQLインジェクション
上の例の出力は以下となります。 PHP Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TABLE mysql.user' at line 1 プリペアドステートメント プリペアドステートメントを複数のステートメントで使うことは、 サポートされていません。 参照
|