Table des matières

com.neolao.database.SQLiteManager

Gestionnaire de requêtes SQLite

Classes recquises :

Constructeur

Initialisation de la class

Méthodes

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.

Méthodes héritées

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

Change log

[02/03/2005] Version 1.0

Création

[10/03/2005] Version 1.1

Ajout des méthodes :

  • insert
  • select
  • update
  • delete

[30/03/2005] Version 1.2

Modification de la méthode select. On peut maintenant passer en paramètre table, un array pour une jointure

[04/04/2005] Version 1.3

Enregistrement de la dernière requête

[07/04/2005] Version 1.4

Modification des méthodes :

  • select
  • update : jointure possible
  • delete : jointure possible

[09/04/2005] Version 1.5

Ajout de la méthode fetch_single

[16/04/2005] Version 1.6

Ajout de la méthode replace

[11/05/2005] Version 1.7

Utilisation de _escape

Source

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 ====================*/
	/*========================================================================*/
}