Подтвердить что ты не робот

Действительно ли оболочка pdo переполнена?

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

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

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

Пример:

<?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));
4b9b3361

Ответ 1

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

Позвольте взять ваш:

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

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

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

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

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

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

По желанию вы можете расширить класс, например, с помощью журнала, статистических тестов

Это правильный вариант - никаких возражений.

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

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

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

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

  • действительно нет смысла хранить учетные данные базы данных как свойства класса. Они нужны только в конструкторе и нигде больше
  • Почему бы не создать право подключения в конструкторе без необходимости использования дополнительного метода?
  • public function getOne() будет незаменимым дополнением к вашему набору.
  • Вам нужно сделать общедоступным $connection - по крайней мере, пока вы не сделаете все методы доступными как из PDO, так и из PDOstatement

Ответ 2

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

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

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