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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-10 13:29:131056ブラウズ

How to Properly Escape MySQL Wildcards in LIKE Statements?

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

プリペアド ステートメントがオプションではない環境では、SQL インジェクションを防ぐために、MySQL に送信する前にユーザー入力を徹底的にエスケープすることが重要です。この目的には PHP の mysql_real_escape_string 関数が一般的に使用されますが、MySQL ワイルドカード文字 '%' および '_' をエスケープするには不十分です。

これを補うために、addcslashes を追加で使用できます。ただし、ユーザーが観察したように、ワイルドカードを含む入力がデータベースに送信されて取得されると、表示される結果に矛盾が生じます。

The Escapeing Enigma

ユーザーは、「_」文字の前にバックスラッシュ (「_」) が付加され、「"」および「'」文字が付加されるという奇妙な動作に遭遇しました。 3 つすべて '' でエスケープされているにもかかわらず、そうではありませんでした。なぜこれらの文字は異なる方法で処理されるのでしょうか?

MySQL コンテキストを理解する

解決の鍵この難問は、MySQL における LIKE マッチングのコンテキストを理解する上で発生します。「_」と「%」は、一般的な MySQL の使用法ではワイルドカードとみなされず、エスケープする必要はありません。 mysql_real_escape_string は、この目的でのエスケープのニーズに対応します。

ただし、LIKE ステートメントで使用する文字列を準備する場合は、リテラルが正しく解釈されるように、別のエスケープ ルールが適用されます。エスケープが必要です。

二重エスケープジレンマ

LIKE マッチングのコンテキストでは、「_」と「%」は特殊文字になります。 MySQL は、LIKE エスケープ手順と文字列リテラル エスケープ手順の両方でエスケープ文字としてバックスラッシュ ('') を使用します。これは、リテラルのパーセント記号を LIKE と一致させるには二重バックスラッシュ エスケープが必要であるというユーザーの例で示されているように、混乱を招く可能性があります。

適切な LIKE エスケープ

移植性を避けるため問題がある場合、ANSI SQL では、LIKE ステートメントに指定されたエスケープ文字の使用が規定されています。 PHP でこれを実現する 1 つの方法は、次の関数を使用することです。

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

Prepared Statements での使用

セキュリティと移植性を高めるには、Prepared Statements を使用することをお勧めします。利用可能な場合はステートメント。これにより、適切なデータ処理を確保しながら、手動でエスケープする必要がなくなりました。

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

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