Gestionnaire de requêtes SQLite
Classes recquises :
Initialisation de la class
Visibilité | Return | Nom | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 | Param 7 | Param 8 | Description |
---|---|---|---|---|---|---|---|---|---|---|---|
public | bool | connect | Se connecter à la base | ||||||||
public | void | disconnect | Se déconnecter de la base | ||||||||
public | resource | query | string $request | Faire une requête | |||||||
public | bool | insert | string $table | mixed $columns | mixed $values | Insérer des données dans une table | |||||
public | bool | replace | string $table | mixed $columns | mixed $values | Insérer des données dans une table si elles n'existent pas, sinon la met à jour | |||||
public | mixed | select | mixed $table | mixed $columns | string $condition | string $group | string $having | array $order | array $limit | bool $sendRequest | Sélection |
public | string | selectMaker | mixed $table | mixed $columns | string $condition | string $group | string $having | array $order | array $limit | Fabriquation de requête SELECT | |
public | bool | update | mixed $table | mixed $columns | mixed $values | string $condition | Modification | ||||
public | bool | delete | mixed $table | string $condition | Suppression | ||||||
public | array | fetch_array | Retourne la prochaine ligne du résultat de la requête, false si terminé. | ||||||||
public | string | fetch_single | Retourne la valeur du premier champ du résultat de la requête. |
Visibilité | Return | Nom | Param 1 | Param 2 | Param 3 | Param 4 | Param 5 | Param 6 | Param 7 | Param 8 | Description |
---|---|---|---|---|---|---|---|---|---|---|---|
protected | string | _escape | mixed $value | Echapper les valeurs, contre les injections SQL |
Création
Ajout des méthodes :
Modification de la méthode select. On peut maintenant passer en paramètre table, un array pour une jointure
Enregistrement de la dernière requête
Modification des méthodes :
Ajout de la méthode fetch_single
Ajout de la méthode replace
Utilisation de _escape
require_once "ADatabaseBasic.php"; require_once "IDatabase.php"; require_once realpath(dirname(__FILE__)."/../../../")."/com/neolao/connection/ConnectionSQLite.php"; /** * Gestionnaire de requêtes SQLite * @package com.neolao * @subpackage database * @author neolao <neo@neolao.com> * @version 1.7 (11/05/2005) * @link http://resources.neolao.com/php/classes/database/sqlitemanager */ class SQLiteManager extends ADatabaseBasic implements IDatabase{ // ----------------------------- CONSTANTES -------------------------------- // ----------------------------- VARIABLES --------------------------------- // ----------------------------- EVENEMENTS -------------------------------- /*===================== CONSTRUCTEUR & DESCTRUCTEUR ======================*/ /*========================================================================*/ /** * Initialisation de la class * @param string $filePath Le chemin du fichier dblite */ function SQLiteManager($filePath = ""){ if($filePath != ""){ $this->CLSconnection = new ConnectionSQLite($filePath); } } /** * Destruction de la class */ function __destruct(){ } /*=============== FIN = CONSTRUCTEUR & DESCTRUCTEUR = FIN ================*/ /*========================================================================*/ /*=========================== METHODES PRIVEES ===========================*/ /*========================================================================*/ /*===================== FIN = METHODES PRIVEES = FIN =====================*/ /*========================================================================*/ /*============================ GETTER SETTER ============================*/ /*========================================================================*/ /*====================== FIN = GETTER SETTER = FIN ======================*/ /*========================================================================*/ /*========================== METHODES PUBLIQUES ==========================*/ /*========================================================================*/ /** * Connexion à la base * @return bool true si la connexion a réussi, sinon false */ public function connect(){ $argsTotal = func_num_args(); // Nombre d'arguments $argsList = func_get_args(); // Liste des arguments $filePath = $argsList[0]; parent::connect(); return $this->CLSconnection->connect($filePath); } /** * Déconnexion de la base */ public function disconnect(){ parent::disconnect(); } /** * Effectue une requête * @param string $request La requête * @return resource Le résultat de la requête */ public function query($request){ parent::query($request); $result = false; if($this->CLSconnection->getResource() && !is_null($request)){ $this->lastRequest = $request; $result = sqlite_query($this->CLSconnection->getResource(), $request); $this->RSCresultQuery = $result; } return $result; } /** * Insérer des données dans une table * * // Equivalent de : INSERT INTO tb_users(name) VALUES("toto") * $monManager->insert("tb_users", "name", "toto"); * // Equivalent de : INSERT INTO tb_users(name, age) VALUES("toto", 18) * $monManager->insert("tb_users", array("name", "age"), array("toto", 18)); * // Equivalent de : INSERT INTO tb_users(name, age) VALUES("toto", 18), ("mimi", 17) * $monManager->insert("tb_users", array("name", "age"), array(array("toto", 18), array("mimi", 17)); * * @param string $table La table * @param mixed $columns Les colonnes à modifier * @param mixed $values Les valeur des colonnes * @return bool true si l'opération a réussi, sinon false */ public function insert($table, $columns, $values){ parent::insert($table, $columns, $values); $request = "INSERT INTO "; $request .= $table; // colonnes if(is_string($columns)){ // le paramètre est un string $request .= "("; $request .= $columns; $request .= ")"; }elseif(is_array($columns)){ // le paramètre est un tableau $request .= "("; $coma = ""; for($i=0; $i<count($columns); $i++){ $request .= $coma.$columns[$i]; $coma = ", "; } $request .= ")"; } // valeurs $request .= " VALUES "; if(is_string($values)){ // le paramètre est un string $request .= "("; $request .= $this->_escape($values); $request .= ")"; }elseif(is_array($values)){ // le paramètre est un tableau if(!is_array($values[0])){ // pas un tableau, donc insertion d'une seule ligne $request .= "("; $coma = ""; for($i=0; $i<count($values); $i++){ $request .= $coma; $request .= $this->_escape($values[$i]); $coma = ", "; } $request .= ")"; }else{ // tableau, donc insertion de plusieurs lignes $requestGen = $request; for($i=0; $i<count($values); $i++){ $requestTmp = $requestGen; $requestTmp .= "("; $coma = ""; for($j=0; $j<count($values[$i]); $j++){ $requestTmp .= $coma; $requestTmp .= $this->_escape($values[$i][$j]); $coma = ", "; } $requestTmp .= ")"; if(!$this->query($requestTmp)){ return false; } } return true; } } return $this->query($request); } /** * Insérer des données dans une table si elles n'existent pas, sinon la met à jour * L'un des champ doit être unique, sinon cette méthode aura le même comportement que insert * * // Equivalent de : REPLACE INTO tb_users(name) VALUES("toto") * $monManager->replace("tb_users", "name", "toto"); * // Equivalent de : REPLACE INTO tb_users(name, age) VALUES("toto", 18) * $monManager->replace("tb_users", array("name", "age"), array("toto", 18)); * // Equivalent de : REPLACE INTO tb_users(name, age) VALUES("toto", 18), ("mimi", 17); * $monManager->replace("tb_users", array("name", "age"), array(array("toto", 18), array("mimi", 17)); * * @param string $table La table * @param mixed $columns Les colonnes à modifier * @param mixed $values Les valeur des colonnes * @return bool true si l'opération a réussi, sinon false */ public function replace($table, $columns, $values){ parent::replace($table, $columns, $values); $request = "INSERT INTO "; $request .= $table; // colonnes if(is_string($columns)){ // le paramètre est un string $request .= "("; $request .= $columns; $request .= ")"; }elseif(is_array($columns)){ // le paramètre est un tableau $request .= "("; $coma = ""; for($i=0; $i<count($columns); $i++){ $request .= $coma.$columns[$i]; $coma = ", "; } $request .= ")"; } // valeurs $request .= " VALUES "; if(is_string($values)){ // le paramètre est un string $request .= "("; $request .= $this->_escape($values); $request .= ")"; }elseif(is_array($values)){ // le paramètre est un tableau if(!is_array($values[0])){ // pas un tableau, donc insertion d'une seule ligne $request .= "("; $coma = ""; for($i=0; $i<count($values); $i++){ $request .= $coma; $request .= $this->_escape($values[$i]); $coma = ", "; } $request .= ")"; }else{ // tableau, donc insertion de plusieurs lignes $requestGen = $request; for($i=0; $i<count($values); $i++){ $requestTmp = $requestGen; $requestTmp .= "("; $coma = ""; for($j=0; $j<count($values[$i]); $j++){ $requestTmp .= $coma; $requestTmp .= $this->_escape($values[$i][$j]); $coma = ", "; } $requestTmp .= ")"; if(!$this->query($requestTmp)){ return false; } } return true; } } return $this->query($request); } /** * Sélection * * // Equivalent de : SELECT name FROM tb_users WHERE id=1 * $monManager->select("tb_users", "name", "id=1"); * // Equivalent de : SELECT name, age FROM tb_users WHERE id=1 * $monManager->select("tb_users", array("name", "age"), "id=1"); * // Equivalent de : SELECT classe, niveau FROM tb_users GROUP BY classe ORDER BY niveau DESC LIMIT 0, 10 * $monManager->select("tb_users", array("classe", "niveau"), null, "classe", array("niveau"=>"DESC"), array(0, 10)); * * @param mixed $table La table ou les tables * @param mixed $columns Les colonnes à récupérer * @param string $condition Les conditions de recherche des lignes * @param string $group Rangement par groupe * @param string $having Sélection généralement avec un GROUP BY * @param array $order Triage (tableau clé=>valeur, où la clé correspond à une colonne de la table et valeur à "DESC" ou "ASC") * @param array $limit Limitation des lignes (tableau à 2 cellules, le premier correspond à l'index de départ, et le second au nombre de lignes sélectionnées) * @param bool $sendRequest true pour envoyer la requête et retourner le résultat, sinon retourne la chaîne de requête * @return mixed Si $sendRequest=true alors indique le succès de l'opération, sinon retourne la chaîne de requête */ public function select($table, $columns=null, $condition=null, $group=null, $having=null, $order=null, $limit=null, $sendRequest=true){ parent::select($table, $columns, $condition, $group, $having, $order, $limit); $request = "SELECT "; if(is_string($columns)){ // le paramètre est un string $request .= $columns; }elseif(is_array($columns)){ // le paramètre est un tableau $coma = ""; for($i=0; $i<count($columns); $i++){ $request .= $coma; $request .= $columns[$i]; $coma = ", "; } }else{ $request .= "*"; } // table $request .= " FROM "; if(is_array($table)){ $request .= implode(", ", $table); }else{ $request .= $table; } // condition if(!is_null($condition)){ $request .= " WHERE "; $request .= $condition; } // group if(!is_null($group)){ $request .= " GROUP BY "; $request .= $group; } // having if(!is_null($having)){ $request .= " HAVING "; $request .= $having; } // order if(!is_null($order)){ $request .= " ORDER BY "; $coma = ""; while (list ($key, $value) = each($order)) { $request .= $key." ".$value; $coma = ", "; } } // limit if(!is_null($limit)){ $request .= " LIMIT "; $request .= $limit[0]; $request .= ", "; $request .= $limit[1]; } return ($sendRequest)?$this->query($request):$request; } /** * Fabriquation de requête SELECT * * // Equivalent de : SELECT * FROM tb_users WHERE idClasse IN (SELECT id FROM tb_classes WHERE niveau=1) * $monManager->select("tb_users", "*", "idClasse IN (".$monManager->selectMaker("tb_classes", "id", "niveau=1").")"); * * @param mixed $table La table ou les tables * @param mixed $columns Les colonnes à récupérer * @param string $condition Les conditions de recherche des lignes * @param string $group Rangement par groupe * @param string $having Sélection généralement avec un GROUP BY * @param array $order Triage (tableau clé=>valeur, où la clé correspond à une colonne de la table et valeur à "DESC" ou "ASC") * @param array $limit Limitation des lignes (tableau à 2 cellules, le premier correspond à l'index de départ, et le second au nombre de lignes sélectionnées) * @param bool $sendRequest true pour envoyer la requête et retourner le résultat, sinon retourne la chaîne de requête * @return string La chaîne de requête */ public function selectMaker($table, $columns=null, $condition=null, $group=null, $having=null, $order=null, $limit=null){ return select($table, $columns, $condition, $group, $having, $order, $limit, false); } /** * Modification * * // Equivalent de : UPDATE tb_users SET age=20 WHERE id=24 * $monManager->update("tb_users", "age", "20", "id=24"); * // Equivalent de : UPDATE tb_users SET age=20, vieux='true' WHERE id=24 * $monManager->update("tb_users", array("age", "vieux"), array("20", "'true'"), "id=24"); * // Equivalent de : UPDATE tb_users SET age=age+1 WHERE id=24 * $monManager->update("tb_users", "age", "age+1", "id=24"); * * @param mixed $table La table ou les tables * @param mixed $columns Les colonnes à modifier * @param mixed $values Les valeur des colonnes * @param string $condition Les conditions de recherche des lignes * @return bool true si l'opération a réussi, sinon false */ public function update($table, $columns, $values, $condition=null){ parent::update($table, $columns, $values, $condition); if(!is_array($table)){ // Fonctionnement normale $request = "UPDATE "; // table $request .= $table; // set $request .= " SET "; if(is_string($columns)){ // le paramètre est un string // donc un seul champ à modifier, donc $value n'est pas un tableau non plus $request .= $columns; $request .= "="; $request .= $this->_escape($values); }elseif(is_array($columns)){ // le paramètre est un tableau $coma = ""; for($i=0; $i<count($columns); $i++){ $request .= $coma; $request .= $columns[$i]; $request .= "="; $request .= $this->_escape($values[$i]); $coma = ", "; } } // condition if(!is_null($condition)){ $request .= " WHERE "; $request .= $condition; } return $this->query($request); }else{ // tables $listTables = $table[1]; // colonnes $listColonnes = array(); $listColonnes[] = $table[0].".rowid AS rowid"; if(is_string($values)){ $listColonnes[] = $values." AS val0"; }else{ $coma = ""; for($i=0; $i<count($values); $i++){ $listColonnes[] = $coma.$values[$i]." AS val".$i; $coma = ", "; } } // sélection $this->select($listTables, $listColonnes, $condition); // pour chaque sélection... $newsVals = array(); while($row = $this->fetch_array()){ $newsVals[] = $row; } for($i=0; $i<count($newsVals); $i++){ $rowid = array_shift($newsVals[$i]); $rowid = array_shift($newsVals[$i]); $newsVals[$i] = array_unique($newsVals[$i]); $newCols = array(); if(!is_array($columns)){ $newCols[] = substr($columns, strlen($table[0]) + 1); }else{ for($j=0; $j<count($columns); $j++){ $newCols[] = substr($columns[$j], $table[0]->length); } } if(!$this->update($table[0], $newCols, $newsVals[$i], "rowid=".$rowid)){ return false; } } return true; } } /** * Suppression * * // Equivalent de : DELETE FROM tb_users WHERE id=24 * $monManager->delete("tb_users", "id=24"); * // Equivalent de : DELETE FROM tb_users WHERE rowid IN (SELECT tb_users.rowid AS rowid FROM tb_users, tb_classes WHERE tb_users.idClasse=tb_classes.id AND tb_classes.name LIKE 'orc_%') * $monManager->delete(array("tb_users", array("tb_users", "tb_classes")), "tb_users.idClasse=tb_classes.id AND tb_classes.name LIKE 'orc_%'"); * * @param mixed $table La table ou les tables * @param string $condition Les conditions de recherche des lignes * @return bool true si l'opération a réussi, sinon false */ public function delete($table, $condition=null){ parent::delete($table, $condition); $request = "DELETE FROM "; // table if(is_array($table)){ $request .= implode(", ", $table[0]); }else{ $request .= $table; } // condition if(!is_null($condition)){ $request .= " WHERE "; if(is_array($table)){ $request .= " rowid IN ("; $request .= "SELECT ".$table[0].".rowid AS rowid "; $request .= "FROM ".implode(", ", $table[1])." "; $request .= "WHERE ".$condition; $request .= ")"; }else{ $request .= $condition; } } return $this->query($request); } /** * Retourne la prochaine ligne du résultat de la requête * @return array La ligne, false si terminé */ public function fetch_array(){ parent::fetch_array(); if($this->RSCresultQuery !== false){ return sqlite_fetch_array($this->RSCresultQuery); }else{ return false; } } /** * Retourne la valeur du premier champ du résultat de la requête * @return string La valeur, sinon false */ public function fetch_single(){ parent::fetch_single(); if($this->RSCresultQuery !== false){ return sqlite_fetch_single($this->RSCresultQuery); }else{ return false; } } /*==================== FIN = METHODES PUBLIQUES = FIN ====================*/ /*========================================================================*/ }