2016-09-02 6 views
1
INCLUDE mysqli object 

-- 

$sel = $mysqli->query("select * from `items`"); 
while($res = $sel->fetch_assoc()) { 
$items[] = $res; 
} 
$sel->free_result(); 

$sel = $mysqli->query("select * from `sets`"); 
while($res = $sel->fetch_assoc()) { 
$sets[] = $res; 
} 
$sel->free_result(); 

$sel = $mysqli->query("select * from `parts`"); 
while($res = $sel->fetch_assoc()) { 
$parts[] = $res; 
} 
$sel->free_result(); 

-- 
DO OTHER STUFF 

$sel->free_result();を実行する最初の2回は本当に必要ですか? 変数selを再利用すると、それらは不要だと思います。再利用変数にfree_resultが必要です

私に同意しますか?問題のPHP documentationによると

+0

あなたの質問は次のとおりです:クエリ結果がメモリを消費し続けるか、またはクエリ結果が上書きされるかのように、メモリは本質的に連続する各クエリで「解放」されますか? –

+0

はい、それは私の質問です。 – sjors

+0

このリンクはお役に立ちます---> http://stackoverflow.com/questions/2502201/is-it-a-good-practice-to-use-mysql-free-resultresult –

答えて

0

:そのページのコメント欄を見ると

You should always free your result with mysqli_free_result() , when your result object is not needed anymore.

が理由与える:

If you are getting this error: Internal SQL Bug: 2014, Commands out of sync; you can't run this command now

Then you never called mysqli_result::free(), mysqli_result::free_result(), mysqli_result::close(), or mysqli_free_result() in your script, and must call it before executing another stored procedure.

を基本的に、あなたはそれをする必要はありません、あなたが他の手順を実行することができず、コマンドが同期しない可能性がある奇妙なインスタンスが存在する可能性があります。

もう1つの問題は、結果が多量のメモリを占有している可能性があるため、メモリを必要とするクエリの間に新しいコードを挿入すると、スクリプトがクラッシュする問題が発生する可能性があるより多くのメモリを割り当てることができません。結果を解放することで、クエリの実行を変更する必要がある場合に、このような可能性を減らすのに役立ちます。

極端なレベルでは、他のメモリアドレスを読み取ることができるシステムの別の部分にバグがあり、それらのクエリの1つに機密情報が格納されている場合、その結果を解放しないと潜在的に攻撃者に機密情報をメモリから読み取る機会が与えられます。

問題がある場合もありますが、その2つが気になる場合があります。

簡単に言えば、結果を解放し、必要がない場合には情報をメモリに保存しない方がよいでしょう。

関連する問題