重用变量需要free_result

时间:2016-09-02 15:25:52

标签: php

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();真的需要吗? 我认为当我重用变量sel时,它们是不必要的。

你同意我的意见吗?

1 个答案:

答案 0 :(得分:0)

关于此事的PHP documentation

  

您应该始终使用mysqli_free_result()释放您的结果   不再需要你的结果对象了。

查看该页面的评论部分给出了原因:

  

如果您收到此错误:内部SQL错误:2014,命令输出   同步;你现在不能运行这个命令

     

然后你从未调用过mysqli_result :: free(),   mysqli_result :: free_result(),mysqli_result :: close(),或   脚本中的mysqli_free_result(),必须在执行前调用它   另一个存储过程。

基本上,您不需要这样做,但可能会出现奇怪的情况,您无法执行其他程序,并且命令可能不同步。

另一个可能来自不做的问题是结果可能会占用大量内存,所以如果你在需要内存的查询之间放入新代码,那么你可能遇到脚本崩溃的问题无法分配更多内存。通过释放结果,您需要在查询执行之间进行更改,以帮助减少发生这种情况的可能性。

在极端情况下,如果您在系统的另一部分中发现了可以读取其他内存地址的错误,并且其中一个查询中存储了敏感信息,那么通过不释放结果,您可以&# 39;可能让攻击者有机会从内存中读取敏感信息。

在有问题的情况下,其他情况一定会受到影响,但这两种情况都会浮现在脑海中。

简而言之,最好放弃结果,不要在不需要的情况下将信息记录在内存中。