Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да анализирам обектни данни от MySQL база данни с помощта на PHP PDO?

Проблемът с тези видео уроци е, че техните автори нямат представа по темата, правейки резултата МНОГО МНОГО ПО-ЛОШ, отколкото ако изобщо не използвате техните умствени екскременти. Щетите, които нанасят, са толкова големи, че дори трябваше да напиша специална статия, която обяснява защо всички тези безпомощни „обвивки“ са напълно неизползваеми за каквото и да е реално приложение, Детски болести на вашата първа обвивка на база данни .

Вземете например тази обвивка от видеоклипа:

  • Отчитането на грешки е напълно погрешно
  • Безполезна функция за SELECT.
  • Състояние на държавата
  • Защитен екземпляр на PDO

Така че, по същество, няма да можете да получите от тази "обвивка" дори такова глупаво нещо като Insert 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 вече може да ви даде обектни данни, без нито един допълнителен ред кодиране.

Въпреки че този прост пример не е много впечатляващ, тайната тук е, че тази обвивка ще ви послужи и за всеки друг пример, когато този от видеото ще се задави. Опитайте се да измислите друг пример и ще ви покажа колко проста, но мощна е тази обвивка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP PDO bindParam за променлива/низ, използван за IN израз...?

  2. Кодиране на китайски символи на JSF вход

  3. Мога ли да накарам WHERE col LIKE '%' също да избира NULL стойности?

  4. Грешка в съвместимостта на доставчика на база данни на базата данни

  5. Как да завъртя? Как да конвертирате няколко реда в един ред с множество колони?