問題:
mysql_real_escape_string を使用してユーザー入力をエスケープしているときに、MySQL の出力に次のように表示される特定のキャラクターでの予期せぬ動作。具体的には、アンダースコア文字の前にはバックスラッシュが付きますが、一重引用符と二重引用符はバックスラッシュではありません。
説明:
想定に反して、 と % は次のとおりです。一般的な使用法では MySQL ワイルドカードではないため、文字列リテラルに挿入するときにエスケープしないでください。この目的には mysql_real_escape_string で十分であり、 と % に addcslashes を追加することは避けるべきです。
ワイルドカードは、LIKE マッチングのコンテキストでのみ関連します。文字列をリテラル LIKE 式として表現する場合、_ と % をエスケープする必要がある追加のエスケープ層が必要です。これは、同じバックスラッシュ文字を使用した一般的な文字列エスケープとは別に行われます。
解決策:
LIKE マッチングの場合は、次の手順に従います:
例:
リテラルのパーセント記号と一致させるには、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 サイトの他の関連記事を参照してください。