如何将SQL中RAND()随机查询改为PHP的random_int()并修复代码?
我来帮你修正这段代码,同时拆解下你原来代码里的问题点,让它能正常实现用random_int()获取高可信度随机结果的需求:
修正后的完整代码
private function doPreEventStart($user) { // 获取符合条件的最小resultid $minRow = db_fetch_item("SELECT resultid FROM ResultPackage WHERE slotid LIKE '{$this->curSlotId}' AND PackageID LIKE '%{$user->packageid}%' ORDER BY resultid ASC LIMIT 1"); $this->MinResult = $minRow['resultid']; // 获取符合条件的最大resultid $maxRow = db_fetch_item("SELECT resultid FROM ResultPackage WHERE slotid LIKE '{$this->curSlotId}' AND PackageID LIKE '%{$user->packageid}%' ORDER BY resultid DESC LIMIT 1"); $this->MaxResult = $maxRow['resultid']; // 生成指定范围内的加密安全随机整数 $randomResultId = random_int($this->MinResult, $this->MaxResult); // 验证随机生成的id是否存在(避免resultid不连续的情况) $row = db_fetch_item("SELECT resultid FROM ResultPackage WHERE slotid LIKE '{$this->curSlotId}' AND PackageID LIKE '%{$user->packageid}%' AND resultid = {$randomResultId}"); // 如果随机id不存在,重新获取(递归/循环均可,这里用递归示例) if (!$row) { return $this->doPreEventStart($user); } $this->curResultId = $row['resultid']; // 修正字符串拼接后的调试输出 var_dump($randomResultId . ", SLOTID=" . $this->curSlotId); }
原代码的问题及修正说明
- 未正确引用类属性:你原代码里的
$slot_id是未定义的变量,应该使用类实例的$this->curSlotId,和第一段代码的条件保持一致,才能正确匹配目标slot的数据。 - 缺少最大值范围:
random_int()必须传入最小值和最大值两个参数,你只查询了最小的resultid,必须补充查询最大resultid才能生成有效的随机范围。 - 字符串拼接语法错误:PHP中字符串拼接要用
.而不是+,+是数值加法运算符,用它拼接字符串会导致类型错误,所以要换成.。 - 未处理非连续ID的情况:如果你的
resultid不是连续整数,直接生成的随机数可能不存在于数据库中,所以增加了验证查询,若不存在则重新生成随机数。 - 未完成最终赋值:补全了将有效随机
resultid赋值给$this->curResultId的逻辑,和你第一段代码的需求对齐。
内容的提问来源于stack exchange,提问作者technicaledge
相关产品推荐
相关产品推荐

