Gestionnaire de requêtes MySQL
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
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 de la méthode select
Ajout de la méthode fetch_single
Ajout de la méthode replace
Utilisation de _escape
Modification de la méthode insert, un bug si on passe un nombre en paramètre
Modification de la méthode replace, un bug si on passe un nombre en paramètre
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 ====================*/ /*========================================================================*/ }