PHP错误:在非对象上调用成员函数bind_param()

时间:2014-01-20 13:31:59

标签: php mysql mysqli prepared-statement

我有一个应该连接到数据库的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";
}
?>

P.S。我确定问题不在config.php中,因为其他类似的PHP脚本工作正常。

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

1 个答案:

答案 0 :(得分:-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";
}
?>

它工作得很好。 我仍然想知道为什么我做错了,不过......