显示PDO的结果

时间:2016-09-30 09:58:02

标签: php sql oop pdo

这可能是一个绝对的noob问题,因为我是PDO的新手,我无法真正理解发布的其他解决方案。 我要做的就是显示数据库calss中的fetchall返回的查询结果

我已经设置了一个索引页面,用于创建数据库类的实例并调用方法getData,该方法运行FetchAll并返回记录。

$db = new database($pdo);
$sql = 'SELECT * FROM fruit';
$rows = $db->getData($sql);
$count = $db->getCount($sql);
echo $count;
print_r($rows);
foreach($rows as $fruit){
        echo $fruit->'fruitName';
}

代码全部运行,$ rows数组填充了get数据的结果,count的结果为8,这是正确的,但我不能用foreach输出结果!

数据库类供参考:

class database
{
    function __construct($pdo)
    {
        $this->pdo = $pdo;
    }
    function getData($sql)
    {
        $query = $this->pdo->prepare($sql);
        $query->execute();
        return $query->fetchAll();
    }
    function getCount($sql)
    {
        $query = $this->pdo->prepare($sql);
        $query->execute();
        return $query->rowCount();
    }
}

2 个答案:

答案 0 :(得分:0)

如果您在尝试回复$fruit->'fruitName'时遇到任何错误,请尝试按数组访问它,例如$fruit['fruitName']。这就是PDO fetchAll()方法返回结果的方式。

但是,您也可以通过将PDO::FETCH_CLASS作为fetchAll()方法的第一个参数,并将类名称作为第二个参数来指定您想要一个对象数组。

见这里:http://php.net/manual/fr/pdostatement.fetchall.php

希望这有帮助!

答案 1 :(得分:0)

  1. 你的数据库类毫无意义。因为它根本没有使用预准备语句,因为它会让你无缘无故地运行两次相同的查询。
  2. PDO中的默认提取模式为FETCH_BOTH,不会为您提供对象。
  3. PHP中的类属性不带引号。
  4. 所以以这种方式编写代码

    class database
    {
        function __construct()
        {
            $host = '127.0.0.1';
            $db   = 'test';
            $user = 'root';
            $pass = '';
            $charset = 'utf8';
    
            $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
            $opt = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $this->pdo = new PDO($dsn, $user, $pass, $opt);
        }
        function query($sql, $data = NULL)
        {
            $query = $this->pdo->prepare($sql);
            $query->execute($data);
            return $query;
        }
    }
    
    $db = new database();
    $sql = 'SELECT * FROM fruit';
    $rows = $db->query($sql)->fetchAll();
    $count = count($rows);
    echo $count;
    print_r($rows);
    foreach($rows as $fruit){
            echo $fruit->fruitName;
    }
    

    最近我写了一篇文章Your first database wrapper's childhood diseases,您可能会觉得这篇文章值得一读。