PHP Prepared语句bind_param()错误

时间:2016-04-24 17:00:52

标签: php mysql sql

很多人在stackoverflow上遇到过这个问题,但我仍然无法发现错误

这是错误:

Fatal error: Call to a member function bind_param() on boolean -

这是代码行:

$insertpost = $conn->prepare("INSERT INTO posts (title,post,user,img,date,short) VALUES(?,?,?,?,NOW(),?)");
$insertpost->bind_param("sssss",$title,$comment,$user,$url,$short);

2 个答案:

答案 0 :(得分:2)

更新:我的原始答案对于这个问题非常不正确。 date不是保留字,可以在没有引用的情况下使用(感谢上学,伙计们)。但是,由于不带引号的保留字可能是一个可能导致相同错误的常见问题,因此我将其留给未来的读者以防万一(https://meta.stackexchange.com/questions/37738/when-or-should-you-delete-your-incorrect-answer)。基本上是:

检查您的列名称。您可能有不带引号的保留字。

  

https://dev.mysql.com/doc/refman/5.5/en/keywords.html

原始回答:

您需要使用反引号引用列名。您的date字段是保留字。

$insertpost = $conn->prepare("INSERT INTO posts (`title`,`post`,`user`,`img`,`date`,`short`) VALUES(?,?,?,?,NOW(),?)");
  

https://dev.mysql.com/doc/refman/5.5/en/keywords.html

答案 1 :(得分:2)

在每个mysqliPDO函数可能会返回错误/失败状态后,您必须测试该可能性。

  

错误Fatal error: Call to a member function bind_param() on boolean说明了一切。 $insertpost是假的,因此准备失败有一些原因,可能是一个错误的查询,或者可能是MYSQL服务器崩溃了,无法准备语句。

所以你必须相应地编码

$insertpost = $conn->prepare("INSERT INTO posts 
                                    (title,post,user,img,date,short) 
                              VALUES(?,?,?,?,NOW(),?)");

if ( $insertpost === FALSE ) {
    // prepare failed for some reason, lets see why
    echo $conn->error;
    exit;
}
$insertpost->bind_param("sssss",$title,$comment,$user,$url,$short);