SQLite
Classe SQLite destinée à faire de l'abstraction de bdd (entre autres). Attention, cette classe nécessite PHP 5 !
La classe SQLite reprend les principales fonctionnalités des fonctions PHP associées. Son but, n'est donc pas de remplacer ces fonctions, mais de vous permettre , éventuellement, de faire de l'abstraction de base de données. Notamment grâce à une classe PostgresSQL, ou MySQL... La classe intègre aussi la fonctionnalité de cache de donnée .
Les réglages du ramasse miettes sont effectués dans la classe elle même avec la variable $Bdd->gc_time=86400. Le chemin du répertoire de cache se gère de même avec $Bdd->cache_path='cache'. Lors de la mise en place de la classe penser à créer le répertoire de cache.
WARNING : penser à protéger votre fichier de base de données SQLlite en le mettant dans un répertoire protégé par un .htaccess par exemple, car en le laissant dans l'arborescence web n'importe qui pourrait récupérer vos données.
Les Méthodes
- SQLite - Nouvelle Instance
- connect - Connection et sélection de la Base
- send_query - Envoyez une requete
- num_rows - Nombre de résultat(s) retourné(s) par une requete
- get_cached_data - Envoie une requete et met le resultat au cache
Exemples
- Exemple Minimal - Sélection de la base
- Envoi d' une requête - Création d' une table
- Insertion de données dans une table
- Récupération de données dans une table
La Source
/**********************************************************************************************************/
abstract class GC {
function rungc($cache_path,$gc_max) {
/*
Ici on a une routine de ramasse miette
qui nettoie le contenu du cache des fichiers hors d'age
et evite d'avoir un cache trop volumineux
tout les fichiers dont l'age est supérieur a gc_max
sont supprimés
*/
//echo "<p>.:| GC chemin:$cache_path |:.</p>";
//$handle=opendir(dirname($cache_path));
$handle=opendir($cache_path);
while ($file = readdir($handle)) {
$path=dirname($cache_path).'/'.$file;
//echo "<p>.:| $path |:.</p>";
if ( is_file($path) && filemtime($path)<time()-$gc_max && $file!='.htaccess' ) {
GC::delfile($path);
}
}
}
function delfile($file) {
/*
là une routine qui permet l'effacement du fichier file
sous unix puis windows
*/
@unlink($file);
clearstatcache();
if (@file_exists($file)) {
$filesys = str_replace("/", "\\", $file);
@system("del $filesys");
clearstatcache();
if (@file_exists($file)) {
@chmod ($file, 0775);
@unlink($file);
@system("del $filesys");
}
}
clearstatcache();
return @file_exists($file);
/*
if (@file_exists($file)) {return FALSE; }
else { return TRUE; }
*/
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class SQLite extends GC {
public $base;
public $cache_path = 'cache';
public $gc_time=86400;
private $connect_id = 0;
private $error;
private $records = array();
function __construct($Host='', $User='', $Pass='', $Base='mabase') {
$this->base=$Base;
//require_once('gc.php');
//$gcsql = new GC($this->cache_path, $this->gc_time);
srand((double)microtime()*1000000);
if (!rand(0,99)) {
parent::rungc($this->cache_path,$this->gc_time);
}
}
function __destruct() {
if($this->connect_id) {
$this->close($this->connect_id);
}
}
public function connect($Base) {
//$this->connect_id = @sqlite_open($Base, 0666, $this->error);
/*
if($this->connect_id) {
return $this->connect_id;
}
*/
return $this->connect_id = @sqlite_open($Base, 0666, $this->error);
}
public function Send_Query($query) {
if ( !$this->connect_id ) $this->connect($this->base);
if ( $this->result_id = @sqlite_query($query, $this->connect_id) ) {
$this->query = trim($query);
$this->error = '';
return $this->result_id;
} else {
$this->error= sqlite_error_string(sqlite_last_error($this->connect_id));
//echo $this->error;
//echo $query;
return FALSE;
}
}
public function last_insert_id() {
return @sqlite_last_insert_rowid();
}
public function num_rows() {
if ( isset($this->result_id) ) {
if ( preg_match('`^select`i',trim($this->query)) ) {
return @sqlite_num_rows($this->result_id);
}
//if ( preg_match('`^(insert|update|delete)`i',$this->query) ) return mysql_affected_rows($this->result_id);
} else {
return count($this->records);
}
}
public function get_object($query) {
//return @mysql_fetch_object($query);
}
public function get_array($query, $mode='ASSOC') {
switch($mode) {
case 'NUMERIC' :
return @sqlite_fetch_array($query, SQLITE_NUM);
break;
case 'BOTH' :
return @sqlite_fetch_array($query);
break;
case 'ASSOC' :
default :
return @sqlite_fetch_array($query, SQLITE_ASSOC);
}
}
public function return_error() {
return sqlite_error_string(sqlite_last_error($this->connect_id));
}
// PUBLIC : ferme la connection;
public function close() {
return sqlite_close($this->connect_id) ;
}
// PUBLIC : vide les resultat des requete
public function free_result() {
}
public function get_cached_data($request,$time=0) {
$this->cachename=$this->cache_path.'/'.md5($request).'.cachesql';
if ( file_exists($this->cachename) && filemtime($this->cachename) > (time() - $time)) {
$records = unserialize(file_get_contents($this->cachename));
} else {
if (!($this->result=$this->Send_Query($request))) return FALSE;
while ($record = $this->get_array($this->result) ) {
$records[] = $record;
}
$OUTPUT = serialize($records);
$fp = fopen($this->cachename,"wb");
@flock($fp,2);
fputs($fp, $OUTPUT);
@flock($fp,3);
fclose($fp);
}
return $records;
}
// PUBLIC : ajoute les slashe sql et C pour le stockage des BLOB
public function prepare_blob($file) {
$blob = file_get_contents($file);
$blob = addslashes($blob);
$blob = addcslashes($blob, "\0");
return $blob;
}
}// end class
?>