【问题标题】:PHP Looping through PDO query resultsPHP循环遍历PDO查询结果
【发布时间】:2015-05-09 18:55:13
【问题描述】:

我是 OOP 和 PDO 的新手。提前感谢您的帮助!

我在将我的 SQL 查询结果循环到页面时遇到问题。

这是我的 notes.inc.php

$note->tulosta_notet('notes');

在课堂上注意我有方法

public function tulosta_notet($table) {
        $sql ="SELECT * FROM " . $table . "";
        $result = $this->_db->query($sql);

        echo "<br />";
        print_r($result);

        foreach ($result as $row) {
            print $row["id"] . "-" . $row["note_text"] ."<br/>";
        }
    }

我通过print_r($result); 得到了正确的结果

所以查询是正确的,我只是无法将行打印到页面上。

这里是 print_r($result); 的输出

DB Object ( [_pdo:DB:private] => PDO Object ( )
 [_query:DB:private] => PDOStatement Object ( [queryString] => SELECT * FROM notes ) 
[_error:DB:private] => [_results:DB:private] => Array ( 
[0] => stdClass Object (
 [id] => 1 
[created] => 2015-03-08 13:50:43 [edited] => 2015-03-08 14:50:43 
[note_text] => hei hei moi moi hei hei hei [
user_id] => 1 ) 

[1] => stdClass Object ( 
[id] => 2 
[created] => 2015-03-08 14:23:55
 [edited] => 2015-03-08 15:23:55 
[note_text] => text text text text text text text text text text text text text text text text text text
 [user_id] => 1 ) 
) [_count:DB:private] => 2 )

我做错了什么?

我是否应该在 notes.inc.php 中进行循环,我应该从 tulosta_notet() 返回什么来让它工作? 谢谢

-E

这里是 var_dump($this->_db);exit;

object(DB)#3 (5) { 
["_pdo":"DB":private]=> object(PDO)#4 (0) { } 
["_query":"DB":private]=> object(PDOStatement)#9 (1) {
 ["queryString"]=> string(28) "SELECT * FROM notes" 
} 
["_error":"DB":private]=> bool(false)
 ["_results":"DB":private]=> array(2) { 
[0]=> object(stdClass)#5 (5) { 
["id"]=> string(1) "1" 
["created"]=> string(19) "2015-03-08 13:50:43" 
["edited"]=> string(19) "2015-03-08 14:50:43" 
["note_text"]=> string(27) "hei hei moi moi hei hei hei" 
["user_id"]=> string(1) "1" 
} 

[1]=> object(stdClass)#10 (5) {
 ["id"]=> string(1) "2" 
["created"]=> string(19) "2015-03-08 14:23:55" 
["edited"]=> string(19) "2015-03-08 15:23:55" 
["note_text"]=> string(90) "text text text text text text text text text text text text text text text text text text " ["user_id"]=> string(1) "1" 
} 
} ["_count":"DB":private]=> int(2) }

类 DB 中的 query()

 public function query($sql, $params = array()) {
        $this->_error = false;
        if($this->_query = $this->_pdo->prepare($sql)) {

            $x = 1;
            if(count($params)) {
                foreach($params as $param) {
                    // echo $param;
                    $this->_query->bindValue($x, $param);
                    $x++;
                    // echo $x."<br>";
                }
            }

            if($this->_query->execute()) {
                echo "Success";
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            } else {
                $this->_error = true;
            }
        }

        return $this;
    } 

【问题讨论】:

  • 什么是$this->_db?它是“PDO”类的对象还是某种包装器?
  • 您试图将 $results 作为数组循环,但它不是数组。它是一个包含 _query、_error 和 _results 参数的对象。执行查询后,您可能需要一些 fetch / fetchAll 调用。建议代码有点困难,因为您似乎没有使用本机 pdo 类,请查找您正在使用的任何 db 类的文档。
  • 将 var_dump 结果添加到原始消息中。 DB 是一个单独的类,我有查询()。我也会将它的内部添加到原始消息中

标签: php oop pdo foreach


【解决方案1】:

在您的“查询”方法中,您使用流畅的接口(返回$this 返回当前对象)。结果当你print_r()时,打印了一个对象。

修改您的查询方法或使用 fetch 函数,例如:

public function tulosta_notet($table) {   

    $sql = "SELECT * FROM " . $table;
    $stmt = $this->_db->prepare($sql);
    $res = $stmt->execute();

    for ($i = 0; $i < count($res); $i++) {
        print $res[$i]["id"] . "-" . $res[$i]["note_text"] ."<br/>";
    }
}

【讨论】:

  • 见查询();我在原始消息中添加的内容。我正在里面执行execute()和prepare()。 $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
  • 我看到了,不是你不使用这些命令,我​​想是你回显了整个对象。 return $this,在你的函数返回整个对象。这被称为“流畅的界面”。我无法检查您的代码,但如果您有错误,您必须以某种方式修改您的“查询”方法
  • 感谢 Nikos 的帮助。我实际上又做了两种方法来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2019-03-11
  • 2012-10-09
  • 2020-04-13
相关资源
最近更新 更多