【问题标题】:PHP Error: call to a member function bind_param() on a non-objectPHP 错误:在非对象上调用成员函数 bind_param()
【发布时间】:2014-01-20 13:31:58
【问题描述】:

我有一个 php 脚本,它应该连接到数据库,检查具有给定字段的行是否存在,如果存在,则更新同一行的另一个字段。但是,UPDATE 查询似乎失败了,我不明白为什么。我试图用谷歌搜索这个问题,但找不到有效的解决方案。我尝试echo($mysqli->error),但它给了我一个空字符串。

代码如下:

<?php
session_start();
include "../config.php";

if(isset($_GET['actionForgot']) && !empty($_GET['restore'])) {
    $piva=trim($_GET['restore']);
    $mysqli = new mysqlc();
    $stmt = $mysqli->prepare("SELECT username,email FROM login WHERE piva = ?");
    $stmt->bind_param("s", $piva);
    if (!$stmt->execute()) {
        trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
    }
    $stmt->bind_result($username, $email);
    if($stmt->fetch()) {
        $password = generatePassword(10);
        $crypPass = MD5($password);
        $stmt = $mysqli->prepare("UPDATE login SET password = ? WHERE piva = ?"); //Here's the error!
        if(!$stmt->bind_param("ss",$crypPass,$piva)){
            echo "fail";
        } else if (!$stmt->execute()) {
            trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
            echo "fail"; 
        } else {
            sendEmailRestore($username, $password, $email);  
            echo $email; 
        } 
    } else {
        echo "nexists";
    }
    $stmt->close();
}else{
    echo "false";
}
?>

附:我确定问题不在 config.php 中,因为其他类似的 php 脚本也可以正常工作。

编辑:这可能与我对两个查询使用相同的变量 $stmt 的事实有关吗?

【问题讨论】:

  • 好吧,如果$stmt 不是对象,正如错误消息所证明的那样,那么赋值失败,这意味着prepare() 方法无法准备语句。您应该尝试在与数据库服务器的交互式会话中使用该语句,它很可能会引发错误。
  • @arkascha 我尝试通过 phpmyadmin 手动插入查询,如UPDATE login SET password = "test" WHERE piva = "some_existing_value",它的工作原理就像一个魅力。这就是为什么这让我发疯!
  • 使用 try catch 进行准备和绑定
  • 顺便说一句:new mysqlc(); 是什么? $mysqli 到底是不是一个对象?
  • @Awlad Liton:这对我有什么帮助?该错误意味着整个脚本失败了:捕捉它没有意义。准备好的语句提供了更有效的错误处理方法,但仍然不应该发生这种情况......

标签: php mysql mysqli prepared-statement


【解决方案1】:

我发现了问题!它与 $mysqli 用于两个不同的查询有关。我不知道为什么这会带来任何问题,但我将代码更改为:

<?php
session_start();
include "../config.php";

if(isset($_GET['actionForgot']) && !empty($_GET['restore'])) {
    $piva=trim($_GET['restore']);
    $mysqli = new mysqlc();
    $stmt = $mysqli->prepare("SELECT username,email FROM login WHERE piva = ?");
    $stmt->bind_param("s", $piva);
    if (!$stmt->execute()) {
        trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
    }
    $stmt->bind_result($username, $email);
    if($stmt->fetch()) {
        $password = generatePassword(10);
        $crypPass = MD5($password);
        $mysqli2 = new mysqlc(); //NOTICE THIS LINE
        $stmt = $mysqli2->prepare("UPDATE login SET password = ? WHERE piva = ?"); //AND THIS
        if(!$stmt->bind_param("ss",$crypPass,$piva)){
            echo "fail";
        } else if (!$stmt->execute()) {
            trigger_error('The query execution failed; MySQL said ('.$stmt->errno.') '.$stmt->error, E_USER_ERROR);
            echo "fail"; 
        } else {
            sendEmailRestore($username, $password, $email);  
            echo $email; 
        } 
    } else {
        echo "nexists";
    }
    $stmt->close();
}else{
    echo "false";
}
?>

它工作得很好。 不过我还是想知道为什么我做错了……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多