3

私はデータベースに入れられるものにmysql_real_escape_stringを使用するので、のようなものBob's ShopはになりBob\'s Shopます。そして、たとえば、を含むすべてのエントリを選択しようとするとBob\'s、selectステートメントは次のようになります。

SELECT * FROM tbl WHERE name LIKE '%Bob\\\'s%' 

そして、何らかの理由で、それが機能することは完全に理にかなっていますが、機能しません。

4

3 に答える 3

1

DBに入力された値には、そのアポストロフィが関数によってエスケープされている場合、バックスラッシュは含まれませんmysql_real_escape_string。これはセキュリティ上の目的のみです。したがって、DBの最終的な値はになりますBob's"double \"quotes\""これは、とのように、引用符で囲まれた文字列内で同じ引用符をエスケープするようなもの'single \'quotes\''です。

そのままクエリ%Bob\'s%してみましたか?そして、名前列のデータ型は何ですか?私はあなたの問題を再現することはできません、それはあなたと私の例の両方で働いています。

于 2012-07-28T13:57:28.830 に答える
0

私はそれを修正しました(方法を教えてくれたMichaelに感謝します)。他の誰かがこの問題を抱えている場合に備えて、私がしたことを投稿しています。

LIKEにエスケープ文字を適切に配置する方法がわからなかったが、問題は、魔法の引用符がオンになっていることでした。そのため、mysql_real_escape_stringを使用すると、エスケープ文字が追加され、Bobとして保存されるのではなく、Bobとして保存されました。 \の。これは、魔法の引用符を無効にするためのドキュメントです。http ://www.php.net/manual/en/security.magicquotes.disabling.php 私にとっては、購入したホスティングを使用しているためphp_flag magic_quotes_gpc Offphp_value magic_quotes_gpc Off.htaccessを挿入しても機能しませんでした。そして、ホストはそのような設定を許可していません。その代わりにmagic_quotes_gpc = Off、php.iniというファイルを入れて、必要なすべてのディレクトリに入れました。

MySQLデータベースには、余分な円記号を含む行がすでにたくさんあるので、魔法の引用符をオフにしたときにそれらを取り除く必要がありました。これは、次のようなクエリを発行することで簡単に実行できますUPDATE tbl SET col=REPLACE(col,'\\\'','\'') WHERE col LIKE '%\'%'。tblをテーブル名に置き換え、colを作業中の任意の列に置き換えます。修正する必要のある他のエスケープ文字がある場合は、それを反映するようにREPLACEとLIKEを変更するだけです。すべての列とすべてのエスケープ文字を一挙に実行する方がおそらく良いコードですが、私の目的ではそれは必要ありませんでした。

于 2012-07-28T14:41:19.827 に答える
-1

こんにちは私はこれがmySQLとJavaのためにあなたを助けることができると思います、

Javaの場合

char quotes ='"';

String sql =" SELECT * FROM tb1 where name LIKE "+quotes+"%Bob's%"+quotes+" ;";

mySQLクエリ

SELECT * FROM tbl WHERE name LIKE "%Bob's%" 
于 2013-09-24T12:37:21.493 に答える