最近自己在做两个开源的小项目:留言板项目、在线文件管理系统。
(一)做留言板项目时,在分页显示用户留言时出现死循环,出现死循环的代码如下:
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">
♣用户名:'.$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 ) {
. . .
}