You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动