プリペアド ステートメントが使用できないレガシー サーバーでは、ユーザー入力を MySQL に送信する前にエスケープすることが不可欠です。ただし、mysql_real_escape_string を単独で使用しても MySQL ワイルドカード (_ および %) はエスケープされず、特定のパターンでは予期しない結果が返されます。
たとえば、入力 "test_test ' が送信されると、データベースには "test_test '" と表示されます。アンダースコアにはバックスラッシュ接頭辞が付いていますが、一重引用符と二重引用符にはバックスラッシュが付いていますか?できませんか?
_ と % は MySQL ではワイルドカードではないため、文字列リテラルに挿入するときにエスケープする必要はありません。この目的には mysql_real_escape_string で十分です。
ただし。 、 _ および % を LIKE 一致式で使用する場合は、リテラル値のみと一致するようにするため、特別な処理が必要です。これには 2 つのレベルのエスケープが含まれます:
LIKE エスケープ:
文字列リテラルのエスケープ:
MySQL の場合、リテラルのパーセント記号と照合する場合は、二重バックスラッシュ エスケープを使用します (例: LIKE 'something\%`.
この混乱を避け、移植性を確保するには、LIKE ... を使用してデフォルトのエスケープ文字をオーバーライドできます。 ESCAPE ...construct.function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); } $escapedname= mysql_real_escape_string(like($name, '=')); $query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
以上がLIKE 句で MySQL ワイルドカードを適切にエスケープするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。