ホームページ > データベース > mysql チュートリアル > LIKE 句で MySQL ワイルドカードを適切にエスケープするにはどうすればよいですか?

LIKE 句で MySQL ワイルドカードを適切にエスケープするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-02 03:54:09
オリジナル
306 人が閲覧しました

How to Properly Escape MySQL Wildcards in LIKE Clauses?

MySQL ワイルド カードのエスケープ

問題

プリペアド ステートメントが使用できないレガシー サーバーでは、ユーザー入力を MySQL に送信する前にエスケープすることが不可欠です。ただし、mysql_real_escape_string を単独で使用しても MySQL ワイルドカード (_ および %) はエスケープされず、特定のパターンでは予期しない結果が返されます。

たとえば、入力 "test_test ' が送信されると、データベースには "test_test '" と表示されます。アンダースコアにはバックスラッシュ接頭辞が付いていますが、一重引用符と二重引用符にはバックスラッシュが付いていますか?できませんか?

回答

_ と % は MySQL ではワイルドカードではないため、文字列リテラルに挿入するときにエスケープする必要はありません。この目的には mysql_real_escape_string で十分です。

ただし。 、 _ および % を LIKE 一致式で使用する場合は、リテラル値のみと一致するようにするため、特別な処理が必要です。これには 2 つのレベルのエスケープが含まれます:

LIKE エスケープ:

  • アンダースコア、パーセント、および LIKE 式で使用されるエスケープ文字をエスケープします。
  • これは、パラメータ化された場合でも SQL 内で実行する必要がありますクエリ。

文字列リテラルのエスケープ:

  • LIKE エスケープ文字を含む、文字列リテラルで使用される文字をエスケープします。
  • これたとえば、SQL の外部で実行されます。 mysql_real_escape_string.

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 ...";
ログイン後にコピー
または PDO のパラメータを使用:

以上がLIKE 句で MySQL ワイルドカードを適切にエスケープするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート