PHP:PDO fetch() 不显示结果
Posted
技术标签:
【中文标题】PHP:PDO fetch() 不显示结果【英文标题】:PHP : PDO fetch() not showing result 【发布时间】:2017-02-05 11:08:52 【问题描述】:我现在正在学习 PDO,我刚刚按照 Youtube 上的教程进行操作。所以在这里我有一个来自 Db 类的方法,我添加了一个新行 PDO::FETCH_ASSOC 因为我想尝试除 foreach 之外的 while 循环。
public function query($sql, $params = array())
$this->_error = false;
$this->_count = 0;
if($this->_query = $this->_pdo->prepare($sql))
#check if theres a parameter and bindvalue to sql statement
if(count($params))
$x = 1;
foreach($params as $param)
$this->_query->bindValue($x, $param);
$x++;
#execute with or without parameter
if($this->_query->execute())
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC);
$this->_count = $this->_query->rowCount();
else
$this->_error = true;
return $this;
#end of GET function
public function whileFetch()
return $this->_whileFetch;
foreach 运行良好,但我想尝试一个 while 循环,但它似乎不起作用,没有显示任何数据。
$query = $db->query("SELECT * from master_data.store");
while($row = $query->whileFetch())
echo $row['name'];
我也试过这个,但我得到了错误。
while($row = $query->fetch(PDO::FETCH_ASSOC))
echo $row['name'];
【问题讨论】:
【参考方案1】:问题是因为这个方法调用->fetchAll(PDO::FETCH_OBJ)
。由于您从结果集中获取所有行作为数组并将其分配给实例变量$results
,因此此语句$this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC);
之后将不起作用。这就是为什么您将拥有$this->_whileFetch
作为false
。
所以解决办法是,
从你的类中删除实例变量$_whileFetch
,你就不需要这个了。
从此if($this->_query->execute()) ...
块中删除以下两行,
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC);
在whileFetch()
方法中,直接从结果集中取出下一行并返回,而不是$this->_whileFetch
,
return $this->_query->fetch(PDO::FETCH_ASSOC);
所以你的query()
和whileFetch()
方法是这样的:
public function query($sql, $params = array())
$this->_error = false;
$this->_count = 0;
if($this->_query = $this->_pdo->prepare($sql))
#check if theres a parameter and bindvalue to sql statement
if(count($params))
$x = 1;
foreach($params as $param)
$this->_query->bindValue($x, $param);
$x++;
#execute with or without parameter
if($this->_query->execute())
$this->_count = $this->_query->rowCount();
else
$this->_error = true;
return $this;
public function whileFetch()
return $this->_query->fetch(PDO::FETCH_ASSOC);
稍后,您可以像这样进行查询和while()
循环:
$query = $db->query("SELECT * from master_data.store");
while($row = $query->whileFetch())
echo $row['name'];
【讨论】:
谢谢,我做到了,但我只能在每个 while 循环或 foreach 中调用一次,并且下一个循环不再工作 @RaffyTLawrence 是的,那是因为一旦您使用while
循环完成了对结果集的迭代,结果集将被耗尽。您无法调整结果指针以再次指向结果集的开头。所以使用while
或foreach
循环遍历结果集。
@RaffyTLawrence 话虽如此,如果您想再次循环遍历结果集,则需要将 PDO 光标设置为CURSOR_SCROLL
。默认情况下,它设置为CURSOR_FWDONLY
。看看这个 SO 线程,accepted 答案:http://***.com/q/15637291/5517143【参考方案2】:
这是一个糟糕的教程,因此您的课程有一些严重的缺点。你的函数应该是这样的
public function query($sql, $params = array())
$stmt = $this->_pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
因此,您将能够使用 PDO 支持的任何方法:
$query = $db->query("SELECT * from master_data.store");
foreach($query as $row)
echo $row['name'];
$query = $db->query("SELECT * from master_data.store");
while($row = $query->fetch())
echo $row['name'];
$list = $db->query("SELECT name from store")->fetchAll(PDO::FETCH_COLUMN);
foreach($list as $name)
echo $name;
请记住,与您的不同,此函数可以与任何查询一起使用,返回任何类型的结果,具有更好的错误报告和许多其他好处。
我写了一篇文章,解释了您的 Db 类的所有缺点,Your first database wrapper's childhood diseases,这绝对值得一读。欢迎您提出任何问题。
【讨论】:
以上是关于PHP:PDO fetch() 不显示结果的主要内容,如果未能解决你的问题,请参考以下文章