您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获得第1行附近使用的正确语法
我的代码有这个问题,但找不到问题的真正所在,有人有过类似的问题吗您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获得第1行附近使用的正确语法,mysql,localhost,Mysql,Localhost,我的代码有这个问题,但找不到问题的真正所在,有人有过类似的问题吗 <?php include("db.php"); if(isset($_POST['submit'])) { $name=$_POST['namename']; $job=$_POST['job']; $message=$_POST['message']; $insert=mysql_query("insert into commenttable(name,job,message)values('$name','$
<?php
include("db.php");
if(isset($_POST['submit']))
{
$name=$_POST['namename'];
$job=$_POST['job'];
$message=$_POST['message'];
$insert=mysql_query("insert into commenttable(name,job,message)values('$name','$job','$message')")or die(mysql_error());
header("Location:../home.php");
}
?>
如果您在尝试插入文本时代码失败,那么很明显,发生的事情就是Uuerdo在其评论中建议的:MySQL将“XSS”前面的单引号解释为字符串的结束单引号,给您留下一个悬空的XSS');'代码>,这当然是一个语法错误
有两种方法可以克服此问题:
以编程方式转义单引号。如果你自己做的话,这将是相当棘手的,但是PHP中应该有一些库函数来实现这一点,所以它看起来像是message=escape\u for\u sql(message)
。(对不起,我没有复制美元符号,我过敏。)
更好的方法是使用参数化查询,其中使用“?”代替每个值构造查询,为查询指定一个参数,然后为每个参数提供值,然后执行查询。我不知道这是如何在PHP中完成的,搜索“参数化查询PHP”
为了扩展@Mike的答案,正确的prepared语句PHP语法应该是,使用mysql驱动程序:
None. Don't use the mysql driver. It's been deprecated since forever.
使用mysqli:
// You need to define the following $db_* vars elsewhere
$dbh = new mysqli($db_host, $db_user, $db_password, $db_name;)
$query = "INSERT INTO commenttable (name, job, message) VALUES (?, ?, ?)";
$stmt = $dbh->prepare($query);
$stmt->bind_param($name, $job, $message);
$stmt->execute();
// When you're finished...
$stmt->close();
// Edit the connection string as appropriate for your installation
$dbh = new PDO('mysql:host=mydbhost;dbname=whatever', $db_user, $db_password);
$query = "INSERT INTO commenttable (name, job, message) VALUES (:name, :job, :message)";
$stmt = $dbh->prepare($query);
$params = array(':name' => $name, ':job' => $job, ':message' => $message);
$stmt->execute($params);
// PDO has no explicit close() call.
使用PDO:
// You need to define the following $db_* vars elsewhere
$dbh = new mysqli($db_host, $db_user, $db_password, $db_name;)
$query = "INSERT INTO commenttable (name, job, message) VALUES (?, ?, ?)";
$stmt = $dbh->prepare($query);
$stmt->bind_param($name, $job, $message);
$stmt->execute();
// When you're finished...
$stmt->close();
// Edit the connection string as appropriate for your installation
$dbh = new PDO('mysql:host=mydbhost;dbname=whatever', $db_user, $db_password);
$query = "INSERT INTO commenttable (name, job, message) VALUES (:name, :job, :message)";
$stmt = $dbh->prepare($query);
$params = array(':name' => $name, ':job' => $job, ':message' => $message);
$stmt->execute($params);
// PDO has no explicit close() call.
我将错误处理留给读者作为练习。希望有帮助。我猜$name、$job和/或$message中都有“
。您应该使用参数化查询;或者至少尝试清理输入。要帮助查找此类问题的根源,通常先将查询字符串存储在变量中,然后echo
该变量。另外,如果您使用的是不推荐使用的mysql函数,那么您真的应该切换到mysqli或pdo?因为我在php编程方面不是很有经验。这是一个小项目,它不会对我将使用的sql产生任何影响。请查看我编辑的帖子,谢谢你的回复@格迪米纳斯坦哦,我明白了。我修改了我的答案。谢谢你,我也代表OP。stackoverflow的初衷是,如果你有修改的话,可以编辑人们的答案,但是很少有人会这样做,而且不太可能会这样做,因为通过发布你自己的单独答案,你可以获得向上投票,就像我刚才给你的一样。谢谢。我没有修改你的答案,因为我觉得这样做太粗鲁了。