Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para analisar dados de objetos do banco de dados MySQL usando PHP PDO?


O problema com esses tutoriais em vídeo são seus autores que não têm a menor ideia sobre o assunto, tornando o resultado MUITO PIOR do que se você não estivesse usando seus excrementos mentais. O dano que eles estão causando é tão ruim que eu até tive que escrever um artigo dedicado que explica por que todos esses "empacotadores" indefesos são totalmente inutilizáveis ​​para qualquer aplicativo da vida real, As doenças infantis do seu primeiro wrapper de banco de dados .

Tome este wrapper do vídeo, por exemplo:
  • O relatório de erros é completamente falho
  • Uma função inútil para SELECTs.
  • Status
  • Instância de PDO protegida

Portanto, em essência, você não conseguirá obter desse "wrapper" nem mesmo uma coisa boba como Insert Id. E nenhum relatório de erros poderia ajudá-lo a perceber o problema.

A partir do seu código, apenas não negocie para economizar digitando uma palavra-chave SQL. É bobo. SQL é uma coisa preciosa, não o descarte em favor de alguns atalhos sem sentido. Nem você deve diminuir o PDO a um estado de inválido aleijado, destruindo seus recursos mais brilhantes.

Seu wrapper deve tornar todos os recursos PDO e SQL acessíveis em vez de descartá-los. Assim vai:
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;
    }
}

este wrapper é dez vezes mais simples e ao mesmo tempo dez vezes mais poderoso que o do vídeo.

E agora sua classe
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>';
    }
}

O segredo aqui é que o PDO já pode fornecer dados de objetos, sem uma única linha extra de codificação.

Embora este exemplo simples não seja muito impressionante, o segredo aqui é que este wrapper também servirá para qualquer outro exemplo, quando o do vídeo for sufocante. Tente pensar em qualquer outro exemplo e mostrarei como esse wrapper é simples e poderoso.