【问题标题】:PDO fetchAll not returning all rowsPDO fetchAll 不返回所有行
【发布时间】:2014-01-16 19:11:18
【问题描述】:

所以我试图从数据库中获取多个东西。它不工作。 在我的函数文件中,我有:

public function getAllMultiple($username, $course) {
        foreach ($course as $key) {
        $query = $this->database->db->prepare("SELECT * FROM `status` WHERE `posted_by` = ? OR `shared` = ? ORDER BY `date_added` DESC");
        $query->bindValue(1, $username);
        $query->bindValue(2, $key['1']);
        try {
            $query->execute();
        } catch (PDOException $e) {
            die($e->getMessage());
        }
            return $query->fetchAll();
        }
}

在我的提要功能中,我有:

$array = $course->getAllAsMember($username);
print_r($course->getAllMultiple($username, $array);

我有两门课程。我有一个药物课程和一个课程。不幸的是,它只返回药物课程。有什么我做错了吗?

【问题讨论】:

  • 您用每次迭代替换$query 的值,并且从不执​​行它。我很惊讶它的工作。如果上面不是您的实际代码,请更新它。
  • 您需要提供更多代码,没有fetchAll 并且您没有从您的函数中返回任何内容。您还应该在循环之前准备查询,因为您只需要这样做一次。
  • 刚刚更新了@jeroen
  • 你的函数失败了,因为它返回的那一刻,它停止了函数的执行并且永远不会到达第二个数组项。
  • 不提供所有代码是我的错。

标签: php arrays pdo fetch fetchall


【解决方案1】:

要扩展我的评论,您可以执行以下操作:

public function getAllMultiple($username, $course) {
    $query = $this->database->db->prepare("SELECT * FROM `status` WHERE `posted_by` = ? OR `shared` = ? ORDER BY `date_added` DESC");
    $results = array();
    foreach ($course as $key) {

        $query->bindValue(1, $username);
        $query->bindValue(2, $key['1']);
        try {
            $query->execute();
        } catch (PDOException $e) {
            die($e->getMessage());
        }
        results[] = $query->fetchAll();
     }
    return $results;
}

您还应该改进错误处理,例如将所有内容放在 try - catch 块中,而不仅仅是其中的一部分。

【讨论】:

  • 最好使用 IN() 或 JOIN 而不是一遍又一遍地运行查询。
  • @Jessica 是的,最好只查询一次,这里应该没问题;这只是为了解决OP当前遇到的问题,我还没有真正看过sql。
  • @user1475632 您应该采纳 Jessica 的建议,将查询数减少到 1,而不管结果数如何。
  • @Jessica 我会使用它,但不知道。抱歉,我只有 13 岁,对 php 还很陌生
  • 我明白了。我刚刚听取了您的建议并了解了加入。真的很酷的东西。谢谢@Jessica
【解决方案2】:

函数的返回位停止函数的执行并返回值。如果你想返回你执行的查询的两个结果,你需要将它们分配给一个数组,然后返回:

public function getAllMultiple($username, $course) {
    $return = array(); //initialize the array before the foreach function
    foreach ($course as $key) {
        $query = $this->database->db->prepare("SELECT * FROM `status` WHERE `posted_by` = ? OR `shared` = ? ORDER BY `date_added` DESC");
        $query->bindValue(1, $username);
        $query->bindValue(2, $key['1']);
        try {
            $query->execute();
        } catch (PDOException $e) {
            die($e->getMessage());
        }
        $return[] = $query->fetchAll(); //collect the results
    }
    return $return; //return the array
}

希望我的 cmets 是不言自明的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-02-02
  • 2020-05-04
  • 1970-01-01
  • 2013-04-21
  • 2014-05-01
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多