【问题标题】:PHP/MySQL: Why is my query only returning the first row?PHP/MySQL:为什么我的查询只返回第一行?
【发布时间】:2012-03-10 21:55:49
【问题描述】:

为什么我的方法只返回表的第一行?我不明白为什么,这让我发疯。我敢肯定这很简单。

public function getTitlesForRegistrationForm() {
    $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");
    $i=0;
    $array[0] = "No result";
    foreach($result->fetch(PDO::FETCH_ASSOC) as $row){
        $array[$i] = $row;
        $i++;
    }
    return $array;
}

谢谢。

【问题讨论】:

  • $result->fetch() 每次调用都会返回一行。你只调用一次……
  • 你在使用 PDO 库吗?我认为你应该使用 fetchAll() 而不是 fetch()
  • 您是否使用 phpMyAdmin 之类的工具运行查询以查看结果?您的查询可能只有一个结果。

标签: php mysql arrays methods


【解决方案1】:

这可能是因为您的$result->fetch() 调用没有返回可迭代值,而是返回结果行或FALSE。 PHP 的 foreach 仅适用于可迭代值。将您的代码更新为这样的东西应该可以解决问题:

public function getTitlesForRegistrationForm() {
    $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");
    $i=0;
    $array[0] = "No result";
    while (($row = $result->fetch(PDO::FETCH_ASSOC)) !== FALSE) {
        $array[$i] = $row;
        $i++;
    }
    return $array;
}

【讨论】:

    【解决方案2】:

    您需要在while 循环中使用fetch()。每次调用它只会返回一行。

    我还冒昧地重构了您的$i 计数器。相反,No result 被附加到数组的第一个位置(无论您打算使用它的什么目的),随后的行将附加到 []。

    public function getTitlesForRegistrationForm() {
        $array = array();
        $result = $this->_db->query("SELECT UserTitleID, UserTitleName FROM UserTitles");
    
        // Why are you putting No Result onto the array?
        // I've left it in, but it doesn't make sense to me.
        $array[] = "No result";
        while ($row = $result->fetch(PDO::FETCH_ASSOC)){
            $array[] = $row;
        }
        return $array;
    }
    

    【讨论】:

    • @DjangoReinhardt 我明白你为什么要将结果集累积到一个数组中,我不明白你为什么要在开头添加“无结果”。
    • 啊,我明白了。错误处理,所以我可以看到某些东西不起作用。可能不是最好的方法。没有必要,所以你的答案实际上是最好的(也是第一个)。谢谢!
    【解决方案3】:

    这是因为您使用的是fetch()。你需要fetchall()。

    http://www.php.net/manual/en/pdostatement.fetchall.php

    [编辑]哇。我需要学会更快地打字。

    【讨论】:

    • 你说得对,这确实奏效了……有点。我在数组中遇到了一些废话。
    【解决方案4】:

    试试:

    while($row = $result->fetch(PDO::FETCH_ASSOC)){
        foo();
    }
    

    【讨论】:

      【解决方案5】:

      尝试使用 while 而不是 foreach。 Foreach 仅迭代返回的单行。 代码:

      while($row = fetch(PDO::FETCH_ASSOC)) {
        $array[$i] = $row;
        $i++;
      }
      

      【讨论】:

        【解决方案6】:

        只需将fetch 方法替换为fetchAll

        【讨论】:

        • 你说得对,这确实奏效了……有点。我在数组中遇到了一些废话。
        猜你喜欢
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多