Проблемът с тези видео уроци е, че техните автори нямат представа по темата, правейки резултата МНОГО МНОГО ПО-ЛОШ, отколкото ако изобщо не използвате техните умствени екскременти. Щетите, които нанасят, са толкова големи, че дори трябваше да напиша специална статия, която обяснява защо всички тези безпомощни „обвивки“ са напълно неизползваеми за каквото и да е реално приложение, Детски болести на вашата първа обвивка на база данни .
Вземете например тази обвивка от видеоклипа:
- Отчитането на грешки е напълно погрешно
- Безполезна функция за 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 вече може да ви даде обектни данни, без нито един допълнителен ред кодиране.
Въпреки че този прост пример не е много впечатляващ, тайната тук е, че тази обвивка ще ви послужи и за всеки друг пример, когато този от видеото ще се задави. Опитайте се да измислите друг пример и ще ви покажа колко проста, но мощна е тази обвивка.