. */ /** * @brief Contains all the function to build a SQL query * * @file * @author Yves Christian KPAKPO * @date $date$ * @version $Revision$ * @ingroup core */ /** * @brief Contains all the function to build a SQL query (select, insert and update) * * @ingroup core */ class new_request extends dbquery { protected function tiny_resolve_constraints($values) { if(is_array($values)) { foreach($values as $k=>$v) { if(is_string($v) && !preg_match('`^\w+\(\)$`', $v)) { $values[$k] = '\'' . addslashes($v) . '\''; } } } if(is_string($values) && !preg_match('`^\w+\(\)$`', $values)) { $values = '\'' . addslashes($values) . '\''; } return $values; } /** * select: Méthode de création d'une requête SELECT. * @access public * @param Array [$args] Tableau des arguments à passer à la requête SELECT (Array tables: liste des tables, Array fields: liste des champs, integer begin: début de pagination, integer length: nombre d'enregistrement, string conditions: conditions, Array orders: clause order by) * @param $database_type string Type of the database (MYSQL, POSTGRESQL, ...) * @param boolean [$queryonly] Valeur par défaut (false). Renvoyer la requête seulement * @return mixed Tableau paginé du résultat de la requête SELECT ou requête textuelle */ public function select($args, $database_type="POSTGRESQL", $queryonly=false) { $result = ''; $tables = $args['tables']; $fields = $args['fields']; $joint = (isset($args['joint']))?$args['joint']:null; $begin = (isset($args['begin']))?$args['begin']:0; $length = (isset($args['length']))?$args['length']:0; $conditions = (isset($args['conditions']))?$args['conditions']:null; $groupby = (isset($args['groupby']))?$args['groupby']:null; $orders = (isset($args['orders']))?$args['orders']:null; if ( (is_array($tables) && count($tables)>0) || (is_string($tables) && !empty($tables)) ) { //Tables in string if (is_string($tables)) { $tables = explode(',', $tables); } //Fields if(count($fields)>0) { $fields = implode(', ', $fields); } else { $fields = '*'; } //Joint if(is_null($joint)) { $joint = ''; } else { $tmp_joint = ''; for($i=0; $i"; foreach($tables as $key=>$val) { //echo "-->".$val."
"; if($val == $tojoin_table) { unset($tables[$key]); } } $tmp_joint .= ' ' . $joint[$i]['type'] . ' ' . $joint[$i]['table'] . ' ON ' . $joint[$i]['field1'] . ' = ' . $joint[$i]['field2'] . ' '; } $joint = $tmp_joint; } //Tables if(is_array($tables)) { $tables = implode(', ', $tables); } //Conditions if(is_null($conditions)) { $conditions = ''; } else { $conditions = ' WHERE ' . $conditions; } //Group By if(is_null($groupby)) { $groupby = ''; } else { $groupby = ' GROUP BY ' . $groupby; } //Order if(is_null($orders)) { $orders = ''; } else { $tmp = array(); foreach($orders as $field=>$dir) { array_push($tmp, $field . ' ' . $dir); } $orders = ' ORDER BY ' . implode(', ', $tmp); } //Limit if ($length == 0) { $limit = ''; } else { if($database_type == "SQLSERVER") { $limit = 'TOP '.$length; } elseif($database_type == "MYSQL" ) { $limit = ' LIMIT '.$begin.' , '.$length; } elseif($database_type == "POSTGRESQL" ) { $limit = ' OFFSET '.$begin.' LIMIT '.$length; } } //Switch database type if($database_type == "SQLSERVER") { $query = 'SELECT '.$limit . $fields . ' FROM ' . $tables . $joint . $conditions . $groupby . $orders; } elseif($database_type == "MYSQL" ) { $query = 'SELECT ' . $fields . ' FROM ' . $tables . $joint . $conditions . $groupby . $orders . $limit; } elseif($database_type == "POSTGRESQL" ) { $query = 'SELECT ' . $fields . ' FROM ' . $tables . $joint . $conditions . $groupby . $orders . $limit; } //If query only, no execution, return string query if($queryonly) { $result = $query; } else { $this->connect(); $this->query($query); $result=array(); while($line = $this->fetch_array()) { $temp= array(); foreach (array_keys($line) as $resval) { if (!is_int($resval)) { array_push($temp,array('column'=>$resval,'value'=>$line[$resval])); } } array_push($result,$temp); } } } return $result; } /** * insert: Méthode de création d'une requête INSERT. * @access public * @param Array [$args] Tableau des arguments à passer à la requête INSERT (Array: table: listes des tables (1 seule obligatoire), Array fields: liste des champs, Array values: liste des valeurs) * @param boolean [$queryonly] Valeur par défaut (false). Renvoyer la requête seulement * @return mixed Etat de la requête ou requête textuelle */ public function insert($args, $queryonly=false) { $result = false; $table = $args['table']; $values = $this->tiny_resolve_constraints($args['values']); $fields = (isset($args['fields']))?$args['fields']:array(); if(count($fields)>0) { $fields = ' (' . implode(', ', $fields) . ') VALUES'; $values = ' (' . implode(', ', $values) . ') '; } else { $fields = ''; $values = ' (' . implode(', ', $values) . ') '; } $query = 'INSERT INTO ' . $table . $fields . $values . ';'; if($queryonly) { $result = $query; } else { $result = $this->query($query); } return $result; } /** * update: Méthode de création d'une requête UDPATE. * @access public * @param Array [$args] Tableau des arguments à passer à la requête UPDATE (Array: table: listes des tables (1 seule obligatoire), Array fields: liste des champs, Array values: liste des valeurs, string conditions: conditions) * @param boolean [$queryonly] Valeur par défaut (false). Renvoyer la requête seulement * @return mixed Etat de la requête ou requête textuelle */ public function update($args, $queryonly=false) { $result = false; $table = $args['table']; $values = $this->tiny_resolve_constraints($args['values']); $fields = $args['fields']; $conditions = (isset($args['conditions']))?$args['conditions']:null; $update = ''; for($i=0; $iquery($query); } return $result; } /** * delete: Méthode de création d'une requête DELETE. * @access public * @param Array [$args] Tableau des arguments à passer à la requête DELETE (Array: table: listes des tables (1 seule obligatoire), string conditions: conditions) * @param boolean [$queryonly] Valeur par défaut (false). Renvoyer la requête seulement * @return mixed Etat de la requête ou requête textuelle */ public function delete($args, $queryonly=false) { $result = false; $table = $args['table']; $conditions = (isset($args['conditions']))?$args['conditions']:null; if(is_null($conditions)) { $conditions = ''; } else { $conditions = ' WHERE ' . $conditions; } $query = 'DELETE FROM ' . $table . $conditions . ';'; if($queryonly) { $result = $query; } else { $result = $this->query($query); } return $result; } } /** * request_conditions : Cette classe permet de créer une condition à utiliser dans une requête SQL. * * request_conditions contient une série de méthode capable de créer des conditions complexes pour les requêtes SQL * * @file * @author Yves Christian KPAKPO * @date $date$ * @version $Revision$ * @ingroup core */ class request_conditions extends new_request { /** * $tables : Liste des tables * @var Array * @access private */ private $tables = array(); /** * $data : Représentation interne de la liste des conditions * @var Array * @access private */ private $data = array('root'=>array()); /** * __construct: Constructeur de la classe request_conditions. * @access public */ public function __construct() { } /** * add_condition: Méthode permettant d'ajouter une condition. * @access public * @param string [$field] Champ de la condition * @param string [$operator] Opérateur de la condition * @param string [$value] Valeur de la condition * @param string [$typecond] Valeur par défaut (classic). Type de condition * @param string [$dest] Valeur par défaut (root). Destination de la condition */ public function add_condition($field, $operator, $value, $typecond='classic', $dest='root') { $el = array(); $el['type'] = 'cond'; $el['field'] = $field; $el['operator'] = $operator; $el['value'] = $value; switch($typecond) { case 'classic': switch(true) { case preg_match('`(in)|(not in)`i', $el['operator']): $el['value'] = '(' . implode(', ', $this->tiny_resolve_constraints($el['value'])) . ')'; break; case preg_match('`(is null)|(is not null)`i', $el['operator']): $el['value'] = ''; break; default: $el['value'] = $this->tiny_resolve_constraints($el['value']); } break; case 'subquery': case preg_match('`(in)|(not in)`i', $el['operator']): $el['value'] = '(' . $el['value'] . ')'; break; break; } array_push($this->data[$dest], $el); } /** * add_operator: Méthode permettant d'ajouter un opérateur. * @access public * @param string [$operator] Opérateur * @param string [$dest] Valeur par défaut (root). Destination de l'opérateur */ public function add_operator($operator, $dest='root') { $el = array(); $el['type'] = 'operator'; $el['operator'] = $operator; array_push($this->data[$dest], $el); } /** * add_subpriority: Méthode permettant d'ajouter un sous-priorité (une ou plusieurs conditions à l'intérieur de parenthèses). * @access public * @param string [$name] Sous-priorité * @param string [$dest] Valeur par défaut (root). Destination de la sous-priorité */ public function add_subpriority($name, $dest='root') { $el = array(); $el['type'] = 'subpriority'; $el['name'] = $name; $this->data[$name] = array(); array_push($this->data[$dest], $el); } /** * build: Méthode permettant de créer la condition finale. * @access public * @param string [$dest] Valeur par défaut (root). Destination à construire utilisée dans la récursivité * @return string Condition finale */ public function build($dest='root') { $res_array = array(); foreach($this->data[$dest] as $el) { switch($el['type']) { case 'cond': array_push($res_array, $el['field'] . ' ' . $el['operator'] . ' ' . $el['value']); break; case 'operator': array_push($res_array, $el['operator']); break; case 'subpriority': array_push($res_array, '(' . $this->build($el['name']) . ')'); break; } } return implode(' ', $res_array); } } ?>