Ho fatto qualche ricerca sull'utilizzo di un databasewrapper per i miei dati. Tuttavia, ho letto alcuni post in cui le persone affermano che non dovresti usare PDO per un databasewrapper perché è già uno.Un wrapper pdo è davvero eccessivo?
Potrebbe essere così, ma sono ancora convinto che abbia molti vantaggi.
- Gestisci tutte le azioni di dati (crude) in una classe, non distribuite sui file del tuo sito web. Quindi è molto più facile eseguire il debug e gestire gli errori.
- È possibile modificare facilmente la classe con un'altra classe di database.
- Non è necessario ripetere il codice, basta chiamare il codice nella databaseclass
- Opzionalmente è possibile estendere la classe con ad esempio la registrazione, i test statistici, ...
Esempio:
<?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;
}
}
?>
Invece di ripetere costantemente tutti i passaggi per il recupero dei dati, è possibile chiamare get() e passare una query e alcuni parametri facoltativi. Questo è molto più efficiente di ogni volta che si apre una connessione, si eseguono 3 linee di codice e si chiude.
$db->get("select * from user where id = ?",array(1));
"Tutti i passaggi ..." - ce ne sono davvero tanti? PDO ti permette di scrivere 'foreach ($ pdo-> query (...) come $ row)', che è tanto minimale quanto per un'istruzione non preparata. Interagire con il database è costoso e dovrebbe avvenire solo con metodi molto specifici per iniziare anziché "dappertutto", non capisco perché debba sempre succedere in una singola riga. – deceze
Cosa intendi con metodi molto specifici invece che dappertutto? –
MVC, separazione dei dubbi. Dovresti avere alcuni punti concentrati nel tuo livello del modello in cui i dati vengono recuperati dal database. Per esempio. 'UserService :: getAllActiveUsers()' o 'PostService :: updatePost ($ id, array $ data)'. L'unico compito di questi metodi è quello di interagire con il database in un modo specifico. All'interno, dovresti spendere quante più righe su una corretta query del database, se necessario, non c'è alcun vantaggio nel farne una singola riga. Avere un tale "semplice involucro" ti fa semplicemente sedurre per interrogare il tuo database da tutto il posto ad hoc invece di creare questi metodi centrali una sola volta. – deceze