8

私はmysqliのプリペアドステートメントについて調査していましたが、2つの質問があります。

読んでいると、プリペアドステートメントの実行順序は次のようになっていることがわかります。

$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()またはそれ以外?

うまくいけば、あなたの答えが私にもっとよく準備されたステートメントを理解させて、私が安全な何かを構築できるようになるでしょう...

ありがとう

4

1 に答える 1

5
  • $ stmt-> free_result()は、名前のとおり、結果に関連付けられたメモリを解放します。

  • $ stmt-> closeは、ステートメントハンドル(実際にはカーソル)を閉じ、結果セットをループできなくなります(再び)。

マニュアルには次のように記載されていますが、 「結果は常にmysqli_free_result()で解放する必要がありますが、結果オブジェクトが不要になった場合は」、一般的な方法ではfree_resultを使用せずにステートメントを閉じます。閉じられると、結果セットを使用したり、再利用したりすることはできなくなり、phpが停止すると、メモリはとにかく解放されます。

于 2012-09-20T08:15:22.583 に答える