4

这是我的代码:

<?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) VALUES (Solidarity, 17:02 - Wed, 1st Aug 2012,Testing,kr1971) 附近使用正确的语法

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

请帮我 :(。

4

6 回答 6

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

于 2012-08-01T16:28:30.187 回答
4

show是一个mysql关键字。因此,它不能是列名。如果您想使用 show 作为列名,则必须对其进行转义。

于 2012-08-01T16:28:28.307 回答
4

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

于 2012-08-01T16:28:36.903 回答
1

请使用此查询

$sql= 'INSERT INTO show_reviews (username, date, content, show) 
       VALUES ("'.addslashes($_POST[username]).'",".'addslashes($_POST[date]).'","'.addslashes($_POST[content]).'","'.addslashes($_POST[show]).'")';
于 2012-08-01T16:29:25.463 回答
0

您的值需要用引号括起来。

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

另外 show 是一个保留字,所以你需要用反引号括起来。

于 2012-08-01T16:29:27.280 回答
0

要详细说明 Sebastian 的评论,请使用 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
}
?>
于 2012-08-01T17:00:11.867 回答