1

私が最近遭遇した問題は、このコードを使用してデータベースのフィールドを更新しようとすると機能しないということでした。%私はそれを更新されているテキストのサインを持っていることにさかのぼります( $note、そして$note_escaped)...それを挿入することはsprintfうまくいきました。

sprintf更新に使用するべきではありませんか、それとも別の形式にする必要がありますか?

検索をしましたが、何も思いつきませんでした。

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("UPDATE notes_$suffix SET note='$note_escaped', editedby='$editedby', editdate='$editdate' WHERE id='$id' LIMIT 1");

どうもありがとう!

4

5 に答える 5

6

sprintfを完全に間違って使用しています。コード内の関数呼び出しを削除しても、同じことが行われます。そのはず:

sprintf("UPDATE notes_%s SET note='%s', editedby='%s', editdate='%s' WHERE id=%d LIMIT 1", $suffix, $note_escaped, $editedby, $editdate, $id);

マニュアルをお読みください。

于 2010-04-07T16:18:54.943 に答える
3

まず、sprintf-callの代わりにプリペアドステートメントを使用する必要があります

しかし、どうしてもこのようにする必要がある場合は、次を使用する必要があります。

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("
  UPDATE notes_%s /* this is still open for injection, and cannot be properly escaped with mysql_real_escape_string */
  SET note='%s', 
  editedby='%s', 
  editdate='%s' 
  WHERE id='%d'
  LIMIT 1",
$suffix,
$note_escaped, $editedby, $editdate, $id);
于 2010-04-07T17:02:23.927 に答える
1

mysqlで%置き換えることにより、ソーステキスト のをエスケープできます。\%

于 2010-04-07T16:16:40.983 に答える
1

sprintf()は、何らかの方法でデータをフォーマットする必要がない限り、PHPではあまり使用されません。これらの2つのステートメントは、PHPでも同じように機能します。

$num = 42;
$char = 'q';

$text = sprintf('The number is %d and the character is %s', $num, $char);
$text = "The number is $num and the character is $char";

sprintfは、変数データを文字列に「出力」するためにCでより多く使用されています。%0.2fしかし、PHPはすでに二重引用符で囲まれた文字列でそれを行うことができるため、sprintfの特別なフォーマット関数(たとえば、小数点以下2桁の浮動小数点数)を使用する必要がない限り、通常の文字列メソッドを使用する方が簡単です。

于 2010-04-07T16:48:15.273 に答える
-1

http://php.net/manual/en/function.mysql-real-escape-string.phpから:

注:mysql_real_escape_string()は%と_をエスケープしません。これらは、LIKE、GRANT、またはREVOKEと組み合わせた場合のMySQLのワイルドカードです。

\%と_を使用して、%と_を手動でエスケープする必要があります。sprintfの使用はお勧めしませんが、エスケープ機能を改善するだけです。

于 2010-04-07T16:19:11.467 に答える