71 PDO

Schema PDO

I php Data Object sono una raccolta ben organizzata di classi che offrono un’ interfaccia standard, lato programmatore, che permette di dialogare, tramite dei driver, con i maggiori DBMS, cambiando solo il nome nella stringa di connessione del codice PHP.

Essendo scritti in C garantiscono alte prestazioni e alta compatibilità con tutte le più recenti tecnologie.

Qualora non lo fosse si può abilitare le specifiche dll nel file php.ini del nostro server SQL decommentando le righe interessate.

Entriamo subito nel vivo creando la nuova pagina registra_dati_questinario.php, saltando la solita parte di inclusione della document root vediamo il codice della connessione PDO

$conn = new PDO("mysql:host=localhost;dbname={$accessData['dbname']}",$accessData['username'],$accessData['paswword']);

creiamo un nuovo oggetto chiamato PDO che riceverà come parametri una stringa composta da un prefisso che varia a seconda del daabase, nel nostro caso mysql seguita dai : , l’host col suo nome, il database che si vuole agganciare che io recupero dai faile di configurazone ed interpolerò tra le graffe, infine user e password. Importante capire che il prefisso cambia da DBMS a DBMS.

Usiamo il metodo try e catch per stabilire la connessione e gestire un eventuale fallimento:

 try
{
$conn = new PDO("mysql:host=localhost;dbname={$accessData['dbname']}",
$accessData['username'],$accessData['password']);
}
catch (PDOException $e)
{
echo $e->getMessage() . "<br />";
echo "Connessione al srver fallita. Impossibile procedere. Contattare...";
die();
}echo "Connessione stabilita con successo ;)".$nl;

Tento di stabilire una connessione (try oggetto PDO) se non riesce gestisco un eccezione (PDOException) con il parametro $e che contiene l’errore.

Chiudiamo la connessione:

$conn=null;

Interessante è notare che l’eccezione è altamente consigliabile gestirla col try e catch, in quanto maggiormente flessibili, sicure e semplici, gestirle con degli if sarebbe un’impresa infernale. Nell’esempio che segue ho delegato l’eccezione più in alto nel nostro albero strutturale, con delle funzioni (a e b) che prendono i dati di accesso a monte della creazione dell’oggetto. L’eccezione non viene gestita nella funzione connessione, ma dalla funzione b:

<?php function a(  $accessData ) {  b( $accessData ); }
function b( $accessData ) { try { connessione( $accessData ); } catch (PDOException $e) { echo $e->getMessage() . "<br/>"; echo "Connessione al server fallita. Impossibile procedere. Contattare ..."; die(); } } function connessione( $accessData ) { //CONNESSIONE $conn = new PDO("mysql:host=localhost;dbname={$accessData['dbname']}", $accessData['username'],"xxx"); //$accessData['password']); } ?>
<?php
include($_SERVER['DOCUMENT_ROOT']."/fagtest/my_include/setup_con_DB.php");if (  !isset($_SESSION['iduser']) )
{
header("Location: login.php?errore=autenticazione_richiesta"); //user non autenticato
exit;
}
a( $accessData );//CHIUDIAMO LA CONNESSIONE E LIBERIAMO LE RISORSE OCCUPATE ...
$conn=null;
?>

Ho volutamente sbagliato la password per mostrare che l’errore viene gestito a monte. Inoltre il try e il catch comunicano ad un eventuale programmatore che sta analizzando il codice, che in quel punto potrebbe verificarsi un’anomalia.