簡體   English   中英

如何使用PHP PDO從MySQL數據庫解析對象數據?

[英]How do I parse object data from MySQL database using PHP PDO?

嘗試從數據庫返回對象數據時遇到問題。 我按照本教程來構建數據庫包裝器,並一直在嘗試擴展它的功能以滿足我的需求。 我的問題是,當我使用數據庫類的“ get”方法返回數據時,它還會返回PDO對象本身的實例。 我想知道如何解析此數據,以便僅從數據庫返回對象,而不從數據庫對象本身返回對象。 我希望最終能夠為每個對象顯示不同的數據庫值。

這是我所有相關的代碼:

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>';

}
}

這些視頻教程的問題在於他們的作者對此主題一無所知,與您根本不使用他們的精神排泄物相比,其結果令人擔憂。 他們造成的破壞是如此嚴重,以至於我什至不得不寫一篇專門的文章來解釋為什么所有這些無助的“包裝器”對於任何現實生活中的應用都是完全無法使用的,這是您的第一個數據庫包裝器的童年疾病

以視頻中的這個包裝為例:

  • 錯誤報告完全有缺陷
  • SELECT的無用函數。
  • 有狀態
  • 受保護的PDO實例

因此,從本質上講,您將無法從該“包裝器”中獲取信息,即使是插入ID這樣的愚蠢的東西也是如此。 錯誤報告也無法幫助您解決問題。

在您的代碼中,不要討價還價以節省輸入SQL關鍵字的費用。 真傻 SQL是一件很珍貴的事情,不要因為一些笨拙的快捷方式而放棄它。 您也不應將PDO減少到嚴重的無效狀態,以免破壞其最出色的功能。

包裝程序應使所有PDO和SQL功能都可以訪問,而不是丟棄它們。 事情就這樣了:

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;
    }
}

這個包裝器比視頻包裝器簡單十倍,同時功能也十倍強大。

現在你的課

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已經可以為您提供對象數據,而無需單行編碼。

盡管這個簡單的示例並不令人印象深刻,但這里的秘密是,當視頻中的其他示例出現問題時,該包裝器也可以為您提供其他示例。 嘗試考慮其他任何示例,我將向您展示此包裝器多么簡單而強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM