У меня возникла проблема при попытке вернуть данные объекта из моей базы данных. Я следил за этим учебным пособием, чтобы создать обертку DB и пытаюсь расширить ее функциональность в соответствии с моими потребностями. Моя проблема заключается в том, что когда я использую метод «get» класса DB для возврата данных, он также возвращает экземпляр самого объекта 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>'; } }
Проблема с этими видеоуроками – это их авторы, которые не имеют понятия об этом, делая результат MUCH MUCH WORSE, чем если бы вы вообще не использовали свои умственные экскременты. Ущерб, который они наносят, настолько плох, что мне даже пришлось написать специальную статью, в которой объясняется, почему все эти беспомощные «обертки» совершенно непригодны для любого реального приложения для жизни, ваших детских болезней , связанных с первой базой данных .
Возьмите эту обертку из видео, например:
Таким образом, по сути, вы не сможете получить от этой «обертки» даже такую глупую вещь, как 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 уже может предоставить вам объектные данные, а не одну дополнительную строку кодирования.
Хотя этот простой пример не очень впечатляет, секрет в том, что эта оболочка будет служить вам и для любого другого примера, когда это из видео задохнется. Попытайтесь придумать какой-либо другой пример, и я покажу вам, насколько проста, но мощная эта оболочка.