2013-12-18 2 views
13

Я провел некоторое исследование об использовании базы данных для моих данных. Однако я прочитал некоторые сообщения, в которых люди утверждают, что вы не должны использовать PDO для databasewrapper, потому что он уже один.Является ли обертка pdo действительно излишней?

Это может быть так, но я все еще убежден, что он имеет много преимуществ.

  1. Вы обрабатываете все свои действия с данными (crud) в одном классе, не распространяясь на файлы вашего сайта. Поэтому гораздо проще отлаживать и обрабатывать ошибки.
  2. Вы можете легко изменить свой класс с помощью другого databaseclass.
  3. Вам не придется повторять код, просто вызвать код в databaseclass
  4. При желании вы можете расширить класс с, например, вырубкой, статистические тесты, ...

Пример:

<?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)); 
+0

«Все шаги ...» - действительно ли так много? PDO позволяет вам писать 'foreach ($ pdo-> query (...) как $ row)', который примерно такой же минимальный, как и для неподготовленного оператора. Взаимодействие с базой данных дорого и должно происходить только в самых специфических методах, а не вместо «повсюду», я не понимаю, почему это всегда должно происходить в одной строке. – deceze

+0

Что вы имеете в виду с помощью очень специфических методов, а не повсюду? –

+0

MVC, разделение проблем. У вас должно быть несколько сосредоточенных мест на уровне модели, где данные извлекаются из базы данных. Например. 'UserService :: getAllActiveUsers()' или 'PostService :: updatePost ($ id, array $ data)'. Единственной задачей этих методов является взаимодействие с базой данных одним конкретным способом. Внутри вы должны тратить столько строк на соответствующий запрос базы данных по мере необходимости, нет никакого преимущества, чтобы превратить его в одну строку. Наличие такой «простой обертки» просто соблазняет вас запросить вашу базу данных со всего места ad hoc вместо создания этих центральных методов один раз. – deceze

ответ

6

Говорит, что большинство попыток создать PDO обертку действительно беспомощны и сделать вещи хуже, чем с сырой PDO.
Также помещения, на которых написано обертка, основаны на том, что они в основном неправильны.

Давайте ваши:

Вы обрабатывать все данные в одном классе, а не разбросаны по файлам сайта.

Довольно неопределенное утверждение, без особого смысла. Разумеется, вы обрабатываете свои данные по всему приложению, но используете не raw PDO, а используете свой собственный класс.

Вы можете легко изменить свой класс с помощью другого databaseclass.

Но заблуждение. Вы не можете придерживаться двух вспомогательных методов - иногда вам нужно использовать необработанный экземпляр PDO.

Вам не придется повторять код, просто вызвать код в databaseclass

это один совершенно верно. Но это не так полезно, как с любым другим API.

При желании вы можете расширить класс с, например, лесозаготовок, статистические тесты

Это является собственно один - никаких возражений.

Это намного эффективнее, чем каждый раз открывать соединение, выполнять 3 строки кода и закрывать его.

это неверный. Никто просит вас каждый раз открывать соединение, выполнять 3 строки кода и закрывать его. Даже с необработанным PDO-соединением открывается только один раз.

Однако ваша реализация довольно хороша. Он не добавляет слишком много к необработанному PSO (на самом деле, он сокращает повторения только одной строкой), но все же является разумным. Итак, я бы назвал этот подход довольно успешным.

Некоторые предложения:

  1. там действительно нет смысла хранить учетные данные базы данных как свойства класса. Они нужны только в конструкторе и нигде больше
  2. Почему бы не создать соединение прямо в конструкторе без необходимости в дополнительном методе?
  3. Публичная функция getOne() была бы незаменимым дополнением к вашему набору.
  4. Вам нужно сделать $ подключение общественности - по крайней мере, пока вы делаете все доступные методы от обоих PDO и PDOStatement
+0

С моим первым утверждением я имел в виду обработку всех операций с базой данных. Это было действительно расплывчато. Я часто вижу, что люди создают свою веб-страницу, постоянно используя crud-операции по всей странице.Вместо этого я убежден, что наилучшей практикой является позволить одному классу обрабатывать все операции с базой данных. –

+1

Ну PDO уже претендует на такой класс. Итак, говоря о PDO, ваш аргумент не имеет значения. Основная проблема с обертками, что люди, которые пишут, имеют еще меньше знаний, чем создатели PDO, и ухудшают ситуацию. Если только execute() возвратил $ this вместо boolean - это сделало бы ваш класс действительно устаревшим. –

+1

Действительно, я понимаю, я определенно не лучше разработчиков PDO :), я также не пытаюсь его улучшить, но использую его удобным способом, создавая методы, возвращающие объекты. –

2

«Overkill» является субъективным. То для вас для вашего конкретного случая. Я не сомневаюсь, что вы заметили какую-либо разницу.

Есть некоторые возможные преимущества в том, чтобы делать что-то подобное. Например, вы можете встраивать профилирование запросов и ведение журнала приложений в класс. И, как вы указываете, у вас есть возможность структурировать запросы таким образом, чтобы вам было легче работать и поддерживать.

С другой стороны, код будет менее переносимым, если он полагается на ваш класс обертки. Вы не можете взять этот код и использовать его с кодом, который опирается на PDO. Вы можете обойти некоторые из этих ограничений, расширив класс PDO, а не создав для этого оболочку.

Смежные вопросы