您的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的初衷是,如果你有修改的话,可以编辑人们的答案,但是很少有人会这样做,而且不太可能会这样做,因为通过发布你自己的单独答案,你可以获得向上投票,就像我刚才给你的一样。谢谢。我没有修改你的答案,因为我觉得这样做太粗鲁了。