PHP中如何强制重置循环以获取未重复的随机内容?
解决PHP中循环重置获取未浏览内容的问题
你的问题核心在于:当查到的句子ID已经被浏览过时,你直接break跳出了循环,但没有重新发起查询去获取新的随机句子,所以页面就没有输出内容了。我们需要调整逻辑,让程序持续查询直到找到未被浏览过的句子,同时还要处理所有句子都被浏览完的边界情况。
下面是修改后的完整代码,我会逐段解释:
<?php include 'connexionBDD.php'; session_start(); // 先初始化session数组,避免首次访问时报错 if (!isset($_SESSION['stockID'])) { $_SESSION['stockID'] = []; } // 获取所有"Fun"类型句子的总数,用于判断是否已经全部浏览 $countSql = "SELECT COUNT(*) FROM sentencesen WHERE type = 'Fun'"; $countResult = mysqli_query($conn, $countSql); $totalFunSentences = mysqli_fetch_row($countResult)[0]; // 如果所有句子都已经被浏览过,直接提示 if (count($_SESSION['stockID']) >= $totalFunSentences) { echo "你已经看完所有有趣的句子啦!点击刷新重新开始~"; exit; } // 循环查询,直到找到未被浏览过的句子 $found = false; while (!$found) { $sql = "SELECT * FROM sentencesen WHERE type = 'Fun' ORDER BY rand() LIMIT 1"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { $row = mysqli_fetch_assoc($result); $id = $row['id']; if (!in_array($id, $_SESSION['stockID'])) { // 找到未浏览的句子,输出并标记为已浏览 echo $row['type']; echo "<br>"; echo $row['phrases']; array_push($_SESSION['stockID'], $id); $found = true; // 跳出循环 } // 如果ID已存在,循环会自动重新查询,无需额外操作 } else { echo "There is a problem, could you refresh the page ?"; exit; } } ?>
关键修改点:
- 初始化Session数组:首次访问时
$_SESSION['stockID']可能不存在,先初始化避免in_array报错 - 总数判断:先检查是否已经浏览完所有"Fun"类型句子,给用户明确提示
- 循环查询逻辑:用一个
$found标记控制循环,只要没找到未浏览的句子,就一直重新执行SQL查询,直到找到为止 - 简化多余循环:原来的
while ($row = mysqli_fetch_assoc($result))其实没必要,因为LIMIT 1只会返回一条数据,直接取$row即可
这样修改后,当遇到已浏览的ID时,程序会自动重新查询,直到找到未浏览的句子,就不会出现页面空的情况了。
内容的提问来源于stack exchange,提问作者Maxime Brunet




