PHP, come connettersi al database via PDO

PHP, come connettersi al database via PDO

Devo riconoscere che fino a qualche tempo fa utilizzavo il metodo di connessione tradizionale di PHP 4, ovvero quello basato sulla connessione ed invio/ricezione dei dati mediante la primitiva mysql: questo metodo, a quanto leggo in fase di esecuzione di un po’ di codice test, sembra che sarà presto addirittura deprecato, per essere quindi abbandonato nel giro dei prossimi anni. In questo caso PDO (PHP Data Objects) sembra essere la risposta concreta da dare alle nostre necessità: una classe più snella e più veloce per connettersi, in lettura ed in scrittura e con supporto alle transazioni, al nostro db MySQL da PHP.

In questo articolo vorrei quindi “prendere nota” con voi di un codice minimale che potete riutilizzare nei vostri progetti: io sto cercando di mettere in piedi una classe più semplice possibile che poi, almeno nelle mie intenzioni, dovrebbe finire nella mia pagina GitHub. Nel frattempo vi propongo in anteprima come si ci possa connettere ad un db mediante PHP e PDO, fermo restando che questo particolare modulo è supportato da PHP versione 5.1 in poi (la maggioranza degli hosting condivisi con database in commercio dovrebbe supportarlo, ma i test – è bene ricordare – è decisamente consigliabile farli sul proprio computer in ambiente MAMP o WAMP).

Partiamo dalla creazione dell’oggetto db, che sarà una variabile istanzata a runtime mediante questa scrittura (che qui immagino essere già all’interno della classe TheDatabase:

$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database.';charset='.$this->charset.'', $this->username,$this->password );

In pratica stiamo passando cinque parametri alla funzione PDO anzichè i tradizionali quattro, ovvero database, nome utente, password, host e – in aggiunta – il charset che in questo caso potrebbe essere UTF-8. I valori delle variabili saranno memorizzati, per semplicità, direttamente nel codice PHP, anche se questo non è il massimo perchè chiunque si colleghi al nostro FTP potrebbe leggerle in chiaro: esistono metodi più efficenti per gestire questa cosa ma, per il momento, ci limitiamo a salvare come variabili private (in chiaro) le informazioni che ci servono, tanto più che ci troviamo in locale.

Cosa resta da fare? Molto poco, in verità: questa porzione di codice non fa altro che eseguire una query di SELECT di base, ad esempio:

$query = "SELECT * FROM mytable123";
$this->stmt = $this->db->query( $query );
while($row = $this->stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<tr><td>".$row['legalname'].'</td><td> '.$row['city']."</td></tr>"; //etc...
}

Noi in pratica passiamo la query come variabile stringa e, semplicemente, la stiamo passando alla funzione query del database che abbiamo creato ($this->db, che sarà un’altra variabile private, per quel che ci riguarda). Per passare dei parametri alla query di SELECT si fa così:

$stmt = $db->prepare("SELECT * FROM table WHERE id=? AND name=?");
$stmt->bindValue(1, $id, PDO::PARAM_INT);
$stmt->bindValue(2, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

ovvero si mettono dei caratteri ? “jolly” e poi si legano a runtime mediante un binding dinamico. Inoltre, di fatto, per una query in scrittura (INSERT/UPDATE) facciamo così:

//INSERT
$stmt = $db->prepare("INSERT INTO table(field1,field2,field3,field4,field5) VALUES(:field1,:field2,:field3,:field4,:field5)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2, ':field3' => $field3, ':field4' => $field4, ':field5' => $field5));
$affected_rows = $stmt->rowCount();
//DELETE
$stmt = $db->prepare("DELETE FROM table WHERE id=:id");
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
$stmt->execute();
$affected_rows = $stmt->rowCount();
//UPDATE
$stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
$stmt->execute(array($name, $id));
$affected_rows = $stmt->rowCount();

Ovviamente il discorso non finirebbe qui ma, per il momento, preferisco soffermarmi su qeusti semplici concetti base: ci sono dei discorsi da fare relativi alla sicurezza ed alla maggiore efficenza di questo metodo di connessione per l’estrazione dati ma, per il momento, preferisco rinviare il tutto alla prossima occasione. Questi frammenti di codice possono esservi molto utili, all’occorrenza, per realizzare una classe minimale di connessione a PHP quanto più possibile parametrica anche se, da quel che ho visto, non è possibile mettere come parametri i nomi delle tabelle.
Photo by CalEvans


Ti piace questo articolo?

0 voti

Su Trovalost.it puntiamo sulla qualità dei contenuti da quando siamo nati: la tua sincera valutazione può aiutarci a migliorare ogni giorno.

Ti potrebbero interessare (Guide per webmaster):

Cerca altro nel sito

Clicca sul box, e scegli la sezione per vederne i contenuti.