(PHP 8 >= 8.6.0)
mysqli::quote_string -- mysqli_quote_string — SQL 文で使用する文字列をエスケープし、クォートで囲む
オブジェクト指向型
手続き型
SQL 文中で使用できる正しい形式の SQL 文字列リテラルを作成します。 指定した文字列は、接続で使用している現在の文字セットを考慮して mysqli::real_escape_string() と同じ方法でエスケープされたうえで、 シングルクォートで囲まれます。 そのため、戻り値にはクォートを追加せず、そのままクエリに埋め込む必要があります。
mysqli::real_escape_string() とは異なり、
接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合でも、
結果を安全に使えます。
文字セットは、サーバーレベルか API 関数 mysqli_set_charset() のどちらかで設定しないと、 mysqli_quote_string() に反映されません。詳細は 文字セットの概念 を参照ください。
注意:
クォートが適しているのは、文字列リテラルだけです。 テーブル名やカラム名などの識別子は、クォートしても安全にはなりません。 可能な限り、プリペアドステートメント を使い、クエリを手動で組み立てるのは避けてください。
link手続き型のみ: mysqli_connect() あるいは mysqli_init() が返す mysqliオブジェクト。
stringエスケープしてクォートで囲む文字列。
エンコードされる文字は
NUL (ASCII 0)、
\n、\r、
\、'、
"、および
CTRL+Z
です。
接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合は、
' だけを 2 つ重ねてエンコードします。
シングルクォートで囲んだ、エスケープ済みの文字列を返します。
例1 mysqli::quote_string() の例
オブジェクト指向型
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$city = "'s-Hertogenbosch";
/* $city はクォートされ、クエリは動作します。*/
$query = sprintf("SELECT CountryCode FROM City WHERE name=%s", $mysqli->quote_string($city));
$result = $mysqli->query($query);
printf("Select returned %d rows.\n", $result->num_rows);
/* このクエリは失敗します。なぜなら、$city をエスケープしてクォートで囲む処理をしていないからです */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", $city);
$result = $mysqli->query($query);手続き型
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");
$city = "'s-Hertogenbosch";
/* $city はクォートされ、クエリは動作します。*/
$query = sprintf("SELECT CountryCode FROM City WHERE name=%s", mysqli_quote_string($mysqli, $city));
$result = mysqli_query($mysqli, $query);
printf("Select returned %d rows.\n", mysqli_num_rows($result));
/* このクエリは失敗します。なぜなら、$city をエスケープしてクォートで囲む処理をしていないからです */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", $city);
$result = mysqli_query($mysqli, $query);上の例の出力は、 たとえば以下のようになります。
Select returned 1 rows. 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 's-Hertogenbosch'' at line 1 in...