1

テーブルには、エスケープされていない会社名があります。
私のqryは次のようになります

$sql = "SELECT id FROM contact_supplier WHERE name = '$addy' LIMIT 1";

問題は、テーブル内の会社名の値が「Acme Int'l S/L」のようなものである場合に発生します。
(参考: $addy の値は DB と一致します)
明らかに、値は保存時にエスケープされませんでした。

一致するものを見つけるにはどうすればよいですか?


[編集]
ああ!
私たちは何かに向かっていると思います。$addy 値のソースはファイルです

$addresses = file('files/addresses.csv');

私はそれから

foreach ($addresses as $addy) {}

$addy 文字列をエスケープすると、改行文字がエスケープされ、比較文字列の末尾に" \r\n " が含まれます。
誰かがもっと優雅な方法を提案しない限り、私はおそらく str_replace() でそれらを削除すると思います。

:)
[\編集]

4

6 に答える 6

0

問題は改行文字であることが判明しました $addy 値のソースは次のように始まります

$addresses = file('files/addresses.csv');

それから私は通り抜けます

foreach ($addresses as $addy) {}

$addy 文字列をエスケープすると、改行文字がエスケープされ、比較文字列の最後に「 \r\n 」が挿入されます。
エスケープ後に string_replace() でこれらの文字を削除するとすぐに、すべてがスムーズに進みました

助けてくれてありがとう

于 2012-04-14T00:02:40.960 に答える
0

使用mysql_real_escape_string:

$addy = mysql_real_escape_string($addy);

または、パラメーター化されたクエリ (PDO) を使用してみてください。


この声明について:

明らかに、保存時に値がエスケープされていません。

これは間違ったロジックです。元の INSERT ステートメントで値がエスケープされていない場合、ステートメントは失敗していました。エスケープしないと、 の行に沿ってエラーが発生しますsyntax error near "l S/L' LIMIT 1"。データがデータベースに正しく保存されているという事実は、データを挿入した人が (エスケープするか、パラメーター化されたクエリを使用して) 正しく挿入できたことを証明しています。

正しく実行している場合、データはエスケープされた形式でデータベースに保存されるべきではありません。

于 2012-04-12T21:26:45.927 に答える
0

テーブルに既に格納されているデータをエスケープする必要があるのはなぜだと思いますか?

SQL クエリの一部、HTML ページ、または JavaScript コード ブロックなど、テキストベースの言語に直接書き込まれる直前にのみ、データをエスケープする必要があります。

于 2012-04-12T21:27:16.510 に答える
0

クエリが実行されると、何もエスケープされません。MySQL はそれを変換して挿入します。そうしないと、挿入されず、構文が原因でエラーが発生するか、SQL インジェクションなどのセキュリティのためにエスケープされます。

したがって、エスケープされた値を使用したクエリは、データベース内のデータで正常に機能します。

于 2012-04-12T21:27:42.050 に答える
0

格納時に値がエスケープされていないと、値を入力しようとしたときに SQL エラーが発生していました。

問題は、クエリを作成するときにデータがエスケープされていないことです。

クイックハック: 使うmysql_real_escape_string

適切な解決策: 文字列を組み合わせて SQL を構築しないでください。準備済みステートメントとパラメーター化されたクエリを使用する

于 2012-04-12T21:28:01.067 に答える