【问题标题】:PHP Fatal error: Call to a member function bind_param()PHP 致命错误:调用成员函数 bind_param()
【发布时间】:2015-11-05 22:09:17
【问题描述】:

我一直卡在这个错误上,请帮助我这是我的代码 PHP 致命错误:调用成员函数 bind_param()

$statement= $db->prepare("insert into uploaddetails(idnum,title,desc,author,tags,title) values(?,?,?,?,?,?)");


     $id='NULL';
    $title=$_POST['title'];
    $description=$_POST['description'];
     $author=$_POST['author'];
     $tags=$_POST['tags'];
     $file= basename($_FILES["fileToUpload"]["name"]);


    $statement->bind_param( 'isssss', $id,$title, $description,$author,$tags,$file);
    $statement->execute();

    $db->close();
    $statement->close();

【问题讨论】:

  • var_dump($statement); 的输出是什么? $dbmysqli 类的对象吗? $db->prepare 如果失败,将返回 FALSE。
  • 重复什么?我的 $id 是自动递增的。不可复制。
  • @mario.klump 输出为布尔假。这是什么意思?
  • 你有两次列title..?

标签: php fatal-error


【解决方案1】:

可能的错误

1) 表中的列数与您的查询不同。 2)虽然它在 bind_param 行中显示错误,但在准备语句行中可能会出现错误(在您的情况下为第 1 行) 3)您可以在这些行之前和之后放置 echo 语句并捕获错误 (在我的情况下,我在准备好的语句中重复了两次相同的字段名称)

根据您的要求获取以下代码并进行试用

$stmt = $conn->prepare("INSERT INTO SalesReturn(CRDNUMBER, CRDDATE, REFERENCE,CUSTOMER,ITEM,QTYRETURN,UNITPRICE,TIAMOUNT1,TIAMOUNT2,EXTCRDMISC,TAMOUNT1,TAMOUNT2,CRDSUBTOT,CRDNET,CRDETAXTOT,CRDNETNOTX,CRDNETWTX ,TransactionType) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); echo "准备后"; $stmt->bind_param("sssssssssssssssss",$CRDNUMBER,$CRDDATE,$REFERENCE,$CUSTOMER,$ITEM,$QTYRETURN,$UNITPRICE,$TIAMOUNT1,$TIAMOUNT2,$EXTCRDMISC,$TAMOUNT1,$TAMOUNT2,$CRDSUBTOT,$ CRDNET,$CRDETAXTOT,$CRDNETNOTX,$CRDNETWTX,$TransactionType); echo "在 bind_param 语句之后";

【讨论】:

    【解决方案2】:

    由于没有其他人发现此问题,我将其发布给您。你prepare() 失败的原因是你试图使用MySQL Reserved Worddesc 这个词是 MYSQL 中的保留字,这意味着你需要像这样将它包装在 backticks 中:

    $statement= $db->prepare("insert into uploaddetails(idnum,title,`desc`,author,tags,file) values(?,?,?,?,?,?)");
    

    在插入数据库/使用准备好的语句时使用正确的做法也有帮助。

    $statement= $db->prepare("insert into uploaddetails(idnum,title,`desc`,author,tags,title) values(?,?,?,?,?,?)");
    
    if($statement !== FALSE) {
        // do the binds...etc
    }
    

    注意事项

    file 也是保留字,我不知道您的实际文件列名称是什么,所以请记住这一点。

    【讨论】:

    • 这是合理的,我检查了 title 作为保留关键字但错过了 desc。很好的收获。
    • 干杯@KAD,我觉得desc 坐在那里看起来有点太舒服了。 :P
    • @Darren 我在这里通过谷歌搜索找到了类似错误的问答。 FILE 不是保留的,它只是一个关键字,每 dev.mysql.com/doc/refman/5.5/en/… - 注意它旁边没有 (R)
    【解决方案3】:
    • 试试这个。您的代码已修改。
    $statement= $db->prepare("INSERT INTO uploaddetails (title,desc,author,tags,file) VALUES(?,?,?,?,?)");
    
    
     //$id='NULL';
    $title=$_POST['title'];
    $description=$_POST['description'];
     $author=$_POST['author'];
     $tags=$_POST['tags'];
     $file= $_FILES["fileToUpload"]["name"];
    
    
    $statement->bind_param( 'isssss',$title, $description,$author,$tags,$file);
    $statement->execute();
    
    $db->close();
    $statement->close();
    

    //---- 将文件移动到所需位置...

    -ID 不是必需的,因为它是自动递增的,mysql 会处理它, - 并且您的文件字段名称错误,即标题,我将其更改为文件(如果您有任何其他名称,请更正它)。

    【讨论】:

    • prepare() 失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 1 行的 'desc,author,tags,filename) values(?,?,?,?,?)' 附近使用,OH MAN,仍然得到同样的错误,我将字段名文件更改为,文件名与我的数据库列名相同
    • 天哪,我使用“DESC”这个词作为列名,mysql 被解释为某种函数。谢谢各位。真的很大的帮助
    【解决方案4】:

    您的prepare语句因为查询而失败,您需要做的是确保该语句不为false才能执行bind_param,否则查看prepare查询错误如下:

    //Make sure the statement is not false
    if($statement !== FALSE)
    {
        $statement->bind_param( 'isssss', $id,$title, $description,$author,$tags,$file);
        $statement->execute();
    
        $db->close();
        $statement->close();
    }
    //Otherwise check why the prepare statement failed
    else
    {
        die('prepare() failed: ' . htmlspecialchars($db->error));
    
    }
    

    【讨论】:

    • prepare() 失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'desc,author,tags,title) values(?,?,?,?,?,?)' 附近使用正确的语法,,, 谢谢很有帮助,但我还是不明白。
    • 似乎@Darren 说您在查询中有两次标题,这可能是问题所在。在 mysqli 中编写查询之前在 phpMyAdmin 中测试您的查询并手动绑定参数以至少确保语法是一个好习惯。
    • 天哪,我使用“DESC”这个词作为列名,mysql 被解释为某种函数.. 谢谢大家.. 真的很感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2014-02-03
    • 2015-10-22
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多