martedì 29 Settembre 2020

Download in corso

Softwareone.it

10-01-2019

PDO PHP Data Objects

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. 

Fornito con PHP 5.1 ed è disponibile come estensione PECL per PHP 5.0.

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

Sistemi Unix

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 come modulo condiviso, il file php.ini deve essere aggiornato in modo che l’estensione 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 deve essere inizializzato prima che possano essere caricate le estensioni specifiche del database.

PDO su Windows

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
    • = php_pdo_firebird.dll
    • = php_pdo_informix.dll
    • = php_pdo_mssql.dll
    • = php_pdo_mysql.dll
    • = php_pdo_oci.dll 
    • = php_pdo_oci8.dll
    • = php_pdo_odbc.dll 
    • = php_pdo_pgsql.dll
    • = php_pdo_sqlite.dll 

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.

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, 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");

Pubblicità

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 php.net


I commenti sono chiusi.

Pubblicità