如何使用PHP PDO从MySQL数据库解析对象数据? [英] How do I parse object data from MySQL database using PHP PDO?

查看:70
本文介绍了如何使用PHP PDO从MySQL数据库解析对象数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试从数据库返回对象数据时遇到问题.我遵循了本教程来构建数据库包装程序,并且一直在尝试扩展它的功能以满足我的需求.我的问题是,当我使用数据库类的"get"方法返回数据时,它还返回了PDO对象本身的实例.我想知道如何解析此数据,以便仅从数据库返回对象,而不从数据库对象本身返回对象.我希望最终能够为每个对象显示不同的数据库值.

I have run into an issue while trying to return object data from my database. I followed this tutorial to build a DB wrapper and have been trying to extend the functionality of it to suit my needs. My problem is that when I use the DB class "get" method to return data, it also returns an instance of the PDO object itself. I am wondering how I parse this data so that I only return objects from the database, and not the database object itself. I want to be able to display different database values for each object eventually.

这是我所有相关的代码:

Here is all of my relevant code:

class DB {

private static $_instance = null; //stores instance of database
private $_pdo, 
        $_query, 
        $_error = false, 
        $_results, 
        $_count = 0;


private function __construct() {
    try {
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'),  Config::get('mysql/password'));
    } catch(PDOException $e){
        die($e->getMessage());
    }
}


public static function getInstance() {
    if(!isset(self::$_instance)){
        self::$_instance = new DB();
    }
    return self::$_instance;
}

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) {
                $this->_query->bindValue($x, $param);
                $x++;
            }
        }
        if($this->_query->execute()) {
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count = $this->_query->rowCount();
        } else {
            $this->_error = true;
        }
    }
    return $this; 
}


public function action($action, $table, $where = array()) {
    if(count($where) === 3) {
        $operators = array('=', '>', '<', '>=', '<=');

        $field = $where[0];
        $operator = $where[1];
        $value = $where[2];

        if(in_array($operator, $operators)) {
            $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
            if(!$this->query($sql, array($value))->error()) {
                return $this;
            }
        }

    } return $this;

}

public function get($table, $where) {
    return $this->action('SELECT *', $table, $where);

}
}

class Schedule {

private $_db;
protected $_games = array();

public function __construct() {

    $this->_db = DB::getInstance();

}

public function listGames() {

    $data = $this->_db->get('games', array('id', '>', 0));
    var_dump($data);

    echo '<br>';

}
}

推荐答案

这些视频教程的问题在于他们的作者对此主题一无所知,与没有使用他们的精神排泄物相比,其结果令人担忧.完全没有.他们造成的损害是如此严重,以至于我什至不得不写一篇专门的文章来解释为什么所有这些无助的包装器"对于任何现实生活中的应用都是完全无法使用的,

The problem with these video tutorials is their authors who have no clue on the subject, making the result MUCH MUCH WORSE than if you weren't using their mental excrement at all. The damage they are inflicting is so bad that I even had to write a dedicated article that explains why all these helpless "wrappers" are totally unusable for the any real life application, Your first database wrapper's childhood diseases.

例如,从视频中获取此包装:

Take this wrapper from the video for instance:

  • 错误报告完全有缺陷
  • SELECT的无用功能.
  • 状态性
  • 受保护的PDO实例

因此,从本质上讲,您将无法从该包装器"中获取内容,甚至无法获得诸如插入ID之类的愚蠢东西.而且错误报告也无法帮助您解决问题.

So, in essence, you'll be unable to get from this "wrapper" even such a silly thing as Insert Id. And no error reporting could help you even to realize the problem.

在您的代码中,不要为节省自己输入SQL关键字而讨价还价.真傻SQL是一件很珍贵的事情,不要因为一些笨拙的快捷方式而放弃它.您也不应该将PDO减少到严重的无效状态,以免破坏其最出色的功能.

As of your code, just don't bargain for saving yourself typing an SQL keyword. It's silly. SQL is a precious thing, do not dismiss it in favor of some gibberish shortcuts. Neither you should diminish PDO to a state of a crippled invalid, trashing off its most brilliant features.

您的包装器应使所有PDO和SQL功能都可以访问,而不是丢弃它们.就这样:

Your wrapper should make all PDO and SQL features accessible instead of discarding them. So it goes:

class DB
{
    protected static $instance;
    protected $pdo;

    protected function __construct() {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_EMULATE_PREPARES   => FALSE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            $this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);

    }

    // a classical static method to make it universally available
    public static function instance()
    {
        if (self::$instance === null)
        {
            self::$instance = new self;
        }
        return self::$instance;
    }

    // a proxy to native PDO methods
    public function __call($method, $args)
    {
        return call_user_func_array(array($this->pdo, $method), $args);
    }

    // a helper function to run prepared statements smoothly
    public function run($sql, $args = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

这个包装器比视频包装器简单十倍,同时功能也十倍强大.

this wrapper is ten times simpler and at the same time ten times more powerful than that from the video.

现在是您的班级

class Schedule
{
    private $_db;

    public function __construct()
    {
        $this->_db = DB::instance();
    }

    public function listGames()
    {
        $data = $this->_db->query('SELECT * FROM games')->fetchAll();
        var_dump($data);
        echo '<br>';
    }
}

这里的秘密是PDO已经可以为您提供对象数据,而无需额外的一行代码.

The secret here is that PDO can already give you object data, with not a single extra line of coding.

尽管这个简单的示例并没有给人留下深刻的印象,但是这里的秘密是,当视频中的示例变得很困难时,该包装器还将为您提供其他任何示例.尝试考虑其他任何示例,我将向您展示该包装程序多么简单而强大.

Although this simple example is not very impressive, the secret here is that this wrapper will serve you for any other example as well, when that from the video will choke. Try to think of any other example and I will show you how simple yet powerful this wrapper is.

这篇关于如何使用PHP PDO从MySQL数据库解析对象数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆