Scrissi questa pillola il Natale 2004, ora però ho deciso di riscriverla con qualche piccolo aggiornamento.

SQLite è nello stesso tempo due cose: un database e una libreria di accesso che implementa gran parte dei comandi dello standard SQL 92. I dati vengono salvati in un unico file, come in Microsoft Access inoltre SQLite è estremamente veloce. Per quanto riguarda PHP 5, SQLite gia è integrato invece per PHP 4 c'è bisogno di una libreria che è possibile scaricare da www.sqlite.org/download.html, una volta scaricata bisogna inserirla nella cartella "extensions" e settare php.ini.

SQLite mette a nostra disposizione due interfacce, una di tipo procedurale ed un altra OO. In SQLite si nota la mancanza di tipi di dati o in parte. Infatti esso fa solo distinzioni tra i tipi string e integer.

Un esempio OO:

<?php

$db=new SQLiteDatabase("database.sqlite"); // se il db non esiste PHP ne crea uno al momento
$db->query("begin;
     create table nomi (id integer primary key, nome varchar(255));
     insert into nomi (nome) values ('uno');
     insert into nomi (nome) values ('due');
     insert into nomi (nome) values ('tre');
     commit;");

$risultato=$db->query("select * from nomi");

while($risultato->valid()) { // restituisce true se non siamo alla fine del set di dati
    $dati=$risultato->current(); // restituisce il risultato
    print_r($dati);
    print("<br>");
    $risultato->next(); // va al prossimo set
}

$db->close();
unset($db);

?>

Analizziamo il codice per capire SQLite.

1) Abbiamo fatto uso di una transazione, quindi in SQLite è possibile fare transazioni ed è possibile eseguire query multiple separate da ;
2) Abbiamo definito il tipo di dato per id e per nome, provate a non definire il tipo di dato per nome, quindi "create table nomi (id integer primary key, nome)" praticamente è la stessa cosa di quella di prima.
3) Definendo il campo id con "integer primary key" lo rendiamo autoincrementate automaticamente.

Un esempio procedurale:

<?php

$db=sqlite_open("database.sqlite");
sqlite_query($db,"begin;
         create table nomi (id integer primary key, nome));
         insert into nomi (nome) values ('uno');
         insert into nomi (nome) values ('due');
         commit;");

$risultato=sqlite_query($db,"select * from nomi");

while($contenuto=sqlite_fetch_array($risultato)) {
    print_r($contenuto);
    print("<br>");
};

sqlite_close($db);
unset($db);

?>

In SQLite ci sono molte interfacce per estrarre i dati dal "database". Inoltre le funzioni si dividono in "funzioni buffered" e funzioni "unbuffered".

Le funzioni buffered vengono chiamate cosi perche fanno uso del buffer. Ma cosa è il buffer?
Il buffer è un area di memoria utilizzata come deposito temporaneo dei dati che sono in attesa di essere elaborati dal computer o da una periferica come la stampante. Un esempio significativo della funzione del buffer si ha nell'utilizzo del modem. Generalmente i dati arrivano al computer senza soluzione di continuità indipendentemente dagli altri compiti che esso deve svolgere: aprire e chiudere le finestre, far girare i programmi, rispondere alle richieste dell'utente. In questa fase non può elaborare i dati ricevuti dall'esterno. Il compito del buffer è, allora, quello di memorizzare temporaneamente i dati passandoli al processore solo nel momento in cui vengono richiesti. Se il buffer è troppo piccolo e non è in grado di trattenere tutti i dati che si accodano, alcuni di essi andranno persi e dovranno essere rispediti a scapito della velocità e della qualità della connessione.

Esempio di uso delle funzioni buffered:


<?php

$db=sqlite_open("gb.sqlite");

$ris=sqlite_array_query($db,"select * from nomi", SQLITE_ASSOC); // carico tutti i dati in memoria

/*
la costante SQLITE_ASSOC permette alla funzione buffered sqlite_array_query di ottenere un array associativo basato sui nomi dei campi della tabella

Ci sono anche altre costanti, tra cui
SQLITE_NUM: restituisce un array con indice numerico a partire da zero
SQLITE_BOTH: restituisce un array con indice sia numerico sia basato sui nomi dei campi della tabella
*/

print_r($ris);

sqlite_close($db);

?>

E' possibile aumentare le dimensioni del buffer, con un comando procedurale sqlite_query($db, "pragma cache_size=5000"); o con un comando OO $db->query("pragma cache_size=5000");

Esempio di uso delle funzioni unbuffered:


<?php

$db=sqlite_open("gb.sqlite");

$query=sqlite_unbuffered_query($db,"select * from nomi"); // Funzione non bufferata
print($query);
print("<br><br>");

foreach($query as $r) { // qui abbiamo fatto uso di un iteratore per scorrere il set di risultati
    print_r($r);
    print("<br>");
};


sqlite_close($db);

unset($db);

?>

Inoltre in SQLite è possibile creare funzioni personalizzate dal programmatore
Un esempio:


<?php

function conta($str) {
return strlen($str);
}

$db=new SQLiteDatabase("database.sqlite");

$db->createFunction("contaSQL", "conta", 1);

/*

Con il comando sopra ossia $db->createFunction() comunichiamo a SQLite l'esistenza della nostra funzione,
il primo parametro è il nome della funzione che verrà usato dalla sintassi SQL,
il secondo parametro è il nome originale della funzione,
il terzo parametro stabilisce il numero di parametri che utilizza la funzione PHP

*/

$ris=$db->arrayQuery("select nome, contaSQL(nome) as lunghezzaNome from nomi");

print_r($ris);

$db->close();
unset($db);

?>

Esiste anche un'altra funzione per creare funzioni personalizzate sqlite_create_aggregate(), abbastanza simile a sqlite_create_function() con l'unica differenza che consente di creare funzioni di aggregazioni sulle righe di una query SQL. Questa funzione, sqlite_create_aggregate() accetta 5 parametri.

1) Un riferimento alla risorsa database restituita dal comando di connessione
2) Il primo parametro è il nome della funzione che verrà usato dalla sintassi SQL
3) Una funzione PHP chiamata per elaborare ogni riga restituita dalla query
4) Una funzione chiamata alla fine del processo per eseguire eventuali calcoli sul risultato e poi restituirne il valore
5) Un argomento facoltativo che indica il numero di argomenti

Per ulteriori informazioni sulla funzione sqlite_create_aggregate visitate il sito PHP.it


Infine è possibile creare database temporanei, alla termine della connessione però tutte le modifiche effettuate sul database temporaneo andranno perse insieme al database.

Un esempio:


<?php

$db=sqlite_open(":memory:");

// create una o più tabelle e popolatele

sqlite_close($db); // con questa istruzione andranno persi tutti i dati

?>


Per altre informazioni visitate PHP.it o SQLite.org
Per errori di codice o di sintassi e per chiarimenti rivolgersi all'autore.
E-mail: vincenza.tralice@tiscali.it