【问题标题】:How to escape quotes when inserting into database with PHP [duplicate]使用PHP插入数据库时​​如何转义引号[重复]
【发布时间】:2011-02-05 05:43:02
【问题描述】:

在我的数据库中插入包含引号的内容时出现错误消息。 这是我试图逃避引号但没有奏效的方法:

$con = mysql_connect("localhost","xxxx","xxxxx");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("test", $con);

$nowdate = date('d-m-Y')

$title =  sprintf($_POST[title], mysql_real_escape_string($_POST[title]));

$body = sprintf($_POST[body], mysql_real_escape_string($_POST[body]));

$sql="INSERT INTO articles (title, body, date) VALUES ('$title','$body','$nowdate'),";

if (!mysql_query($sql,$con))
  {
  
die('Error: ' . mysql_error());
  
}

header('Location: index.php');

【问题讨论】:

  • 请显示错误信息,您似乎已经正确地转义了数据。

标签: php mysql insert escaping


【解决方案1】:

请开始使用准备好的参数化语句。它们消除了对任何 SQL 转义问题的需要,并关闭了字符串连接的 SQL 语句留下的 SQL 注入漏洞。此外,它们在循环中使用时更令人愉悦且速度更快。

$con  = new mysqli("localhost", "u", "p", "test");
if (mysqli_connect_errno()) die(mysqli_connect_error());

$sql  = "INSERT INTO articles (title, body, date) VALUES (?, ?, NOW())";
$stmt = $con->prepare($sql);
$ok   = $stmt->bind_param("ss", $_POST[title], $_POST[body]);

if ($ok && $stmt->execute())
  header('Location: index.php');
else
  die('Error: '.$con->error);

【讨论】:

    【解决方案2】:

    它应该可以在没有 sprintf 的情况下工作

    $title = mysql_real_escape_string($_POST[title]);
    $body = mysql_real_escape_string($_POST[body]);
    

    【讨论】:

    • @Mauro:你仍然不应该使用这个,而是参数化语句。
    • @Tomalak 不是“应该”而是“推荐”。准备好的语句更简单,是的,但仍然不是灵丹妙药。
    • @Col。弹片:我认为“应该”和“推荐”是一回事。否则我会使用某种形式的“必须”或“必须”。 抱歉,我不会为了礼貌而淡化语言结构。 ;)
    • 虽然参数化语句通常肯定是一种更好的方法,但不幸的是 PHP 的 mysqli_bind_param 实现它们有点冗长,并且对于粗心的人有一个灾难性的接口陷阱,因为它通过变量引用而不是绑定价值。这通常使它比逃跑更难卖。 (PDO 在这方面要好一些。)
    • @bobince:只要绑定和执行是连续完成的,通过引用绑定应该不是问题。除此之外,无论如何将专用变量重新用于其他东西是不好的风格。 ;) 就我而言,冗长+安全胜过简洁。代码的阅读次数多于编写次数,因此冗长实际上是一件好事。
    【解决方案3】:

    对于任何数据库查询,尤其是来自基于 Web 的应用程序的插入,您确实应该使用参数。有关如何在查询中使用参数的 PHP 帮助,请参见此处:PHP parameters

    这将有助于防止 SQL 注入攻击以及避免您必须转义字符。

    【讨论】:

    • 谢谢,我去看看! :)
    【解决方案4】:

    你的代码

    $sql="INSERT INTO articles (title, body, date) VALUES ('$title','$body','$nowdate'),";
    

    应该如下

    $sql="INSERT INTO articles (title, body, date) VALUES ('$title','$body','$nowdate')";
    

    查询末尾不应有逗号

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2019-01-24
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多