2014-01-20 71 views
0

我有一个php脚本应该连接到数据库,检查是否存在给定字段的行,如果存在,更新另一个字段同一行。但是,UPDATE查询似乎失败了,我看不出为什么。我试图谷歌的问题,但无法找到一个工作解决方案。我试图echo($mysqli->error),但它给了我一个空字符串。PHP错误:调用一个非对象的成员函数bind_param()

下面的代码:

<?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两个查询?

+1

那么如果'$ stmt'不是一个对象,如错误消息所证明的那么分配失败,这意味着'prepare( )'方法无法准备语句。您应该尝试在交互式会话中将该语句用于数据库服务器,很可能会引发错误。 – arkascha

+0

@arkascha我试图通过phpmyadmin手动插入查询,因为'UPDATE登录SET密码=“测试”WHERE piva =“some_existing_value”'它的工作方式就像一个魅力。这就是为什么这让我疯狂! – LorDisturbia

+0

使用try catch来准备和绑定 –

回答

-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"; 
} 
?> 

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

相关问题