PRT96919
Aggiornato il: 28-01-2023 12:30
Connettersi al database è necessario per la maggioranza degli script e dei siti web al fine di poter accedere a funzionalità di ogni genere: log di dati, proprietà del sito, memorizzazione di hash di sistema ed impostazioni, spesso e volentieri memorizzazione di dati dinamici del sito come contenuti delle pagine, degli articoli e dei widget. PDO (PHP Data Objects) è, in questo, una delle tecnologie più in voga per la sua modernità e rapidità (vedi anche qui, sul sito ufficiale).
Introduzione
Devo riconoscere che fino a qualche anno fa utilizzavo il metodo di connessione tradizionale di PHP, 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 definitivamente nel giro dei prossimi anni. In questo caso PDO 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.
Un modello base di codice per PDO
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.
Esempio pratico di PDO: una SELECT MySQL
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.
Esempio di INSERT e DELETE
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

Ingegnere informatico per passione, consulente per necessità, docente di informatica; ho creato Trovalost.it e ho scritto quasi tutti i suoi contenuti. Credits immagini: pexels.com, pixabay.com, wikipedia.org, Midjourney, StarryAI, se non diversamente specificato. Questo sito non contiene necessariamente suggerimenti, pareri o endorsement da parte del proprietario del progetto e/o espressi a titolo personale. Per contatti clicca qui