ホームページ >バックエンド開発 >PHPチュートリアル >MySQL で「addcslashes」がアンダースコアを異なる方法でエスケープするのはなぜですか?

MySQL で「addcslashes」がアンダースコアを異なる方法でエスケープするのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-08 15:24:021086ブラウズ

Why Does `addcslashes` Escape Underscores Differently in MySQL?

MySQL ワイルドカードのエスケープ: アンダースコアの謎を解決する

MySQL では、ワイルドカードと、アンダースコア (_) やパーセント記号 (%) などの特殊文字が使用されます。 ) ユーザー入力がデータベースに送信されるときにエスケープチャレンジが作成される可能性があります。 PHP 関数 mysql_real_escape_string はほとんどのエスケープのニーズを処理しますが、_ と % には拡張されません。このため、これらの文字をさらにエスケープするために addcslashes を使用する人もいます。

しかし、複雑な問題が発生します。ユーザー入力にアンダースコアが含まれている場合、addcslashes を使用して実行すると、入力が次の場合にエスケープされたアンダースコアが生成されません。データベースから取得されます。たとえば、「test_test " 」を送信して取得すると、結果にはエスケープされたアンダースコアを含む「test_test " 」が表示されます。問題は、なぜアンダースコアが同じ方法でエスケープされる他の文字と異なる方法でエスケープされるのかということです。

その答えは、一般的な MySQL の使用法では _ と % がワイルドカードではないという事実にあります。これらは LIKE ステートメントで使用される場合にのみ特別になります。LIKE で使用する文字をエスケープするには、リテラル形式と一致するようにエスケープする必要があります。

まず、SQL クエリ内で文字列を LIKE エスケープする必要があります。このコンテキストでは、_ と % は特殊であり、エスケープ文字とともに明示的にエスケープする必要があります。この段階は、パラメータ化されたクエリを使用する場合でも実行する必要があります。

LIKE エスケープが完了したら、SQL の外で通常の文字列を使用するために文字列を再度エスケープする必要があります。ここで mysql_real_escape_string が登場します。

>

MySQL はエスケープの両方の段階でエスケープ文字としてバックスラッシュ () を使用するため、混乱が生じます。たとえば、LIKE ステートメントでパーセント記号と完全に一致するものを見つけるには、文字列を 2 つのバックスラッシュでエスケープする必要があります (「LIKE 'something%''」)。ただし、ANSI SQL では、文字列リテラルでは、バックスラッシュはリテラルのバックスラッシュを表し、引用符 (') 文字はバックスラッシュの代わりにエスケープする必要があると規定しています。

プラットフォーム固有の問題を回避するには、LIKE のデフォルトのエスケープ動作をオーバーライドすることをお勧めします。ステートメントを作成し、LIKE ... ESCAPE ... 構造を使用してカスタム エスケープ文字を定義します。

以上がMySQL で「addcslashes」がアンダースコアを異なる方法でエスケープするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。