我是一个带有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提取数据。而是希望一次遍历每一行。任何帮助将不胜感激。
答案 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的结果无法重新计算。