1

尝试查询 MySQL 数据库时,如何在 PHP 中转义引号?

在不增加addslashes每个值的情况下:

$fname = addslashes("Value's with quote''s'");
$lname = addslashes("Value's with quote''s'");
4

4 回答 4

4

正确的方法是使用准备好的语句,例如通过PDO

如果你不能这样做,你必须处理所有传入数据库查询的值mysql_real_escape_string()- 而且不,简单地对所有$_POST数据执行此操作不是一个选项,因为这会使它们无法用于 HTML 输出等。你可以虽然创建一个$_ESC或类似的东西......但请注意,这个变量不会是超全局的!

于 2011-03-22T12:09:39.387 回答
3

您应该在每个字符串值上转义特殊字符(不仅是引号)(转义您不会在查询中用引号括起来的值是没有用的。这些值需要另一种处理)。

为了避免无聊的重复输入,您可以将转义函数应用于循环中的数组项。

如果您使用 MySQL 并进行 INSERT/UPDATE 查询,您可以使用这个辅助函数:

function dbSet($fields) {
  $set = '';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set .= "`$field`='" . mysql_real_escape_string($_POST[$field]) . "', ";
    }
  }
  return substr($set, 0, -2); 
}

它是这样使用的:

$id     = intval($_POST['id']);
$table  = 'users';
$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "UPDATE `$table` SET ".dbSet($fields).", `date`=NOW() WHERE id=$id";

也不要忘记使用mysql_real_escape_string()函数mysql_set_charset()所需的设置正确的编码。

于 2011-03-22T12:09:21.213 回答
2

一个好主意是使用此处描述的 PDO 准备语句。

它会自动转义这些字符。

于 2011-03-22T12:10:41.033 回答
1

首先,不要使用addslashes()- 不建议与转义数据库查询字符串一起使用,因为它不会转义实际需要转义的所有内容;有些角色仍然可以通过。

正确的解决方案取决于您使用的数据库。假设您使用的是 MySQL,那么要使用的正确函数addslashes()mysql_real_escape_string().

您可能会注意到,在每一行上使用 this 甚至比 更加冗长addslashes(),因此它并不能真正回答您的问题。

如果您的字段都是单独的变量(根据您的示例),那么您真的会为一堆代码行做这件事。

如果您使用的是数组(例如$_POST),那么您可以在循环中执行它,这将使事情变得更加整洁 - 您可以执行以下操作:

foreach($_POST as $key=>$value) {
    $sqlstrings[$key]="`".$key"` = '".mysql_real_escape_string($value)."'";
}
$sql = "update table ".implode(' ',$sqlstrings)." where id=".$update_id;

执行 SQL 的一种更新方法是使用对象模型而不是手动构建查询。PHP 有许多库可能会有所帮助:mysqli它是一个改进的 MySQL 库,并且PDO是一个与数据库无关的库。与直接构建 SQL 代码相比,其中任何一个都可以为您提供更好的安全性和灵活性。但是,如果您已经有很多代码,那么它们将代表相当大的代码更改开销,因此您可能希望mysql_real_escape_string()在短期内使用上面讨论的选项。不过,我确实建议对它们进行投资。

于 2011-03-22T12:20:28.490 回答