2009-03-06 7 views
2

私はそれが一番明確な質問ではないと思っていますが、その例を少しはっきりさせるべきです。アポストロフィをどのようにエンコードして、mysqlで検索できるようにしますか?

私は映画名でいっぱいのテーブルを持っていますが、その中にはアポストロフィが含まれています。私は映画を見つけるために使用される検索ボックスを持っています。

私はそれがすべての作品

mov_title = '$search_keywords' 

を経由して検索を行うが、この方法は、部分的な検索のための任意の結果が得られませんので、私はこの方法では、のために正常に動作します。この

mov_title LIKE '%$search_keywords%' 

を使用する必要がある場合A-ZA-Z0-9のタイトルですが、タイトルにアポストロフィがある場合、完全一致してもその映画を見つけることはできません。

タイトルがDBに格納されている前に、私はこれを介してそれらを置く:

$search_keywords = htmlspecialchars(mysql_escape_string($_GET["search_keywords"])); 

をそうDBで、一つ一つのアポストロフィの前にスラッシュがあります。

ムービータイトルをアポストロフィと一致させる唯一の方法は、アポストロフィの前に物理的にスラッシュを挿入することです。

これはとても些細なことだと思いますが、解決策は痛いほど明白ですが、私はそれを見ていません。

答えて

4

mysql_real_escape_string()を使用し、htmlspecialchars()を使用しないでください。後者はデータベースエスケープ用ではなく、HTML制作用です。

+0

htmlspecialchars()を削除しても何も変更されませんでした。同じように動作します。 –

+0

データベースの値がすでにhtmlspecialchars()を使用していたためです。これらの値をすべてエスケープする必要があります。たとえば、html_entity_decode()およびstripslashes()を使用します。 –

+0

私はいくつかのテスト値を修正しましたが、まだそれらを見つけることはできません。 –

1

これは、出力を行う前にデータをエスケープしてhtml出力を行ったためです。あなただけのそれを出力を行う前に、すなわち:

<li><?php echo htmlspecialchars($some_var); ?></li>

アンエスケープ、データベース内の値を行い、出力のみに脱出するようにアプリケーションを変更する必要があります。現在、$ search_stringにhtmlspecialchars(mysql_real_escape_string())を実行する以外の方法はありません。

すでにデータベースに挿入されているHTMLのためにエスケープするのに意味があっても、mysql_real_escape_string()は内部関数ではなく外部関数になります。

0

データベースをそのままにしておきたい場合は、クエリを構成する前に探している任意の検索語に対してhtmlspecialchars()関数を実行するだけです。データをそのままデータベースに入れることをお勧めしますが、mysql_real_escape_string()を使用してSQLインジェクションの試行を妨げるためにエスケープしてください。次に、データをブラウザに印刷するときにhtmlspecialchars()を使用します。

関連する問題