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

时间:2012-08-01 16:26:32

标签: php mysql 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代码,这是我输出的两段代码:

  

错误:您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在第1行使用“show”(团结,17:02 - 周三,2012年8月1日,测试,kr1971)附近使用正确的语法

我对评论系统使用了非常相似的语法,但没有这个问题。如果它也有帮助,我也尝试过本地的sql server和remote,但仍然没有运气。

请帮帮我:(。

6 个答案:

答案 0 :(得分:9)

将值放在单引号中:

$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,则为您的特定数据库引擎提供正确的方法。

答案 1 :(得分:4)

show是一个mysql关键字。因此,它不能是列名。如果要将show用作列名,则必须将其转义。

答案 2 :(得分:4)

show是SQL中的保留关键字。您必须用反引号将其括起来用作列名。

答案 3 :(得分:1)

请使用此查询

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

答案 4 :(得分:0)

您的价值必须用引号括起来。

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

同时显示是一个保留字,因此您需要将其包含在反引号中。

答案 5 :(得分:0)

详细说明塞巴斯蒂安的评论,使用PDO:它对SQL注入攻击更具弹性(或免疫?)。代码看起来像这样

<?php

try {
    $handle = new PDO('mysql:host=localhost;dbname=myDatabaseName', 'username','password');

    $prepared = $handle->prepare("INSERT INTO show_reviews (username, date, content, show) VALUES (?,?,?,?)");

    if($prepared->execute(array($_POST['username'], $_POST['date'], $_POST['content'], $_POST['show']))) {
    echo "1 record inserted...";
    }else {        
        echo "insert failed...";
    }    
}catch(PDOException $ex) {
    // error connecting to database
}
?>