Table des matières

com.neolao.database.MySQLManager

Gestionnaire de requêtes MySQL

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

[10/03/2005] Version 1.1

Création

[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 de la méthode select

[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

[01/06/2005] Version 1.8

Modification de la méthode insert, un bug si on passe un nombre en paramètre

[03/06/2005] Version 1.9

Modification de la méthode replace, un bug si on passe un nombre en paramètre

Source

require_once "ADatabaseBasic.php";
require_once "IDatabase.php";
require_once realpath(dirname(__FILE__)."/../../../")."/com/neolao/connection/ConnectionMySQL.php";
/**
 * Gestionnaire de requêtes MySQL
 * @package		com.neolao
 * @subpackage		database
 * @author		neolao <neo@neolao.com>
 * @version		1.9 (03/06/2005)
 * @link		http://resources.neolao.com/php/classes/database/mysqlmanager
 */
class MySQLManager extends ADatabaseBasic implements IDatabase{
	// ----------------------------- CONSTANTES --------------------------------
 
	// ----------------------------- VARIABLES ---------------------------------
 
	// ----------------------------- EVENEMENTS --------------------------------
 
	/*===================== CONSTRUCTEUR & DESCTRUCTEUR ======================*/
	/*========================================================================*/
	/**
	 * Initialisation de la class
	 * @param string $server Le serveur de base de données
	 * @param string $database Le nom de la base de données
	 * @param string $login L'identifiant de connexion
	 * @param string $password Le mot de passe
	 */
	function MySQLManager($server, $database, $login, $password){
 
		if(!is_null($server) && !is_null($database) && !is_null($login) && !is_null($password)){
			$this->CLSconnection = new ConnectionMySQL($server, $database, $login, $password);
		}
	}
	/**
	 * 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
		$server = $argsList[0];
		$database = $argsList[1];
		$login = $argsList[2];
		$password = $argsList[3];
 
		parent::connect($server, $database, $login, $password);
		return $this->CLSconnection->connect($server, $database, $login, $password);
	}
	/**
	 * 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 && !is_null($request)){
			$this->lastRequest = $request;
			$result = mysql_query($request, $this->CLSconnection->getResource());
			$this->RSCresultQuery = $result;
		}
 
		return $result;
	}
	/**
	 * Insérer un ligne 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_array($values)){
			// le paramètre est un string
			$request .= "(";
			$request .= $this->_escape($values);
			$request .= ")";
		}else{
			// 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 un ligne dans une table si elle n'existe 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 = "REPLACE 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_array($values)){
			// le paramètre est un string
			$request .= "(";
			$request .= $this->_escape($values);
			$request .= ")";
		}else{
			// 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 string $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);
 
		$request = "UPDATE ";
 
		// table
		if(is_array($table)){
			$request .= implode(", ", $table);
		}else{
			$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);
	}
	/**
	 * Suppression
	 * 
	 * // Equivalent de : DELETE FROM tb_users WHERE id=24
	 * $monManager->delete("tb_users", "id=24");
	 * // Equivalent de : DELETE FROM tb_users USING 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]);
			$request .= " USING ";
			$request .= implode(", ", $table[1]);
		}else{
			$request .= $table;
		}
 
		// condition
		if(!is_null($condition)){
			$request .= " WHERE ";
			$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 mysql_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){
			$row = mysql_fetch_row($this->RSCresultQuery);
			return $row[0];
		}else{
			return false;
		}
	}
	/*==================== FIN = METHODES PUBLIQUES = FIN ====================*/
	/*========================================================================*/
}