1. Costruttori e metodi PDO PHP5

Posted: 29th marzo 2010 by info in Sqlite

http://us3.php.net/manual/en/book.sqlite.php

Per effettuare operazioni con sqlite utilizzeremo le classi php PDO

PDO e’ un’ estensione in grado di pilotare database di diverso tipo tramite un’ unica interfaccia (o meglio classe) che con gli stessi metodi opera su mysql, mysql 4.x, sqlite 2.x, sqlite 3.x , PostgreSQL, sqlserver, oracle ecc. ecc. Solitamente questo tipo di classe, che racchiude un insieme di sotto classi trasparenti per l’utente, viene definito layer di astrazione* .
Parlando di PDO parliamo di PHP5 e parlando di PHP5 parliamo di programmazione ad oggetti.
PDO e’ utile, indispensabile, per rendere un applicativo portabile su diverse piattaforme e diversi database.

Costruttore di un oggetto PDO [esempi]http://it.php.net/manual/en/pdo.construct.php

Se non abbiamo errori la variabile $myConn sara’ da quel punto in avanti la variabile di riferimento per la gestione del database.
$myConn= new PDO( $string_dsn [, $string_username [, $string_password [, $array_driver_options]]] );

‘ Mysql’
$dsn = ‘mysql:dbname=testdb;host=127.0.0.1′;
$user = ‘dbuser’;
$password = ‘dbpass’;
try {
    $myConn= new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo ‘Connection failed: ‘ . $e->getMessage();
}

‘Sqlite’
$dsn = ’sqlite:myfile.sqlite’;
try {
    $myConn= new PDO($dsn);
} catch (PDOException $e) {
    echo ‘Connection failed: ‘ . $e->getMessage();
}

Metodi dell’ oggetto PDO
[beginTransaction]http://it.php.net/manual/en/pdo.commit.php

Disattiva la modalità ‘autocommit’. In questa fase ogni modifica la database non sarà approvata  fino a quando la transazione non sarà conclusa con il comando ‘commit’.
Con commit infatti si reimposta l’ autocommit del database , applicando in modo irreversibile tutte le query contenute tra beginTransaction e commit.
La funzione ‘rollback’ ripristina lo stato iniziato con la transazione ‘beginTransaction’ .

Il metodo beginTransaction  permette di dire al php che cio’ che stiamo facendo potrebbe non andare a buon fine e che quindi vorremmo poter tornare in dietro in caso di insuccesso.
Questo solitamente non e’ possibile se non iniziamo una transazione poiche’ di default le query hanno un auto commit, ovvero una volta eseguite applicano i cambiamenti alla tabella / database senza possibilita’ di tornare a come era l’ attimo prima.
Quindi questa e’ una vera e propria transazione , dove al suo “interno” e’ possibile fare N query e riportare tutto allo stato iniziale in qualunque punto.
La sintassi e’ semplicissima:

/* Begin a transaction, turning off autocommit */
$dbh->beginTransaction();

/* Change the database schema */
$sth = $dbh->exec(”DROP TABLE fruit”);

/* Commit the changes */
$dbh->commit();

/* Database connection is now back in autocommit mode */

 

[exec]   – http://it.php.net/manual/en/pdo.exec.php

Ci permette di effettuare una query immediatamente e di sapere il numero di linee modificate o cancellate da questa query. Ci permette anche di effettuare query all’ interno di transazioni ed in questo caso non diventano effettive fino al commit successivo.

$row = $mypdo->exec(’DELETE FROM mytable WHERE id > 0′) or die(print_r($db->errorInfo(), true));
echo $row;
// sara’ 3 se in mytable vi erano 3 records …

[errorCode] – http://it.php.net/manual/en/pdo.errorcode.php

Questo metodo e’ specifico per sapere il codice di errore restituito da una query.

$mypdo->exec(’SELECT * FROM SELECT’); // errore generato appositamente
echo $mypdo->errorCode();

La stringa risultante sara’ per noi poco comprensibile poiche’ e’ una rappresentazione alfanumerica in ASCI del codice. Puo’ tornare utile pero’ per sapere se durante l’ utilizzo dell’ oggetto PDO ci sono stati errori.

if($mypdo->errorCode() !== ” || !$mypdo->exec(’SELECT * FROM SELECT’))
 echo ‘errore’;

[errorInfo] – http://it.php.net/manual/en/pdo.errorcode.php

Come errorCode e’ un metodo per sapere la “situazione” del nostro oggetto PDO. E’ decisamente piu’ utile del solo errorCode poiche’ il risultato non e’ una stringa ma un array di 3 elementi

$mypdo->exec(’SELECT * FROM SELECT’); // errore generato appositamente
var_dump($mypdo->errorInfo());

La chiave [0] conterra’ lo stesso codice rilasciato dall’ errorCode .
La chiave [1] conterra’ il codice numerico specifico di riferimento all’ errore .
La chiave [3] conterra’ il nostro “mysql_error()” , ovvero la stringa che descrive l’ errore generato.
Controlli utili per questo metodo:

if(count($mypdo->errorInfo()) == 1) // … tutto ok
if(count($mypdo->errorInfo()) > 1) { // … ci sono errori
 $errorinfo = $mypdo->errorInfo();
 echo $errorinfo[2]; // stringa con l’ errore
}

[getAttribute] – http://it.php.net/manual/en/pdo.getattribute.php

Metodo per leggere le impostazioni del nostro oggetto PDO e di come sta pilotando il nostro database. Esempio:

$conn = new PDO(’odbc:sample’, ‘db2inst1′, ‘ibmdb2′);
$attributes = array(
    “AUTOCOMMIT”, “ERRMODE”, “CASE”, “CLIENT_VERSION”, “CONNECTION_STATUS”,
    “ORACLE_NULLS”, “PERSISTENT”, “PREFETCH”, “SERVER_INFO”, “SERVER_VERSION”,
    “TIMEOUT”
);

foreach ($attributes as $val) {
    echo “PDO::ATTR_$val: “;
    echo $conn->getAttribute(constant(”PDO::ATTR_$val”)) . “\n”;
}

[lastInsertId] – http://it.php.net/manual/en/pdo.lastinsertid.php

Restituisce il row ID dell’ ultimo inserimento effettuato nel database.

echo (string) $mypdo->lastInsertId();

[prepare] – http://it.php.net/manual/en/pdo.prepare.php

Il modo piu’ sicuro per eseguire una query con dati “esterni” ( introdotti dall’ utente ) , ci permette di scrivere con disinvoltura query senza doverci preoccupare delle sql injections .

$mypdo->prepare($query[, $array]);

$query ⇒ la nostra query sql che puo’ contenere uno o piu’ simboli identificativi.
Per simbolo identificativo si intende un punto di domanda oppure un nome preceduto dai due punti ( : ) .
Esempio 1:
‘SELECT * FROM mytable WHERE id = ? OR user = ?’
‘SELECT * FROM mytable WHERE id = :id OR user = :user’

$array ⇒ un’ array contente le informazioni utili all’ oggetto PDO per leggere / usare la query come noi desideriamo. Le piu’ comuni sono PDO_ATTR_CURSOR , il quale ci permette di usare il secondo esempio di stringa query, e PDO_CURSOR_SCROLL che restituisce un cursore scrollabile.

[query] – http://it.php.net/manual/en/pdo.query.php
 
Esegue una query direttamente senza preparare alcunche’ e ne restituisce il risultato.
Molto utile per query senza dati sensibili e soprattutto molto veloce in fase di utilizzo poiche’ senza usare *_num_rows o *_fetch_array o simili si puo’ interagire direttamente come se fosse un array di risultati con cursore interno.

function getFruit($conn) {
    $sql = ‘SELECT name, color, calories FROM fruit ORDER BY name’;
    foreach ($conn->query($sql) as $row) {
        print $row['name'] . “\t”;
        print $row['color'] . “\t”;
        print $row['calories'] . “\n”;
    }
}

NOTA: come il “vecchio” *_unbuffered_query necessita che il cursore sia alla fine prima di poter essere riutilizzato. Teoricamente non e’ cosi’ per tutti i databases ma sarebbe bene usare questo metodo solo quando siamo certi che ci sara’ un risultato valido da mostrare / usare / scorrere fino alla fine.
Aggiungo che il PDO solitamente tratta praticamente tutte le query come se fossero unbuffered a favore delle prestazioni.
[quote] – http://it.php.net/manual/en/pdo.quote.php

 Analogo al noto mysql_escape_string o mysql_real_escape_string permette di quotare in modo giusto per il tipo di database la stringa interessata.
Ci permette quindi di usare metodi come exec o query con dati di tipo stringa sensibili.
Esempio:
$mypdo→exec(’INSERT INTO mytable VALUES( 1, ‘.$mypdo→quote(’beer \’n wine’).’)');
$mypdo→quote(’beer \’n wine’) = ‘beer n wine’ con apici di apertura e chiusura compresi.

[rollBack] – http://it.php.net/manual/en/pdo.rollback.php

Ebbene con questo e’ possibile far tornare il nostro database come era.
In pratica serve a rendere vane tutte le query fatte tra beginTransaction() e rollBack() , permettendoci di effettuare transazioni sicure e di salvaguardare i nostri dati o il nostro database da operazioni inutili o che non hanno dato il risultato sperato.
Esempio:
$mypdo→beginTransaction();
$mypdo→exec(’DROP TABLE mytable’);
$mypdo→rollBack();
la tabella mytable rimarra’ invariata