MySQL ワイルドカードのエスケープ: 二重エスケープの難題を理解する
PHP でユーザー入力を操作し、MySQL データベースに接続する場合、特殊なエスケープを行う文字は悪意のある入力を防ぐために非常に重要です。従来、この目的には PHP の mysql_real_escape_string() 関数が使用されてきましたが、MySQL のワイルドカードである % や _ などの文字が欠落しています。その結果、多くの開発者は、これらの文字もエスケープするために addcslashes を使用することに頼っています。
しかし、addcslashes の予期しない動作には疑問が生じます。 _ はバックスラッシュでエスケープするのに、" や ' ではエスケープしないのはなぜですか? この記事では、MySQL ワイルドカード エスケープの微妙な違いを詳しく調べ、それらを正しく処理するための解決策を探ります。
LIKE についてエスケープ
他のワイルドカード文字とは異なり、% と _ は標準の MySQL 文字列リテラルのワイルドカードではありません。LIKE マッチングのコンテキストでのみ特殊文字になります。LIKE の文字列を準備するためです。パラメータ化されたクエリを使用する場合でも、LIKE エスケープとして知られる追加のエスケープ層が必要です。
LIKE エスケープでは、エスケープ文字自体 (通常はバックスラッシュ) と一緒に _ と % をエスケープする必要があります。ただし、標準 SQL とは異なり、MySQL はリテラルのバックスラッシュ エスケープ (文字列リテラル内) と LIKE エスケープの両方にバックスラッシュを使用します。
二重エスケープとバックスラッシュの問題
このようにバックスラッシュを二重に使用すると、混乱を招く二重エスケープ シナリオが作成されます。たとえば、リテラルのパーセント記号 (%) と一致させるには、LIKE 'something\%' を使用してバックスラッシュを二重にエスケープする必要があります。ただし、これは ANSI SQL によれば誤りであり、データベースによっては問題が発生する可能性があります。
移植可能なソリューション
この問題を解決して移植性を確保するには、 LIKE ... ESCAPE ... 構造を使用して、LIKE 式のデフォルトのエスケープ文字をオーバーライドする必要があります。このアプローチを紹介する関数を次に示します。
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
この関数を使用すると、ANSI SQL との互換性を確保しながら、LIKE で使用する文字列をエスケープできます。
結論
MySQL でワイルドカードをエスケープするのは簡単そうに見えますが、二重にエスケープするという難問が混乱を引き起こす可能性があります。 LIKE エスケープの複雑さを理解し、移植可能なソリューションを採用することで、悪意のある入力を効果的に防止し、データベースの整合性を確保できます。
以上がMySQL ワイルドカードのエスケープに 2 つのバックスラッシュが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。