这是我的代码:
<?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,但仍然没有运气。
请帮帮我:(。
答案 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
}
?>