sql >> Databáze >  >> RDS >> Mysql

Jak mohu analyzovat data objektů z databáze MySQL pomocí PHP PDO?

Problémem těchto videonávodů jsou jejich autoři, kteří o tématu nemají ani páru, takže výsledek je MNOHEM HORŠÍ, než kdybyste jejich duševní výkaly vůbec nepoužívali. Škody, které způsobují, jsou tak hrozné, že jsem dokonce musel napsat samostatný článek, který vysvětluje, proč jsou všechny tyto bezmocné „obaly“ zcela nepoužitelné pro jakoukoli reálnou aplikaci, Vaše první dětská onemocnění obalu databáze .

Vezměte si například tento obal z videa:

  • Hlášení chyb je zcela chybné
  • Zbytečná funkce pro SELECTy.
  • Státnost
  • Chráněná instance PDO

Takže v podstatě nebudete schopni z tohoto "obalu" získat ani tak hloupou věc, jako je Insert Id. A žádné hlášení chyb vám nepomůže ani uvědomit si problém.

Od vašeho kódu prostě nesmlouvejte, že se ušetříte psaním klíčového slova SQL. Je to hloupé. SQL je vzácná věc, nezavrhujte ho ve prospěch nějakých nesmyslných zkratek. Ani byste neměli zmenšovat PDO do stavu zmrzačeného invalidy, který zahazuje jeho nejskvělejší vlastnosti.

Váš obal by měl zpřístupnit všechny funkce PDO a SQL namísto jejich zahození. Takže to jde:

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

tento obal je desetkrát jednodušší a zároveň desetkrát výkonnější než ten z videa.

A teď vaše třída

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

Tajemství je v tom, že PDO vám již může poskytnout objektová data bez jediného řádku kódování navíc.

I když tento jednoduchý příklad není příliš působivý, tajemstvím je, že tento obal vám poslouží i pro jakýkoli jiný příklad, kdy se to z videa bude dusit. Zkuste vymyslet jakýkoli jiný příklad a já vám ukážu, jak jednoduchý, ale výkonný tento obal je.




  1. PDO::bindParam ve smyčce foreach, všechny hodnoty jsou nastaveny jako stejné?

  2. Jak vložit čas JS do MySQL

  3. MYSQL Přidejte pracovní dny k dnešnímu dni

  4. Problém s vytvářením dotazu MySQL v Symfony obsahujícího JOIN a RAND()