Pubblicità

PDO PHP Data Objects

Pubblicità

PDO::Data Objects

L' estensione PDO PHP Data Objects definisce un'interfaccia leggera e coerente per l'accesso ai database in PHP.

Ogni driver di database che implementa l'interfaccia PDO può esporre funzionalità specifiche del database come normali funzioni di estensione.

Si noti che non è possibile eseguire funzioni di database utilizzando l'estensione PDO da solo; è necessario utilizzare un driver PDO specifico del database per accedere a un server di database.

PDO fornisce un livello di astrazione di accesso ai dati , il che significa che, indipendentemente dal database che si sta utilizzando, si utilizzano le stesse funzioni per inviare query e recuperare i dati.

PDO non fornisce un'astrazione di database, non riscrive SQL o emula funzionalità mancanti. Dovresti usare uno strato di astrazione completo se hai bisogno di quella facilità.

PDO mette a disposizione un data abstraction layer, ovvero un livello di astrazione per l'accesso ai dati, indipendentemente dal database in uso puoi usare le stesse funzioni per eseguire query e ottenere dati.
PDO viene fornito con PHP 5.1 ed è disponibile come estensione PECL per PHP 5.0.

PDO richiede le nuove funzionalità di OO nel core di PHP 5 e quindi non funzionerà con le versioni precedenti di PHP.

PDO su sistemi Unix

PDO e il driver PDO_SQLITE sono abilitati per impostazione predefinita a partire da PHP 5.1.0.
Potrebbe essere necessario abilitare il driver PDO per il database di scelta.
Quando si installa PDO come modulo condiviso, il file php.ini deve essere aggiornato in modo che l'estensione PDO venga caricata automaticamente durante l'esecuzione di PHP.
Dovrai anche abilitare tutti i driver specifici del database, assicurarsi che siano elencati dopo la riga pdo.so, dato che il PDO deve essere inizializzato prima che possano essere caricate le estensioni specifiche del database.

PDO su Windows

PDO e tutti i principali driver vengono forniti con PHP come estensioni condivise e devono semplicemente essere attivati ​​modificando il file php.ini :
extension = php_pdo.dll
extension = php_pdo_firebird.dll
extension = php_pdo_informix.dll
extension = php_pdo_mssql.dll
extension = php_pdo_mysql.dll
extension = php_pdo_oci.dll
extension = php_pdo_oci8.dll
extension = php_pdo_odbc.dll
extension = php_pdo_pgsql.dll
extension = php_pdo_sqlite.dll

PDO è già predisposto per la programmazione OOP (Object Oriented Programming), mancante nelle vecchie funzioni, notevolmente più sicuro, grazie ai prepared statement, (dichiarazioni precompilate), dove non c'è alcun pericolo di incombere in alcun tipo di SQL Injection.

Pubblicità

Con le vecchie funzioni mysql_, per connettersi a un database la procedura bene o male era la seguente:

 $conn = mysql_connect(localhost, "username", "password", "database"); 
 if (mysql_connect_error($connessione)) { 
      die("Errore nella connessione al database!");
	  }  

Con PDO il procedimento resta lo stesso:
per prima cosa si inizializza l'istanza della classe PDO, passando 3 parametri obbliatori nel costruttore:


try{

	$conn = new PDO("mysql:host=localhost;dbname=nome_database", 'usename', 'password');
	
} catch (PDOException $e){
	
	die('Errore durante la connessione al database!: ' . $e->getMessage());
}

Se non ci sono errori, la nostra applicazione si connetterà correttamente, altrimenti grazie al costrutto try / catch, stamperemo a video un messaggio di errore.

Possiamo anche specificare parametri opzionali, attraverso la funzione. setAttribute()

Per la gestione degli errori ci sono tre opzioni da attribuire al parametro PDO::ATTR_ERRMODE:

PDO::ERRMODE_SILENT, la modalità di default, dove non vengono mostrati messaggi di errori, ma in modo non visibile vengono impostati, nel caso ci fossero, il codice errore e il relativo messaggio, e accessibili rispettivamente tramite i seguenti metodi: errorCode(), errorInfo().

PDO::ERRMODE_WARNING, in aggiunta alla prima modalità, imposta anche un messaggio di "attenzione", utile durante il testing dell'applicazione, che una volta mostrato non blocca il normale flusso del programma.

PDO::ERRMODE_EXCEPTION, la modalità più "aggressiva" che in aggiunta a quelle precendenti blocca l'esecuzione del programma mostrando automaticamente a video un messaggio di errore.
Questa modalità è consigliata in ambito di debug, dato che mostra un elenco dettagliato di dove si trova l'errore, perchè è stato mostrato.

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

Query di tipo INSERT

$insert = $conn->prepare('INSERT INTO user(nome,cognome) VALUES(:fname,:fcognome)');  
$pass = array(
				':fname' => 'pablosss',
				':fcognome' => 'marchignoss',
			);  
$insert->execute($pass);	

Oppure semplicemente:

$c = $conn->exec("INSERT INTO user (nome,cognome) VALUES ('pablosss', 'marchignoss');");

Il metodo PDO->prepare() ci darà come return un oggetto PDOStatement, in particolare esso "prepara" la query in attesa di esecuzione che avverrà con PDOStatement->execute().

Questo è il metodo più semplice per eseguire una query.

	  $s = $conn->query("SELECT * FROM user");  
	  print_r($s->fetchall());

Query di tipo DELETE e UPDATE

PDO::exec Esegue un'istruzione SQL e restituisce il numero di righe interessate.

Questa tipologia di query richiede attenzioni, cioè l'utilizzo è consigliato per query di tipo "statico" e, laddove necessario, occorre eseguire l'escape delle stringhe nonchè gli altri controlli necessari per prevenire SQL Injection.

   $sql = $conn->exec("DELETE FROM user WHERE id = 5");  
   echo 'Righe eliminate ' . $sql;  

UPDATE e DELETE sono istruzioni SQL che modificano i dati in una tabella, ma non restituiscono un set di risultati con righe e colonne.
Possono essere eseguiti allo stesso modo di INSERT, con il metodo exec() .

UPDATE

$sql = $conn->exec("UPDATE user SET nome = 'nome_aggiornato' WHERE id = 1");
if ($aggiorna_dati === FALSE) {
  die("Nessuna modifica eseguita.");
}			

DELETE

     $sql = $conn->exec("DELETE FROM user WHERE id = 10");

PDO, in definitiva è milgiore sotto tutti i punti di vista rispetto alle vecchie funzioni "proprietarie", soprattutto per quanto riguarda la sicurezza, grazie ai prepared statement (per evitare SQL Injection), e alle transazioni (per assicurarsi l'integrità dei dati).

Manuale PDO php.net
2018-02-21
Pubblicità