使用fetch(PDO :: FETCH_ASSOC)

时间:2017-11-04 04:33:19

标签: php arrays class object fetch

我是一个带有viewData()方法的类,它从数据库表中提取数据。 我想在Class中返回数据结果数组并在Object中迭代数组 我能够使用fetchAll(),但无法弄清楚如何使用while循环使用fetch()返回结果。

<?php
   class CrudClass{

        private $db;        
        function __construct($DB_con){
            $this->db = $DB_con;
        }

        /* DATA VIEW METHOD */     
        public function viewData(){
            $sql = "SELECT * FROM tbl_users";
            $stmt = $this->db->prepare($sql);
            $stmt->execute();

            while($row=$stmt->fetch(PDO::FETCH_ASSOC))  {
                return $row; // it doesn't work         
            }           

            // below code is working
            /*if($stmt->rowCount()>0){
                $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
                return $result;
             }*/

        }           
    }

    // instantiate an Object
    $obj = new CrudClass($DB_con);
    $rows = $obj->viewData();
    foreach($rows as $row) {
     echo $row['first_name']. " ". $row['last_name'] ."<br>";
    }
?>  

我想这样做的原因,因为我不想一次性使用fetchAll提取数据。而是希望一次遍历每一行。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

你应该返回数组。

$result = []; // initiate the array
while($row=$stmt->fetch(PDO::FETCH_ASSOC))  {
    return $result[] = $row; // put each row in the result array
} 

return $result; // return the result array

现在整个方法看起来像下面的

/* DATA VIEW METHOD */     
public function viewData() {

    $sql = "SELECT * FROM tbl_users";
    $stmt = $this->db->prepare($sql);
    $stmt->execute();

    $result = []; // initiate the array
    while($row=$stmt->fetch(PDO::FETCH_ASSOC))  {
        return $result[] = $row; // put each row in the result array
    } 

    return $result; // return the result array
}    

这样一来,您可以放心,即使没有结果集,也只会返回数组。

如果以上不起作用。尝试以下两种解决方案。

1.明确判断为假。

while(($row = $stmt->fetch(PDO::FETCH_ASSOC) !== false) {
    return $result[] = $row; // put each row in the result array
}

2.使用foreach

foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
     return $result[] = $row; // put each row in the result array
}

答案 1 :(得分:0)

可以返回您可以在foreach中使用的内容,而不必预先加载所有结果(即使用PDOStatement::fetchAll()),而无需返回PDOStatement本身-如果那样的话您正在尝试做。

由于PDOStatement实现了Traversable,因此您可以从IteratorIterator构造一个PDOStatement并将其返回。

class CrudClass
{
    public function viewData()
    {
        $sql = "SELECT * FROM tbl_users";
        $stmt = $this->db->prepare($sql);
        $stmt->execute();

        return new \IteratorIterator($stmt);
    }
}

// instantiate an Object
$obj = new CrudClass($DB_con);
$rows = $obj->viewData();

foreach($rows as $row) {
    echo $row['first_name']. " ". $row['last_name'] ."<br>";
}

请注意,如果您多次尝试遍历$rows,则会出错,因为PDOStatement的结果无法重新计算。