【问题标题】:Random selection from mysql database with php on wamp使用 wamp 上的 php 从 mysql 数据库中随机选择
【发布时间】:2018-01-12 09:10:36
【问题描述】:

我正在尝试制作一种反击案开场白。我的问题是,我怀疑原因是 wamp,它不会加载,或者它需要很长时间以至于我无法得到任何结果。我阅读了所有关于使用 mysqli 从数据库中选择随机项目的帖子,它真的很慢并且不适合使用,但我认为它不会这么慢。所以我真的想知道这是否真的是导致问题的原因,或者我是否遗漏了一个完全不同的错误。在此先感谢:)

if(isset($_GET['iid'])) {

    $iid = rString($_GET['iid']);

    $checkOwnerQuery = $data->query('SELECT * FROM inventory WHERE id = "'.$iid.'" AND ownerId = "'.$id.'"');
    $checkOwner = $checkOwnerQuery->num_rows;
    if ($checkOwner == 1) {
        // OWNER CONFIRMED, CONTINUE OPENING
        $randomNmbr = mt_rand(1, 100);
        if($randomNmbr == 1) {
            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "1" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];

            }
            echo $rewardName;

        } else if($randomNmbr >= 97) {

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "97" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];

            }
            echo $rewardName;

        } else if($randomNmbr >= 95) {

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "95" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];
            }
            echo $rewardName;

        } else if($randomNmbr >= 90) {

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "90" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];
            }
            echo $rewardName;

        } else if($randomNmbr >= 80) {

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "80" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];
            }
            echo $rewardName;

        } else if($randomNmbr >= 60) {

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "60" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];
            }
            echo $rewardName;

        } else if($randomNmbr >= 50) {

            goto a;

        } else if($randomNmbr <= 50 && $randomNmbr != 1) {

a:

            while($row = $data->query('SELECT * FROM caserewards WHERE chance = "50" ORDER BY RAND() LIMIT 1')->fetch_assoc()) {

                $rewardId = $row['id'];
                $rewardName = $row['name'];
                $rewardLore = $row['lore'];
                $rewardType = $row['type'];
                $rewardAmount = $row['amount'];
                $rewardChance = $row['chance'];
                $rewardColor = $row['color'];
                $rewardImg = $row['img'];
                $rewardActive = $row['active'];
            }
            echo $rewardName;

        } else {
            echo 'Major danger';
        }
        echo '<div class="item_img_center" style="background-image: url()"></div>';

    } else {
        header('Location: inventory.php');
    }
} else {
    header('Location: inventory.php');
}

【问题讨论】:

  • 一些合理的代码缩进是个好主意。它可以帮助我们阅读代码,更重要的是,它将帮助 您调试代码 Take a quick look at a coding standard 为您自己谋福利。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 这真的是一个 GOTO 我看到隐藏在那个代码中。至少 20 年没见过其中之一
  • 无限循环确实有运行需要很长时间的习惯,您是否查看了 PHP 错误日志,以了解为什么该脚本运行了这么长时间。我希望在那里看到max_execution_time 超出错误!或者你只是把它关掉了?
  • @RiggsFolly 实际上我不知道错误日志存储在 wamp 的什么位置,我非常感谢您的反馈和建议。我以前从未使用过 goto,但我认为它会为我节省一些空间。
  • 错误日志可以在C:\wamp\logs中找到

标签: php mysql sql wamp local


【解决方案1】:

我认为您不希望 while 围绕您的随机查询循环,因为每次返回结果时都会继续重新运行查询(即永远,因为除非 caserewards 是完全是空的)。

尝试使用:

$row = $data->query('SELECT * FROM caserewards WHERE chance = "50" ORDER BY RAND() LIMIT 1')->fetch_assoc();

$rewardId = $row['id'];
$rewardName = $row['name'];
$rewardLore = $row['lore'];
$rewardType = $row['type'];
$rewardAmount = $row['amount'];
$rewardChance = $row['chance'];
$rewardColor = $row['color'];
$rewardImg = $row['img'];
$rewardActive = $row['active'];

对所有其他查询进行类似更新。

【讨论】:

  • 效果很好!非常感谢。没有意识到它是这样工作的。如果可以的话 +1 ;)
猜你喜欢
  • 2017-03-05
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2015-12-22
  • 2012-12-11
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多