MySQL のエスケープ ワイルドカードが予期しない動作をするのはなぜですか?

DDD
リリース: 2024-11-07 08:25:03
オリジナル
693 人が閲覧しました

Why is MySQL Escaping Wildcards Behaving Unexpectedly?

MySQL のワイルドカードのエスケープについて

問題:

mysql_real_escape_string を使用してユーザー入力をエスケープしているときに、MySQL の出力に次のように表示される特定のキャラクターでの予期せぬ動作。具体的には、アンダースコア文字の前にはバックスラッシュが付きますが、一重引用符と二重引用符はバックスラッシュではありません。

説明:

想定に反して、 と % は次のとおりです。一般的な使用法では MySQL ワイルドカードではないため、文字列リテラルに挿入するときにエスケープしないでください。この目的には mysql_real_escape_string で十分であり、 と % に addcslashes を追加することは避けるべきです。

ワイルドカードは、LIKE マッチングのコンテキストでのみ関連します。文字列をリテラル LIKE 式として表現する場合、_ と % をエスケープする必要がある追加のエスケープ層が必要です。これは、同じバックスラッシュ文字を使用した一般的な文字列エスケープとは別に行われます。

解決策:

LIKE マッチングの場合は、次の手順に従います:

  1. LIKE エスケープを使用します。_ と % はエスケープする必要があり、エスケープ文字もエスケープする必要があります。
  2. MySQL の mysql_real_escape_string または他のデータベースの適切な関数を使用して、一般的な文字列エスケープを実行します。

例:

リテラルのパーセント記号と一致させるには、LIKE エスケープで二重バックスラッシュエスケープするか (例: MySQL の LIKE 'something\%')、別のエスケープを使用します。移植性を高めるため、LIKE ... ESCAPE ... 構造を備えた文字。

移植可能な LIKE エスケープ関数:

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 ...";
ログイン後にコピー

以上がMySQL のエスケープ ワイルドカードが予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!