Guida Database in PHP: Introduzione a PDO

Stato
Discussione chiusa ad ulteriori risposte.

Zanzo

Utente Electrum
12 Febbraio 2011
314
13
125
161
Ultima modifica da un moderatore:
Premessa: Essendo un'introduzione, non mi soffermerò particolarmente sulle funzionalità, ma fornirò una panoramica dei principali metodi.


Molti di voi saranno a conoscenza del fatto che, nella versione 5.5.0 di PHP, le funzioni MySQL verranno deprecate. Ciò è stato deciso per orientare gli sviluppatori all'utilizzo di MySQLi ma soprattutto PDO.
PDO (PHP Data Object) non è altro che una classe contenente svariati metodi e proprietà in grado di garantire un accesso sicuro ad un database. Uno dei suoi punti forti è la portabilità, infatti se decidessimo di cambiare tipologia di database (per esempio da MySQL a PostgreSQL) basterebbe semplicemente cambiare qualche keyword, senza riscrivere completamente lo script.
Diversamente dalle funzioni MySQL, in PDO il login e la connessione al database avvengono contemporaneamente, mediante l'istruzione:


PHP:
$pdo = new PDO('mysql:host=localhost;dbname=nomedatabase', 'username', 'password');




Come vedete, l'instanziamento è identico a quello di ogni altra classe. La prima stringa deve contenere il tipo di RDBMS (in questo caso"mysql"), seguito da ":", il nome dell'host su cui si trova il server e il nome del database a cui vogliamo connetterci. La seconda stringa deve contenere lo username per accedere al database (solitamente "root"), mentre l'ultima stringa deve contenere la relativa password.
Per coloro che sono abituati ad utilizzare i blocchi try..catch è consigliabile utilizzare questo metodo dopo ogni connessione, in modo da attivare la gestione delle eccezzioni:


PHP:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);




Fatto ciò, abbiamo configurato correttamente il nostro database! Ora non ci resta che utilizzarlo, e qui ci viene in aiuto il metodo exec():


PHP:
$pdo->exec('SELECT * FROM table WHERE id =1 ');




In questo modo abbiamo eseguito una semplice SELECT sul nostro database. Avremmo potuto utilizzare un'altra funzione simile, cioè query():


PHP:
$pdo->query('SELECT * FROM table WHERE id = 1');




I due metodi sono equivalenti, l'unica differenza è che exec() restituisce come valore il numero dei risultati (affected rows, come vengono chiamati) mentre query() restituisce un PDOStatement. Gli statement sono un'altro punto forte che contraddistingue PDO dalle normali funzioni di connessione al database. Immaginate il vostro script che esegue una query. Dovete necessariamente inserire delle precauzioni per evitare, per esempio, SQL Injection. Utilizzando gli statement, invece, potete semplicemente eseguire una query sprovvista di parametri, e quindi senza pericoli. A questo punto PDO aspetterà i parametri richiesti, che poi verranno inseriti negli appositi campi. Il tutto si svolge con 3 metodi:


PHP:
$pdostat = $pdo->prepare("SELECT * FROM table WHERE id = :id AND username = :username");$pdostat->bindValue(':id', $id, PDO::PARAM_INT);$pdostat->bindValue(':username', $username, PDO::PARAM_STR);$pdostat->execute();




Il primo metodo, prepare() esegue la query e la mantiene in memoria. Come vedete, al posto dei valori sono stati inseriti dei "segnaposto". Questi segnaposto permettono che la query venga eseguita senza complicazioni, ma dovranno poi essere rimpiazzati con il valore corrispondente, mediante il metodo bindValue(). Quest'ultimo accetta 4 parametri (anche se io ne ho utilizzati solo 3), cioè il nome del segnaposto (in questo caso ":id" e ":username"), il valore (simboleggiato dalle variabili $id e $username, la tipologia di dato ([noparse]PDO::pARAM_INT[/noparse] per un numero intero, [noparse]PDO::pARAM_STR[/noparse] per una stringa) e infine la lunghezza in caratteri del valore. Gli ultimi due parametri sono opzionali, ma è buona abitudine utilizzarli per limitare gli errori. In conclusione, il metodo execute() avvia il processo di inserimento dei dati.
L'ultimo metodo di cui voglio parlarvi è fetchAll(). A molti sarà venuto in mente mysql_fetch_array(), data l'assonanza. Il funzionamente è simile, ma molto più vantaggioso. Per illustrarvelo, utilizzerò il codice precedente:


PHP:
$pdostat = $pdo->prepare("SELECT * FROM table WHERE id = :id AND username = :username");$pdostat->bindValue(':id', $id, PDO::PARAM_INT);$pdostat->bindValue(':username', $username, PDO::PARAM_STR);$pdostat->execute();
$results = $pdostat->fetchAll();
foreach ($results as $row) {     echo 'ID: ' . $row['id'] . ' USERNAME: ' . $row['username'];}




Come avrete capito, fetchAll() crea un array multidimensionale contenente tutti i risultati e quindi estraibili in un solo foreach, a differenza delle funzioni MySQL che necessitavano di 2 o più cicli. In sostanza, in questo modo avrete a disposizione tutti i risultati in un'unica variabile, alleggerendo notevolmente il codice.



Il tutorial è finito. Il motivo per cui l'ho scritto è far avvicinari i giovani programmatori PHP a questo straordinario strumento che è PDO. Ciò è rivolto soprattutto agli sviluppatori di CMS et similia, in modo da renderli compatibili con qualunque database voglia utilizzare l'utente, mantenendo lo stesso livello di sicurezza ed affidabilità. Ci saranno alcuni piccoli errori qua e là, perciò chiedo a chiunque di segnalarmeli :)

P.S. Avevo scritto e postato questa guida su un'altro forum, per cui se vi imbattete in essa sappiate che sono sempre io.
 
Riuppo questa guida che è abbastanza importante, dicendo che una alternativa al PDO è tutto il ramo delle classi mysqli. Offre per lo più le stesse funzionalità, però a differenza del PDO, supporta solo il driver MySQL.
PHP: Mysqli - Manual
 
Ciao a tutti,
Sto iniziando a studiare PDO per sostituire tutte le vecchie funzioni che ho nel mio sito con queste "Novità".
Non riesco a capire però come fare una stampa dei dati da Server. Vi allego un esempio :

Codice:
<?php
$data_source_name = 'mysql:host=xxxxxxxxx;dbname=xxxxxxxx';
$username = 'xxxxxxx';
$password = 'xxxxxx';
try {
$conn = new PDO($data_source_name, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $conn->query("SELECT * FROM tabella");
while( $result->rowCount() > 0 )
{
$campo1=$result['campo1'];
$campo2=$result['campo2'];

echo"
$campo1
$campo2
";

}

} catch(PDOException $e) {
echo 'Connessione fallita: ' . $e->getMessage();
}
?>

Quando apro la pagina mi esce questo errore: Fatal error: Cannot use object of type PDOStatement as array in /web/htdocs/www.sito.it/home/sito/Pdotest.php on line 14 .

Sarà sicuramente una stupidaggine... mi aiutate lo stesso?? :)

Grazie
 
Ciao a tutti,
Sto iniziando a studiare PDO per sostituire tutte le vecchie funzioni che ho nel mio sito con queste "Novità".
Non riesco a capire però come fare una stampa dei dati da Server. Vi allego un esempio :

Codice:
<?php
$data_source_name = 'mysql:host=xxxxxxxxx;dbname=xxxxxxxx';
$username = 'xxxxxxx';
$password = 'xxxxxx';
try {
$conn = new PDO($data_source_name, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $conn->query("SELECT * FROM tabella");
while( $result->rowCount() > 0 )
{
$campo1=$result['campo1'];
$campo2=$result['campo2'];

echo"
$campo1
$campo2
";

}

} catch(PDOException $e) {
echo 'Connessione fallita: ' . $e->getMessage();
}
?>

Quando apro la pagina mi esce questo errore: Fatal error: Cannot use object of type PDOStatement as array in /web/htdocs/www.sito.it/home/sito/Pdotest.php on line 14 .

Sarà sicuramente una stupidaggine... mi aiutate lo stesso?? :)

Grazie

Strutturalo in modo diverso:
PHP:
<?php
// Configurazione
$type = 'mysql';
$host = 'localhost';
$dbname = 'test';
$user = 'root';
$pass = '';

try {
	$conn = new PDO($type . ':host=' . $host . ';dbname=' . $dbname, $user, $pass);
	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
	die('Impossibile connettersi al database: ' . $e->getMessage());
}

if ($conn) {
	try {
		$select = $conn->query('SELECT * FROM table');
		$result = $select->fetchAll();
		foreach ($result as $value) {
			echo $value['nome_campo'];
		}
	} catch (PDOException $e) {
		die('Impossibile eseguire la query: ' . $e->getMessage());
	}
}
?>

Ovviamente devi inserire i tuoi dati prima di eseguire lo script ;)
 
  • Mi piace
Reazioni: alexpetrucci
Perfetto!!!!
Ora funziona benissimo!!!Grazie mille!!!:rockomg::rockomg:
Devo mettermi a studiare bene tutti i cambiamenti!Altrimenti rischio che quando ci sarà il cambio definitivo rimango troppo indietro!
 
Ultima modifica:
Strutturalo in modo diverso:
PHP:
<?php
// Configurazione
$type = 'mysql';
$host = 'localhost';
$dbname = 'test';
$user = 'root';
$pass = '';

try {
    $conn = new PDO($type . ':host=' . $host . ';dbname=' . $dbname, $user, $pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Impossibile connettersi al database: ' . $e->getMessage());
}

if ($conn) {
    try {
        $select = $conn->query('SELECT * FROM table');
        $result = $select->fetchAll();
        foreach ($result as $value) {
            echo $value['nome_campo'];
        }
    } catch (PDOException $e) {
        die('Impossibile eseguire la query: ' . $e->getMessage());
    }
}
?>

Ovviamente devi inserire i tuoi dati prima di eseguire lo script ;)

Domanda:
Perchè effettui la validazione di $conn se di base l'esecuzione del codice in caso di connessione mancante, viene terminata da die()? Correggi
omfg.gif


Inoltre... Io consiglierei di non utilizzare try per ogni query...
Puoi benissimo crearti una funzione che in caso di debug attivo (e quindi non visibile dall'utenza per ovvi motivi) possa gestire tutto tramite un var_dump($select->ErrorInfo);
 
Stato
Discussione chiusa ad ulteriori risposte.