私が読んだすべてのブログ/記事/Q&Aで、によって返される値を確認することを提案した人は誰もいませんでしたmysql_real_escape_string()
。
私の見方では、このチェックはデータの一貫性を確保するために非常に重要です。この関数が失敗した場合、データベースに挿入される値は偽陽性になるためです。ブールFALSEは文字列として型キャストされ、結果は空の文字列になります。あなたが期待するでしょう。
ドキュメントによると:
Returns the escaped string, or FALSE on error.
A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.
ログを調べて何が起こったかを確認する場合、警告は適切ですが、発生を防ぐことはできません。
失敗する変更はほとんどないことは知っていますが、少なくとも1つの変更がある場合は、アプリケーションで予期される必要があります。
この関数は、次の場合に失敗します。
- 開発者は、この関数を呼び出す前にデータベースに接続しませんでした
- この関数を呼び出す前にデータベースへの接続に失敗しました
- サーバー(mysqlクライアントが存在する場所)のメモリが少なく、エスケープするために文字列をコピーできません
- ..。
これは「通常の」使用法の例です。
$db = mysql_connect() or die('Cannot connect to database');
$value = mysql_real_escape_string($_POST['value'], $db);
mysql_query('insert into tablex (value) values ("'.$value.'")', $db) or die('Cannot insert data in database');
私はこのようなものを使用しています(mysqlのOOラッパーで):
class mywrapper{
// ... [code ...]
// $this->db is the mysql link identifier
public function escape($string)
{
if(mysql_real_escape_string($string, $this->db) === false)
{
throw new Exception('Some message');
}
}
} // end class
// I'm calling it as
// $myWrapper->insert('insert into tablex (value) values ("'.($myWrapper->escape($value)).'")');
これにより、例外ハンドラーによってキャプチャされる例外がスローされます。最も重要なのは、データベースへの誤検知値の挿入を防ぎ、データの一貫性を確保することです。
私は何かが欠けていますか?私は安全に遊んでいますか、それとも妄想的ですか?:)