You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库更新时每行随机数重复,需实现每行不同随机值

解决MySQL每行生成不同随机数组合的问题

原代码存在两个核心问题导致所有行被设置为相同随机值:

  • $num数组未在每次遍历行时重置,后续循环会不断往数组中追加元素,但始终使用前4个旧值
  • UPDATE语句的WHERE条件使用score='$targScore',会批量更新所有score为3的行,而非当前遍历的单行

以下是修复后的代码:

$sql = "SELECT * FROM players";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    $targScore = 3;
    while($row = $result->fetch_assoc()) {
        // 每次循环前重置数组,确保生成新的随机数组合
        $num = [];
        $target = 3; // 随机数总和目标
        $n = 4; // 生成的随机数个数
        
        while ($n) {
            if (1 < $n--) {
                $addend = rand(0, $target - ($n - 1));
                $target -= $addend;
                $num[] = $addend;
            } else {
                $num[] = $target;
            }
        }

        // 使用当前行的主键(假设主键为id)作为WHERE条件,仅更新当前行
        // 合并4个UPDATE为1个,提升数据库操作效率
        $updateSql = sprintf(
            "UPDATE players SET doja='%d', `7acres`='%d', tweed='%d', bickel='%d' WHERE id='%d'",
            $num[0],
            $num[1],
            $num[2],
            $num[3],
            $row['id']
        );
        $conn->query($updateSql);
    }
}

关键修改点说明:

  • 在每行循环开始时添加$num = [];,重置数组,确保每次生成全新的随机数组合
  • 将四个独立的UPDATE语句合并为一个,减少数据库交互次数,提升性能
  • 使用当前行的主键(如id)作为WHERE条件,确保仅更新当前遍历到的行,而非所有score匹配的行
  • 对列名7acres添加反引号`,避免因列名以数字开头导致的SQL语法错误

如果你的players表主键不是id,请将WHERE id='%d'替换为实际的主键字段(如player_id等)。

内容的提问来源于stack exchange,提问作者Jordan Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:35:35