2014-01-20 1 views
0

데이터베이스에 연결해야하는 PHP 스크립트가 있으며, 주어진 필드가있는 행이 존재하는지 확인하고, 존재하는 경우 다른 필드를 업데이트하십시오. 같은 행. 그러나 UPDATE 쿼리가 실패한 것으로 보이며 그 이유를 알 수 없습니다. Google에 문제를 시도했지만 작동하는 해결책을 찾을 수 없습니다. 내가 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"; 
} 
?> 

추신 : 여기

코드입니다 다른 비슷한 PHP 스크립트가 잘 작동하기 때문에 문제는 config.php에 없다고 확신합니다.

편집 : 두 개의 쿼리에 동일한 변수 $stmt을 사용하고 있다는 사실과 관련이있을 수 있습니까?

+1

오류 메시지가 증명하는 것처럼'$ stmt'가 객체가 아니라면, 할당이 실패합니다. 즉,'prepare ()'메소드가 명령문을 준비하지 못합니다. 데이터베이스 서버에 대한 대화식 세션 내에서 해당 문을 사용하려고 시도해야합니다. 대부분 오류가 발생합니다. – arkascha

+0

@arkascha 필자는 수동으로 phpmyadmin을 통해 쿼리를 삽입하려고 시도했습니다. 'UPDATE login SET password = "test"WHERE piva = "some_existing_value"'그리고 그것은 charme처럼 작동했습니다. 그래서 이것이 나를 괴롭히는 이유입니다! – 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"; 
} 
?> 

그리고 잘 작동합니다. 아직도 내가 왜 잘못하고 있었는지 알고 싶습니다 ...

관련 문제