【问题标题】:Display Results from PDO显示 PDO 的结果
【发布时间】:2017-02-08 20:52:25
【问题描述】:

这可能是一个绝对的菜鸟问题,因为我是 PDO 的新手,所以我无法真正理解发布的其他解决方案。 我要做的就是在数据库类中显示 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 数组填充了获取数据的结果,计数结果为 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();
    }
}

【问题讨论】:

  • 这是什么:print_r($rows); 输出?
  • 你的database 类真的没有比纯粹的PDO 添加任何有价值的东西。实际上,您完全不必要地执行了两次查询,因为您编写的database 类阻止您使用相同的查询获取行数和数据。摆脱它,直接使用PDO
  • print_r 提供了类似Array ( [0] => Array ( [fruitid] => 1 [0] => 1 [fruitName] => apple [1] => apple [colour] => green [2] => green 的内容。我可以看到代码效率低下,谢谢。我实际上只是添加了 count 方法,以便我可以仔细检查我得到了正确的数据。

标签: php sql oop pdo


【解决方案1】:
  1. 您的数据库类没有意义。因为它根本没有使用准备好的语句,而且它会让你无缘无故地运行相同的查询两次。
  2. PDO 中的默认获取模式是FETCH_BOTH,它不会给你一个对象。
  3. PHP 中的类属性不带引号。

所以这样编写你的代码

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,你可能会觉得值得一读。

【讨论】:

  • 谢谢,我稍后再做一些。我可以问一下$data = NULL 这行意味着$data 默认为NULL 但我可以包含一组参数吗?
  • @DavidJohn 是的,完全正确。没有占位符时可以省略它,如果查询中有占位符,则可以发送带参数的数组。很方便。
【解决方案2】:

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

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

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

希望这会有所帮助!

【讨论】:

  • 是的!就是这样,不是$fruit->'fruitName',我需要$fruit['fruitName']。老实说,我以为我已经尝试了所有可能的语法组合!谢谢
  • 不客气,如果您正在寻找问题,请不要犹豫,将您的问题标记为已解决。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多