PHP:PDO fetch()没有显示结果

时间:2017-02-05 11:08:53

标签: php mysql pdo

我现在正在学习PDO我只是按照Youtube上的教程。所以这里我有一个来自Db类的方法,我添加了一个新行PDO :: FETCH_ASSOC因为我想尝试一个while循环除了foreach。

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'];
}

2 个答案:

答案 0 :(得分:1)

这是一个糟糕的教程,因此您的课程有一些严重的缺点。你的功能应该是这样的

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这绝对值得一读。欢迎您提出任何问题。

答案 1 :(得分:1)

问题是因为这个方法调用->fetchAll(PDO::FETCH_OBJ)。由于您将结果集中的所有行作为数组提取并将其分配给实例变量$results,因此此语句$this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC);将无效。这就是为什么你$this->_whileFetchfalse

所以解决方案是,

  • 从您的班级中删除实例变量$_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'];
}