【问题标题】:Escaping quotes in PHP [duplicate]PHP中的转义引号[重复]
【发布时间】:2011-07-20 10:34:14
【问题描述】:

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

无需在每个值上添加addslashes

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

【问题讨论】:

  • mysql_real_escape_string(),但考虑 PDO 和准备好的语句。

标签: php addslashes


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

如果您使用 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_set_charset() 设置正确的编码,因为它是 mysql_real_escape_string() 函数所必需的。

【讨论】:

【解决方案3】:

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

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

您可能会注意到,在每一行上都使用它比 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() 选项。不过,我确实建议对它们进行投资。

【讨论】:

  • $_POST[] 不是数组,它是向数组添加新值的运算符
  • @Col:不知道你的意思是什么? $_POST 是一个数组。
  • 是的,$_POST 是数组,$_POST[] 是运算符
  • @Col:好的,我支持你。没有我想的那么重要。 ;)
【解决方案4】:

here 所述,使用 PDO 准备好的语句是一个好主意。

它会自动转义这些字符。

【讨论】:

  • 事实上,原生模式下的 PDO 并没有转义任何东西
  • 抱歉,我的回答有点不准确。兼容模式下的 PDO 进行转义,但在本机模式下,它将查询和参数分别发送到 DBMS。我说的对吗?
  • 感谢您向我介绍 pdo。我一定会试试的。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 2020-12-27
  • 2019-03-17
  • 2012-12-27
  • 2012-09-01
  • 2011-09-10
  • 2016-12-17
  • 2011-12-21
相关资源
最近更新 更多