我正在尝试使用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))
{
感谢您提前的帮助
答案 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个问题(即使你只问过其中一个)。
您有SQL语法错误,这意味着您的查询中使用的SQL语句未正确写入。正如其他人所提到的,这是因为你有一个额外的近视。将id='$id''
更改为id='$id'
可以解决错误。
您的代码对SQL注入非常开放。要防止此类攻击,应在代码中实现准备语句和绑定参数。你确实准备好了你的语句,但你没有绑定你的参数,这使得准备对sql注入完全没用。
但是,由于我今天心情很好:),这就是您改变代码的方法,不仅可以解决您的错误问题,还可以确保您的数据库安全:
改变这个:
$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?以防止它