数据库更新时每行随机数重复,需实现每行不同随机值
解决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
相关产品推荐
相关产品推荐

