2014-01-20 97 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"; 
} 
?> 

它工作得很好。 我仍然想知道爲什麼我做錯了,雖然...

相關問題