Я провел некоторое исследование об использовании базы данных для моих данных. Однако я прочитал некоторые сообщения, в которых люди утверждают, что вы не должны использовать PDO для databasewrapper, потому что он уже один.Является ли обертка pdo действительно излишней?
Это может быть так, но я все еще убежден, что он имеет много преимуществ.
- Вы обрабатываете все свои действия с данными (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));
«Все шаги ...» - действительно ли так много? PDO позволяет вам писать 'foreach ($ pdo-> query (...) как $ row)', который примерно такой же минимальный, как и для неподготовленного оператора. Взаимодействие с базой данных дорого и должно происходить только в самых специфических методах, а не вместо «повсюду», я не понимаю, почему это всегда должно происходить в одной строке. – deceze
Что вы имеете в виду с помощью очень специфических методов, а не повсюду? –
MVC, разделение проблем. У вас должно быть несколько сосредоточенных мест на уровне модели, где данные извлекаются из базы данных. Например. 'UserService :: getAllActiveUsers()' или 'PostService :: updatePost ($ id, array $ data)'. Единственной задачей этих методов является взаимодействие с базой данных одним конкретным способом. Внутри вы должны тратить столько строк на соответствующий запрос базы данных по мере необходимости, нет никакого преимущества, чтобы превратить его в одну строку. Наличие такой «простой обертки» просто соблазняет вас запросить вашу базу данных со всего места ad hoc вместо создания этих центральных методов один раз. – deceze