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