mysqli::real_escape_string
mysqli::escape_string
mysqli_real_escape_string
(PHP 5, PHP 7)
mysqli::real_escape_string -- mysqli::escape_string -- mysqli_real_escape_string — 接続の現在の文字セットを考慮して、SQL 文で使用する文字列の特殊文字をエスケープする
説明
オブジェクト指向型
public mysqli::escape_string
( string $escapestr
) : string
mysqli::real_escape_string
( string $escapestr
) : string
手続き型
mysqli_real_escape_string
( mysqli $link
, string $escapestr
) : string
この関数を使用して、SQL 文中で使用できる正当な形式の SQL 文字列を作成します。
文字列 escapestr
が、エスケープされた
SQL に変換されます。その際、接続で使用している現在の文字セットが考慮されます。
警告 サーバーレベルで設定するなり API 関数 mysqli_set_charset() を使うなりして、 文字セットを明示しておく必要があります。この文字セットが mysqli_real_escape_string() に影響を及ぼします。詳細は 文字セットの概念 を参照ください。
パラメータ
link
手続き型のみ: mysqli_connect() あるいは mysqli_init() が返すリンク ID。
escapestr
エスケープする文字列。
エンコードされる文字は
NUL (ASCII 0), \n, \r, \, ', ", および Control-Z
です。
返り値
エスケープ済みの文字列を返します。
エラー / 例外
有効な MySQLi 接続を渡さずにこの関数を実行すると null
が返され、
E_WARNING
レベルのエラーが発生します。
例
例1 mysqli::real_escape_string() の例
オブジェクト指向型
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* 接続状況をチェックします */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");$city = "'s Hertogenbosch";/* このクエリは失敗します。なぜなら $city をエスケープしていないからです */if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) { printf("Error: %s\n", $mysqli->sqlstate);}$city = $mysqli->real_escape_string($city);/* $city をエスケープしたので、このクエリは正しく動作します */if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) { printf("%d Row inserted.\n", $mysqli->affected_rows);}$mysqli->close();?>
手続き型
<?php$link = mysqli_connect("localhost", "my_user", "my_password", "world");/* 接続状況をチェックします */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");$city = "'s Hertogenbosch";/* このクエリは失敗します。なぜなら $city をエスケープしていないからです */if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) { printf("Error: %s\n", mysqli_sqlstate($link));}$city = mysqli_real_escape_string($link, $city);/* $city をエスケープしたので、このクエリは正しく動作します */if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) { printf("%d Row inserted.\n", mysqli_affected_rows($link));}mysqli_close($link);?>
上の例の出力は以下となります。
Error: 42000 1 Row inserted.
注意
注意:
これまでに mysql_real_escape_string() をよく使っていた人は、 mysqli_real_escape_string() の引数が mysql_real_escape_string() とは違うことに注意しましょう。 mysqli_real_escape_string() の最初の引数は
link
であり、 mysql_real_escape_string() のようにエスケープしたい文字列を最初に書くのではなくなりました。
参考
- mysqli_set_charset() - クライアントのデフォルト文字セットを設定する
- mysqli_character_set_name() - データベース接続のデフォルトの文字コードセットを返す