Я провел некоторое исследование об использовании базы данных для моих данных. Тем не менее, я прочитал некоторые сообщения, в которых люди утверждают, что вы не должны использовать PDO для databasewrapper, потому что он уже один.
Это может быть так, но я по-прежнему убежден, что он имеет много преимуществ.
Пример:
<?php class Database { public $connection; private $host = ""; private $username = ""; private $password = ""; private $dbname = ""; public function __construct(){ $this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username,$this->password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public function insert($query, array $data){ $this->connection->prepare($query)->execute($data); return $this->connection->lastInsertId(); } public function update($query, array $data) { $stmt = $this->executeQuery($query,$data); return $stmt->rowCount(); } public function delete($query, array $data) { $stmt = $this->executeQuery($query,$data); return $stmt->rowCount(); } public function findOne($query, array $data = null){ $stmt = $this->executeQuery($query,$data); return $stmt->fetchObject(); } public function findMany($query, array $data = null){ $stmt = $this->executeQuery($query,$data); return($stmt->fetchAll(PDO::FETCH_OBJ)); } public function executeQuery($query,$data = null){ $stmt = $this->connection->prepare($query); $stmt->execute($data); return $stmt; } } ?>
Вместо постоянного повторения всех шагов для извлечения данных вы можете вызвать get () и передать запрос и некоторые необязательные параметры. Это намного эффективнее, чем каждый раз открывать соединение, выполнять 3 строки кода и закрывать его.
$db->get("select * from user where id = ?",array(1));
Говорят, что большинство попыток создания оболочки PDO действительно беспомощны и делают вещи хуже, чем с необработанным PDO.
Кроме того, помещения, на которых написано обертка, основаны на них, в основном неправильные.
Возьмем ваше:
Вы обрабатываете все свои данные в одном классе, а не распространяетесь через файлы своего веб-сайта.
Довольно неопределенное утверждение, без особого смысла. Разумеется, вы обрабатываете свои данные по всему приложению, но используете не raw PDO, а используете свой собственный класс.
Вы можете легко изменить свой класс с помощью другого databaseclass.
Но заблуждение. Вы не можете придерживаться двух вспомогательных методов – иногда вам нужно использовать необработанный экземпляр PDO.
Вам не нужно повторять свой код, просто вызовите код в databaseclass
это совершенно верно. Но это не так полезно, как с любым другим API.
При желании вы можете расширить класс, например, путем регистрации, статистических тестов
Это правильно – никаких возражений.
Это намного эффективнее, чем каждый раз открывать соединение, выполнять 3 строки кода и закрывать его.
это ложный. Никто не просит вас каждый раз открывать соединение, выполнять 3 строки кода и закрывать его. Даже с необработанным PDO-соединением открывается только один раз.
Однако ваша реализация довольно хороша. Он не добавляет слишком много к необработанному PSO (на самом деле, он сокращает повторения только одной строкой), но все же является разумным. Итак, я бы назвал этот подход довольно успешным.
Некоторые предложения:
«Overkill» субъективен. То для вас для вашего конкретного случая. Я не сомневаюсь, что вы заметили какую-либо разницу.
Есть некоторые возможные преимущества в том, чтобы делать что-то подобное. Например, вы можете встраивать профилирование запросов и ведение журнала приложений в класс. И, как вы указываете, у вас есть возможность структурировать запросы таким образом, чтобы вам было легче работать и поддерживать.
С другой стороны, код будет менее переносимым, если он полагается на ваш класс-оболочку. Вы не можете взять этот код и использовать его с кодом, который опирается на PDO. Вы можете обойти некоторые из этих ограничений, расширив класс PDO, а не создав для этого оболочку.