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 中用得不多,除非您需要以某种方式格式化数据。这两个语句在 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 中更多地用于将可变数据“打印”到字符串中。但是 PHP 已经可以使用双引号字符串来做到这一点,所以除非您需要使用 sprintf 的特殊格式化函数(例如%0.2f对于 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 回答