导致PHP程序死循环的一个原因

最近自己在做两个开源的小项目:留言板项目、在线文件管理系统。


(一)做留言板项目时,在分页显示用户留言时出现死循环,出现死循环的代码如下:

require_once 'db.php'; //db.php 文件中定义了 display 函数

/*分页*/
require_once 'db.php';
$pageSize=2; //每页显示的数量
$count=num(); //数据表的总记录数
$pageCount=ceil($count/$pageSize); //总计多少页
$currentPage=empty($_GET['page'])?1:$_GET['page'];
if (($currentPage>$pageCount) ||(!is_numeric($currentPage))){
    $currentPage=$pageCount;
}

/*显示用户留言*/
$sql="select username,title,content from blogList limit ".($currentPage-1)*$pageSize.",".$pageSize;
$arr=display($sql);  // display 函数将查询的结果以关联数组的形式显示
while($arr){
	echo '<span class="usernameAndTime">
	&clubs;用户名:'.$arr['username'].' | 登录时间:'.date("Y/m/d-h:i:s").' | 标题:'.$arr['title'].'</span>';
	echo '<br/>';
	echo '<span class="content">'.$arr['content'].'<br/>';
	echo '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -';
	echo '<br/>';
	echo '</span>';
}

/*页码显示*/
for ($i=1; $i <= $pageCount; $i++) { 
    if ($i==$currentPage) {
        echo "<b>$i</b>  ";
    }else{
        echo "<a href='?page=$i'>$i</a>  ";
    }
    
}
死循环原因分析:

因为 dispaly() 输出的结果 $arr 为关联数组,所以 while($arr) 相当于 while(ture),代码将会一直循环下去,导致死循环。

我们的初衷是每一次都循环都执行 display() 的函数功能,而不是每一次都判断一个值不变的 $arr($arr的值始终是第一次 display() 的结果,后面没有变化)。

正确的 while() 语句应该是:

while( $arr=$result->fetch_assoc() ) {

.   .   .

}

———————————————————————————————————————————————————————————


(二)上面的问题,开始我并没有找到原因,暂且搁置,准备缓一缓再做。。。开始做另一个项目——在线文件管理系统,同样的问题再次出现了,代码如下:

/*遍历目录下的文件*/
$dir=opendir($path);
if ($dir) {
    $i=0;
    //读取目录下的文件
    $f=readdir($dir);
    while ($f !== false) {
        if ($f=='.' || $f=='..' || in_array($f,$fileList)) {
            continue;
        }
        //拼接完整的文件路径
        $file=trim($path,'/').'/'.$f;
	//目录文件序号自增1
        $i++;
	//表格显示目录下的文件信息
        echo "<tr align='center'>";
            echo "<td>$i</td>";
            echo "<td>$f</td>";
            echo "<td>".filetype($file)."</td>";
            echo "<td>".filesize($file)."</td>";
            echo "<td>".date('Y-m-d',filectime($file))."</td>";
            echo "<td>";
                echo "<a href='?action=del'>删除</a>";
                echo "    ";
                echo "<a href='?action=edit'>编辑</a>";
            echo "</td>";
        echo "</tr><br/>";
    }
    closedir($dir);
}

出现死循环的原因是一样一样的:while() 每次不是执行函数 readdir(),而是 while(真),所以 while() 死循环。

正确的 while() 语句应该是:

 while ( ($f=readdir($dir)) !== false ) {

.   .   .

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值