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 循环完成了对结果集的迭代,结果集将被耗尽。您无法调整结果指针以再次指向结果集的开头。所以使用whileforeach 循环遍历结果集。 @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() 不显示结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 LIKE 进行 PDO 分页

PDO::FETCH_CLASSTYPE - 意外结果

我尝试获取时PDOException(PDO :: FETCH_ASSOC)[重复]

PHP PDO fetch() 详解

PHP PDO获取结果集

当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE