2012-09-20 4 views
7

mysqli 준비 문에 대해 연구하고 있었고 그것에 대해 2 가지 질문이 있습니다.mysqli 준비 문, 결과 집합을 루프하는 방법

$sql = 'SELECT image_id, filename, caption FROM images WHERE image_id = ?'; 

// connect to the database 
$conn = .... 

$stmt = $conn->stmt_init(); 

$stmt->prepare($sql); 

$stmt->bind_param('i', $id); 

$stmt->execute(); 

$stmt->bind_result($image_id, $filename, $caption); 

// optional: get total of records in the result set 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 

// loop through the result set 
while ($stmt->fetch()) { 
    // code goes here... 
} 

or 

// fetch the result for one record 
$stmt->fetch() 

// free & close 
$stmt->free_result(); 
$stmt->close; 

$conn->close(); 

을 여기에 내 첫 번째 질문 : 내가 읽고 있던 것처럼

, 나는 준비된 명령문의 실행 순서는 다음과 같은 것이 같은 것을 보이는 것으로 파악

그것은 또한

내가 읽고 있던 것처럼,

결과를 변수에 바인드하지 않으면 $ row = $ stmt-> fetch()를 사용하고 각 변수에 $ row [ 'column_name']으로 액세스하십시오. 따라서

2 가지 방법 중 하나를 사용하여 결과 집합을 반복하는 장점/단점이 있습니까? 아무런 차이가 없다면 왜 처음에는 $ stmt-> bind_result를 사용하여 결과를 바인딩해야합니까? $ row = $ stmt-> fetch()를 대신 사용할 수 있다면 요점은 무엇입니까?

여기 내 다른 질문 :> free_result

  • $ stmt-(); 정확히 무엇을 해방 하는가? prepare() 또는 store_result() 또는 else?
  • $ stmt-> close; 내가 정확히 닫을 게 뭐야? stmt_init() 또는 prepare() 또는 else?

희망 답이

감사

답변

4
  • $ stmt- ... 난 안전 무언가를 구축 할 수 있도록 나를 더 잘 준비 문장을 이해하게됩니다> free_result()는 거의 어떤 이름 않습니다 말한다 : 결과와 관련된 메모리를 해제한다.

  • $ stmt-> close는 명령문 핸들 (실제로 커서)을 닫음으로써 결과 집합을 반복 할 수 없게 만듭니다. manual 상태이지만

은 '당신의 결과 개체가 더 이상 필요하지 않을 때 당신은 항상 mysqli_free_result하여 결과를() 해제해야', 일반적인 관행은 성명에서 free_result 닫기를 사용하지 않는 것입니다. 닫 혔을 때 더 이상 결과 집합을 사용하거나 다시 사용할 수 없으며 php가 죽으면 메모리가 해제됩니다.

+0

다른 쿼리를 실행하려면 어떻게해야합니까? 메모리를 비우고 문 핸들을 열어 두시겠습니까? 또는 필자는 명령문 핸들을 닫고 $ stmt = $ conn-> stmt_init(); 명령문 핸들을 사용하여 새 명령문을 다시 열어야합니다. ? – Marco

+2

그냥 다른 쿼리를 실행하고 닫고 무료로 아무것도하지 마십시오. 명령문에 새로운 결과를 할당하면 이전 명령문은 닫히고 자동으로 해제됩니다. – JvdBerg

+0

오케이 그래서 더 많은 쿼리를 위해 기본적으로 bind_param, execute, bind_result를 준비해야합니다. 새로운 쿼리마다 stmt_init을 데이터베이스 연결과 마찬가지로 한 번만 호출하면됩니다. 권리? – Marco