PDOException(语法错误)

时间:2016-05-23 07:11:53

标签: php pdo

我正在尝试使用php pdo创建评论系统。这是我的代码

<?php
      include_once 'dbConfig.php';
      if(isset($_POST['user_comm']) && isset($_POST['user_name']))
     {
         $comment=$_POST['user_comm'];
         $name=$_POST['user_name'];
         $insert="insert into comments values('','$name','$comment',CURRENT_TIMESTAMP)";
          $stmt = $conn->prepare($insert);
          $stmt->execute();
         $id= $conn->lastInsertId();


        $sql = "select name,comment,post_time from comments where name='$name' and comment='$comment' and id='$id''";
        $stmt = $conn->prepare($sql);
       $stmt->execute();
       if($rows = $stmt->fetch(PDO::FETCH_ASSOC))
      {
        $name=$rows['name'];
         $comment=$rows['comment'];
        $time=$rows['post_time'];
    ?>
    <div class="comment_div">
        <p class="name">Posted By:<?php echo $name;?></p>
        <p class="comment"><?php echo $comment;?></p>
        <p class="time"><?php echo $time;?></p>
    </div>
    <?php
}
exit; ?>

这是我得到的错误

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MariaDB服务器版本,用于在“42”附近使用正确的语法   /home/u998801935/public_html/commento/post_comment.php:15中的第1行   堆栈跟踪:#0   /home/u998801935/public_html/commento/post_comment.php(15):   抛出PDOStatement-&gt; execute()#1 {main}   第15行/home/u998801935/public_html/commento/post_comment.php

我想也许错误来自代码的这一部分?

  $stmt->execute();
   if($rows = $stmt->fetch(PDO::FETCH_ASSOC))
  {

感谢您提前的帮助

4 个答案:

答案 0 :(得分:1)

更改

$sql = "select name,comment,post_time from comments where 
name='$name' and comment='$comment' and id='$id''"; // Notice extra single quote.

要:

$sql = "select name,comment,post_time from comments where 
name='$name' and comment='$comment' and id='$id'";

答案 1 :(得分:1)

你的代码有2个问题(即使你只问过其中一个)。

  1. 您有SQL语法错误,这意味着您的查询中使用的SQL语句未正确写入。正如其他人所提到的,这是因为你有一个额外的近视。将id='$id''更改为id='$id'可以解决错误。

  2. 您的代码对SQL注入非常开放。要防止此类攻击,应在代码中实现准备语句和绑定参数。你确实准备好了你的语句,但你没有绑定你的参数,这使得准备对sql注入完全没用。

  3. 但是,由于我今天心情很好:),这就是您改变代码的方法,不仅可以解决您的错误问题,还可以确保您的数据库安全:

    改变这个:

    $insert="insert into comments 
    values('','$name','$comment',CURRENT_TIMESTAMP)";
    $stmt = $conn->prepare($insert);
    $stmt->execute();
    $id= $conn->lastInsertId();
    
    
    $sql = "select name,comment,post_time from 
    comments where name='$name' and comment='$comment' and id='$id''";
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    

    到此:

    $insert="insert into comments 
    values('',:name,:comment,CURRENT_TIMESTAMP)";
    $stmt = $conn->prepare($insert);
    $stmt->bindParam(':name', $name );
    $stmt->bindParam(':comment', $comment );
    $stmt->execute();
    $id= $conn->lastInsertId();
    
    
    $sql = "select name,comment,post_time from 
    comments where name=:name and comment=:comment and id=:id";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':name', $name );
    $stmt->bindParam(':comment', $comment );
    $stmt->bindParam(':id', $id );
    $stmt->execute();
    

答案 2 :(得分:0)

正如异常消息所示:

  

1064您的SQL语法出错;

您在SQL语法中有错误,而不是PHP。 因此,您应该检查您的查询。

正如Thamilan在他的评论中提到的那样,你在这里有一个错误:

    $sql = "select name,comment,post_time from comments where name='$name' and comment='$comment' and id='$id''";

在查询结束时,您有addidional单引号。

答案 3 :(得分:0)

'

,你有额外的and id='$id''"

最好将prepare和bind语句用作

 $sql = "select name,comment,post_time from comments where name= :name and comment= :comment and id= :id";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':name', $name,PDO::PARAM_STR);
    $stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
    $stmt->bindParam(':id', $id,PDO::PARAM_INT);
    $stmt->execute();

阅读http://php.net/manual/en/pdostatement.bindparam.php

您的代码处于打开状态以进行sql注入阅读How can I prevent SQL injection in PHP?以防止它