【问题标题】:PHP while returns same result repeatedlyPHP while 重复返回相同的结果
【发布时间】:2013-04-22 21:26:25
【问题描述】:

在我的本地 xampp 上运行 while 脚本时,它只会一遍又一遍地返回相同的结果,这是我正在使用的 PHP:

<?php
$id = $_GET['id'];
$getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
$getids = mysql_fetch_assoc($getmembers);
    while($id = $getids['userid']){
        $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
        echo ($getusers['username']);
        echo('<br />');
    }
?>

我执行时得到的结果是:http://prntscr.com/12nh6g 我的数据库包含 4 个注册到该组的不同用户。我不确定是否要在 MySQL 中加入表,因为我不知道该怎么做。

如果我添加一个休息;那么它只返回一个结果,而不是超时。

非常感谢任何帮助!

另外我很抱歉 PHP 的混乱程度,我是新手。

【问题讨论】:

    标签: php mysql database while-loop repeat


    【解决方案1】:
    while($id = $getids['userid']){ #This condition will always be true.
    

    在如下循环中使用您的 mysql_fetch_assoc 语句。

    while ($getids = mysql_fetch_assoc($getmembers)) {
        $id = $getids['userid']
        $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
        echo $getusers['username'];
        echo '<br />';
    }
    

    子查询可以试试,

    SELECT look, username FROM users
    WHERE id IN 
           (SELECT userId FROM group_memberships
            WHERE groupid = $id
            LIMIT 10)
    

    使用 JOIN

    SELECT u.look,u.username
    FROM users as u
    LEFT JOIN group_memberships as gm
         on gm.userId = u.id 
         WHERE gm.groupid = $id
         LIMIT 10 
    

    注意: Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解 prepared statements,并使用 PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

    【讨论】:

    • 很高兴为您提供帮助。请不要忘记点击左侧的复选标记来接受我的回答。
    【解决方案2】:
    <?php
    
    $id = (int) $_GET['id']; // very important part here, I cast the id to int, else you have a SQL injection leak
    $getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
    while ($membership = mysql_fetch_assoc($getmembers)) // on each pass we take a new result off first query
    {
        $user = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '".$membership['user_id']."'"));
        echo ($user['username']);
        echo('<br />');
    }
    ?>
    

    【讨论】:

    • 感谢 SQL 注入的帮助,非常感谢!
    • 如果使用 PDO 或 Mysqli INSTEAD 的 mysql_query_* - 函数查找安全使用参数。
    【解决方案3】:

    在您的代码中:

    <?php
    $id = $_GET['id'];
    $getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
    $getids = mysql_fetch_assoc($getmembers);
        while($id = $getids['userid']){
            $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
            echo ($getusers['username']);
            echo('<br />');
        }
    ?>
    

    告诉 PHP “执行循环”,而 $id 被分配给 $getids['userid'] 的值

    因此你将有一个无限循环,因为 $id 一直被分配(并且总是具有相同的值)$getids 在 while 循环内永远不会改变。

    但即使 $getids 即将更改,它仍然会处于无限循环中,因为循环不检查 $id 是否为 $getids['userid'] 的值,它只是分配值。

    【讨论】:

      【解决方案4】:
      <?php
      $id = $_GET['id'];
      $getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
      
          while($getids = mysql_fetch_assoc($getmembers)){
          $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
          echo ($getusers['username']);
          echo('<br />');
          }
      ?>
      

      你的 while 循环出错了,你需要在 while 循环中进行提取,所以它一直持续到提取停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-28
        • 2014-11-07
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多