2012-09-20 13 views
7

私はmysqliプリペアドステートメントについて研究していましたが、2つの質問があります。私も、それを読んでいたとしてmysqli prepared statement、結果セットをループする方法

私が読んでいたように、私は、プリペアドステートメントの実行の順序は次のようになりますことを把握:

$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()を代わりに使うことができますか?

ここで私の他の質問です:

  • $ stmt-> free_resultは();正確に何が解放されますか? prepare()またはstore_result()またはそれ以外の場合は?
  • $ 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を準備する必要があるので、より多くのクエリのためにokです。新しいクエリごとにstmt_initをデータベース接続と同じ1回だけする必要はありません。右? – Marco

関連する問題