使用PHP插入数据库时​​如何转义引号

时间:2010-04-07 12:01:51

标签: php mysql insert escaping

我对PHP很陌生,所以很抱歉,如果听起来这么简单......:)

在将包含引号的内容插入到我的数据库中时,我收到错误消息。 这是我试图逃避报价但没有奏效的原因:

$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');

你能提供任何解决方案吗?

提前致谢。

莫罗

4 个答案:

答案 0 :(得分:13)

请开始使用准备好的参数化语句。它们消除了对任何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);

答案 1 :(得分:12)

它应该没有sprintf的东西

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

答案 2 :(得分:2)

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

这将有助于防止SQL注入攻击,并防止您必须转义字符。

答案 3 :(得分:2)

您的代码

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

应如下

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

在查询结尾处不应该有逗号