2012-01-04 3 views
0

내 스크립트에서 두 개의 쿼리를 실행 중입니다. room.php. 모두 MySQLi 준비된 문을 사용하여, 다음과 같이 자신의 코드는 다음과 같습니다 두 번째 쿼리입니다MySQLi가 진술 문을 준비하지 못했습니다.

Fatal error: Call to a member function bind_param() on a non-object in C:\wamp\www\room.php on line 24 

:

/* Get room name */ 
$stmt = $mysqli->prepare('SELECT name FROM `rooms` WHERE r_id=?'); 
$stmt->bind_param('i', $roomID); 
$stmt->execute(); 
$stmt->bind_result($roomName) 

/* Add this user to the room */ 
$stmt = $mysqli->prepare('INSERT INTO `room_users` (r_id, u_id) VALUES (?, ?)'); 
$stmt->bind_param('ii', $roomID, $_SESSION['userID']); 
$stmt->execute(); 

내가 스크립트를 실행하면,이 오류가 발생합니다. 스크립트에서 첫 번째 쿼리를 제거하면 모든 것이 정상적으로 실행됩니다. 마찬가지로 두 번째 쿼리를 제거합니다. 그래서 $stmt 객체를 재사용하기 때문에 문제가 있다고 생각하게됩니다. $stmt2을 사용하여 두 번째 쿼리를 시도하면 여전히 오류가 발생합니다.

모든 데이터베이스 테이블과 필드가 있으므로 쿼리에 문제가 없습니다.

답변

7

모든 mysqli 함수/메소드가 실패 할 수 있습니다.이 경우에는 false를 반환합니다. 나는. prepare()가 실패하면 $ stmt는 객체가 아니라 bool (false) 메소드를 호출 할 수 있습니다. 반환 값을 확인하고 오류 처리를 추가해야합니다 (예 :

$stmt = $mysqli->prepare('SELECT name FROM `rooms` WHERE r_id=?'); 
if (!$stmt) { 
    printf('errno: %d, error: %s', $mysqli->errno, $mysqli->error); 
    die; 
} 

$b = $stmt->bind_param('i', $roomID); 
if (!$b) { 
    printf('errno: %d, error: %s', $stmt->errno, $stmt->error); 
} 

$b = $stmt->execute(); 
if (!$b) { 
    and so on and on 

http://docs.php.net/mysqli-stmt.errno 등이 경우


/결과 여전히 이전 문에 대해 보류중인 결과 세트가있는 동안 당신은 아마 당신은 다른 문을 만들 수 없습니다 문제에 부딪쳤다.
http://docs.php.net/mysqli-stmt.close를 참조하십시오

Closes a prepared statement. mysqli_stmt_close() also deallocates the statement handle. If the current statement has pending or unread results, this function cancels them so that the next query can be executed.
+0

@ 빌을 : 당신은 절대적으로 정확했다, 당신의 편집 요청이 거부 된 이유를 모른다 .... – VolkerK

+2

는 두 번째 부분은 나를 위해 키 없었다. '$ mysqli-> prepare'는 false를 리턴했지만'$ mysqli-> error'는 비어있었습니다; 이전 문장에'$ stmt-> close'를 추가하여 이것을 수정했습니다. – Clamburger