【问题标题】:query inside while loop only shows 1 result在 while 循环内查询仅显示 1 个结果
【发布时间】:2015-07-09 02:56:16
【问题描述】:

我正在 php 中创建一个 while 循环,一切顺利,但问题是 我不仅想获取用户的 id,还想获取另一个表中的其他一些东西,所以当我继续在这个 while 循环中进行查询并从第二个表中选择所有内容时(其中 id 相等到第一个查询结果的 id),它只返回 1 个结果...

这是我目前拥有的代码:

public function getFriends($id)
{
global $params;

$get = $this->db->select("{$this->DB['data']['friends']['tbl']}", "*",
                          array(
                                "{$this->DB['data']['friends']['one']}" => $id
                          )
                        );

if($get)
{
    while($key = $get->fetch())
    {
        $query = $this->db->query("SELECT * FROM {$this->DB['data']['users']['tbl']}
                                   WHERE {$this->DB['data']['users']['id']} = :id",
                                   array(
                                         "id" => $key->{$this->DB['data']['friends']['two']}
                                   )
                                 );

        while($row = $query->fetch())
        {
            $params["user_friends"][] = [
                "id"   => $key->{$this->DB['data']['friends']['two']},
                "name" => $row->{$this->DB['data']['users']['username']},
                "look" => $row->{$this->DB['data']['users']['figure']}
            ];
        }
    }
}
else
{
    $params["update_error"] = $params["lang_no_friends"];
}
}

提前致谢! 请帮帮我!

【问题讨论】:

  • 您是否可以使用您在外部查询上使用的任何内容执行 fetchAll() 以查看是否预先检索所有记录可以解决问题...有时是内部查询(通过相同的连接) 如果前一个查询是逐行而不是一次全部获取,则将覆盖前一个查询。
  • 不,我无法执行 fetchAll(),还有其他提示吗?
  • 如果 Kevin 所说的查询干扰是一个因素,您可以遍历第一个结果集,将其值存储在本地;然后遍历本地数组。

标签: php mysql sql loops while-loop


【解决方案1】:

在没有答案的情况下,我不知道您在幕后使用的是什么数据库框架...PDO、mysqli_ 或(希望不是)mysql_。但是,无论如何,问题可能是您的第二个查询阻止第一个查询继续。我会使用 PDO->fetchAll() 将它们全部获取...但是您说您不能这样做...所以,循环第一个并将这些结果加载到数组中是我要做的第一件事,看看是否这就是问题所在:

public function getFriends($id)
{
    global $params;

    $get = $this->db->select("{$this->DB['data']['friends']['tbl']}", "*",
                              array(
                                    "{$this->DB['data']['friends']['one']}" => $id
                              )
                            );

    $firstResults = array();
    if( $get ) {
        while( $key = $get->fetch() ) {
            $firstResults[] = $key;
        }
    }
    else
    {
        $params["update_error"] = $params["lang_no_friends"];
    }

    foreach( $firstResults AS $key )
    {
        $query = $this->db->query("SELECT * FROM {$this->DB['data']['users']['tbl']}
                                   WHERE {$this->DB['data']['users']['id']} = :id",
                                   array(
                                         "id" => $key->{$this->DB['data']['friends']['two']}
                                   )
                                 );

        while($row = $query->fetch())
        {
            $params["user_friends"][] = [
                "id"   => $key->{$this->DB['data']['friends']['two']},
                "name" => $row->{$this->DB['data']['users']['username']},
                "look" => $row->{$this->DB['data']['users']['figure']}
            ];
        }
    }
}

如果这不起作用,那么我们需要更多数据...例如生成的查询是什么?当您手动运行它时,它会返回多个结果吗?如果你摆脱了内部查询,这能解决它吗?等等

【讨论】:

    【解决方案2】:

    诊断 PHP 和 Mysql 问题的第一步是在代码中添加行,告诉您每行在做什么(每次进入循环时声明;运行每个 mysql 查询时,吐出查询字符串)所以你可以缩小问题所在。这常常让你回想起来觉得很愚蠢:“呃,这个查询没有返回任何东西,因为我的记录 ID 格式错误”等等。

    您在上面提供的代码 sn-p 对我没有太大帮助。我是一名疑难解答者(不是解析器),所以我需要诊断数据(不是直接代码)来提供更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多