我现在正在学习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'];
}
答案 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->_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'];
}