web-dev-qa-db-ja.com

$ stmt-> close()vs $ stmt-> free_result()

準備されたmysqliステートメントを完成させるときに$ stmt-> close()$ stmt-> free_result()の違いを明確にしようとしています。


これまでのところ私は使用します:

$mysqli = new mysqli(Host,user,password,database);
$stmt = $mysqli->prepare(sql statement);
[...]
$stmt->free_result();
$mysqli->close();

そして、すべてが正常に機能しているようです。

しかし、多くのプログラマーが$ stmt-> free_result()の代わりに$ stmt-> closeを使用しているのを見てきました。そして、私がそれらの両方を見たら:

$stmt->free_result();
$stmt->close();
$mysqli->close();

では、どのような状況で、なぜ、何を選ぶべきでしょうか?

21

$stmt->free_result()は結果セットに関連するメモリを解放しますが、$stmt->close()はプリペアドステートメントに関連するメモリを解放します。その後、$stmt->close()を呼び出すと、まだ残っている結果がキャンセルされます。

本質的に、$stmt->close()を呼び出すと、結果セットもキャンセルされるため、$stmt->free_result()を呼び出すのと同じ効果が得られます。ただし、$stmt->free_result()を呼び出しても、プリペアドステートメントで使用されているメモリはクリアされません。その場合は、$stmt->close()を使用する必要があります。

どちらを使用するかについては、初期化したプリペアドステートメントを使用するつもりであるが、現在の結果セットは不要になった場合があります。このような場合、プリペアドステートメントが完了するまで$stmt->close()の呼び出しを待ち、代わりに$stmt->free_result()を呼び出してから別のステートメントを実行します。

29
Crackertastic

PHPは接続を終了し、実行が終了するとリソースを解放します。

mysqli :: closeプリペアドステートメントを閉じます。

使用可能な接続の総数は限られているため、リソースを解放してから2番目にリソースを解放することをお勧めします。

そして

mysqli_stmt :: free_result指定されたステートメントハンドルの保存された結果メモリを解放します。

リソースが不要になったときに、リソースを明示的に解放することをお勧めします。同時に多くのリクエストが行われる場合、サーバーに大きな負荷がかかるのを防ぐことができます。

両方を呼び出す必要はありません。両方を使用することをお勧めします。

2
Emilio Gort