私は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か?
うまくいけば、あなたの答えは(...私は安全なものを構築することができますので、私はより良い準備された文を理解
おかげ
私は別のクエリを実行したいのですが?メモリを解放し、ステートメントハンドルを開いたままにしますか?またはステートメントハンドルを閉じて、$ stmt = $ conn-> stmt_init();で新しいハンドルを再オープンする必要がありますか。 ? – Marco
別のクエリを実行し、クローズとフリーでは何もしないでください。ステートメントに新しい結果を割り当てるとき、古いものは閉じられ、自動的にフリーになります。 – JvdBerg
私は基本的には、bind_param、execute、bind_resultを準備する必要があるので、より多くのクエリのためにokです。新しいクエリごとにstmt_initをデータベース接続と同じ1回だけする必要はありません。右? – Marco