php – SQL语法错误,我只是看不到它

这是我的代码:

<?php
$con = mysql_connect("localhost","solidarity","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("database", $con);

$sql="INSERT INTO show_reviews (username, date, content, show) VALUES (".addslashes($_POST[username]).",".addslashes($_POST[date]).",".addslashes($_POST[content]).",".addslashes($_POST[show]).")";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);
?>

所以我使用了fsprint,现在我刚刚使用了w3schools代码,这是我输出的两段代码:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘show) VALUES (Solidarity, 17:02 – Wed, 1st Aug 2012,Testing,kr1971)’ at line 1

我对评论系统使用了非常相似的语法,没有这个问题.如果它也有帮助,我已经尝试了本地的SQL服务器和遥控器,仍然没有运气.

请帮我 :(.

最佳答案
将值放在单引号内:

$sql=" INSERT INTO show_reviews (username, date, content, show) 
       VALUES ('".addslashes($_POST[username])."','".addslashes($_POST[date])."','".addslashes($_POST[content])."','".addslashes($_POST[show])."')";

此外,正如其他人所说,show是MySQL中的保留关键字.您可以在http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html查看MySQL 5.5的保留关键字的完整列表

您可以使用反引号引用保留字以便能够使用它们:

INSERT INTO show_reviews (username, date, content, `show`)

引用标识符:
http://dev.mysql.com/doc/refman/5.5/en/identifiers.html

最后,总结一下使用addslashes()进行转义的注释.我会让Chris Shiflett解释为什么它不好:http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

你真的应该在准备好的语句/参数化查询上与PDO或至少MySQLi一起跳跃.以下是您查询的外观示例:

$dbh = new PDO($connection_string);
$sql = "INSERT INTO show_reviews (username, date, content, show) VALUES (?, ?, ?, ?)"; 
$stmt = $dbh->prepare($sql);
$stmt->execute(array($_POST['username'],
                    $_POST['date'],
                    $_POST['content'],
                    $_POST['show']
));
while ($row = $stmt->fetch()) {
   print_r($row);
}

这纯粹是一个例子,对$_POST变量进行清理仍然是一个好主意,并尽力确保您收到的数据正是您想要获得的数据.这些准备好的语句可以正确地为您提供转义,如果使用PDO,则可以使用适合您特定数据库引擎的方法.

转载注明原文:php – SQL语法错误,我只是看不到它 - 代码日志