object_fields[$field]))
$type = $this->object_fields[$field];
$return = false;
switch($type){
case 'key':
case 'object':
case 'integer':
case 'boolean':
$return = intval($value);
break;
case 'string':
case 'timestamp':
case 'longstring':
default:
$return = $this->dbconnector->connection->real_escape_string((string)$value);
break;
}
return $return ;
}
public function __construct(){
$this->dbconnector = MysqlConnector::getInstance();
}
public function __destruct(){
}
// GESTION SQL
/**
* Methode de suppression de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @return Aucun retour
*/
public function destroy()
{
$query = 'DROP TABLE IF EXISTS `'.MYSQL_PREFIX.$this->TABLE_NAME.'`;';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$myQuery = $this->customQuery($query);
}
/**
* Methode de nettoyage de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @return Aucun retour
*/
public function truncate()
{
$query = 'TRUNCATE TABLE `'.MYSQL_PREFIX.$this->TABLE_NAME.'`;';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$myQuery = $this->customQuery($query);
}
/**
* Methode de creation de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @return Aucun retour
*/
public function create(){
$query = 'CREATE TABLE IF NOT EXISTS `'.MYSQL_PREFIX.$this->TABLE_NAME.'` (';
$i=false;
foreach($this->object_fields as $field=>$type){
if($i){$query .=',';}else{$i=true;}
$query .='`'.$field.'` '. $this->sgbdType($type).' NOT NULL';
}
if (isset($this->object_fields_index)){
foreach($this->object_fields_index as $field=>$type){
$query .= ',KEY `index'.$field.'` (`'.$field.'`)';
}
}
if (isset($this->object_fields_uniques)){
foreach($this->object_fields_uniques as $field){
$query .= ',UNIQUE `unique'.$field.'` (`'.$field.'`)';
}
}
$query .= ')
ENGINE InnoDB,
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
;';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$myQuery = $this->customQuery($query);
}
public function massiveInsert($events){
if (empty($events)) return;
$query = 'INSERT INTO `'.MYSQL_PREFIX.$this->TABLE_NAME.'`(';
$i=false;
foreach($this->object_fields as $field=>$type){
if($type!='key'){
if($i){$query .=',';}else{$i=true;}
$query .='`'.$field.'`';
}
}
$query .=') select';
$u = false;
foreach($events as $event){
if($u){$query .=' union select ';}else{$u=true;}
$i=false;
foreach($event->object_fields as $field=>$type){
if($type!='key'){
if($i){$query .=',';}else{$i=true;}
$query .='\''.$this->secure($event->$field, $field).'\'';
}
}
}
$query .=';';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$this->customQuery($query);
}
/**
* Methode d'insertion ou de modifications d'elements de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param Aucun
* @return Aucun retour
*/
public function save($id_field='id'){
if(isset($this->$id_field)){
$query = 'UPDATE `'.MYSQL_PREFIX.$this->TABLE_NAME.'`';
$query .= ' SET ';
$i=false;
foreach($this->object_fields as $field=>$type){
if($i){$query .=',';}else{$i=true;}
$id = $this->$field;
$query .= '`'.$field.'`=\''.$this->secure($id, $field).'\'';
}
$query .= ' WHERE `'.$id_field.'`=\''.$this->$id_field.'\';';
}else{
$query = 'INSERT INTO `'.MYSQL_PREFIX.$this->TABLE_NAME.'`(';
$i=false;
foreach($this->object_fields as $field=>$type){
if($i){$query .=',';}else{$i=true;}
$query .='`'.$field.'`';
}
$query .=')VALUES(';
$i=false;
foreach($this->object_fields as $field=>$type){
if($i){$query .=',';}else{$i=true;}
$query .='\''.$this->secure($this->$field, $field).'\'';
}
$query .=');';
}
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$this->customQuery($query);
$this->$id_field = (!isset($this->$id_field)?$this->dbconnector->connection->insert_id:$this->$id_field);
}
/**
* Méthode de modification d'éléments de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $colonnes=>$valeurs
* @param $colonnes (WHERE) =>$valeurs (WHERE)
* @param $operation="=" definis le type d'operateur pour la requete select
* @return Aucun retour
*/
public function change($columns,$columns2,$operation='='){
$query = 'UPDATE `'.MYSQL_PREFIX.$this->TABLE_NAME.'` SET ';
$i=false;
foreach ($columns as $column=>$value){
if($i){$query .=',';}else{$i=true;}
$query .= '`'.$column.'`=\''.$this->secure($value, $column).'\' ';
}
$query .= $this->getWhereClause($columns2, $operation);
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$this->customQuery($query);
}
/**
* Méthode de selection de tous les elements de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $ordre=null
* @param $limite=null
* @return > $Entity
*/
public function populate($order=null,$limit=null){
$results = $this->loadAll(array(),$order,$limit,'=');
return $results;
}
/**
* Méthode de selection multiple d'elements de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $colonnes (WHERE)
* @param $valeurs (WHERE)
* @param $ordre=null
* @param $limite=null
* @param $operation="=" definis le type d'operateur pour la requete select
* @return > $Entity
*/
public function loadAll($columns,$order=null,$limit=null,$operation="=",$selColumn='*'){
$objects = array();
$whereClause = $this->getWhereClause($columns,$operation);
$query = 'SELECT '.$selColumn.' FROM `'.MYSQL_PREFIX.$this->TABLE_NAME.'` '.$whereClause.' ';
if($order!=null) $query .='ORDER BY '.$order.' ';
if($limit!=null) $query .='LIMIT '.$limit.' ';
$query .=';';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$result = $this->customQuery($query);
if ($result)
while($queryReturn = $result->fetch_assoc()){
$thisClass = get_class($this);
$object = new $thisClass();
foreach($this->object_fields as $field=>$type){
if(isset($queryReturn[$field])) $object->$field = $queryReturn[$field];
}
$objects[] = $object;
unset($object);
}
return $objects;
}
public function loadAllOnlyColumn($selColumn,$columns,$order=null,$limit=null,$operation="="){
$objects = $this->loadAll($columns,$order,$limit,$operation,$selColumn);
if(count($objects)==0)$objects = array();
return $objects;
}
/**
* Méthode de selection unique d'élements de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $colonnes (WHERE)
* @param $valeurs (WHERE)
* @param $operation="=" definis le type d'operateur pour la requete select
* @return $Entity ou false si aucun objet n'est trouvé en base
*/
public function load($columns,$operation='='){
$objects = $this->loadAll($columns,null,1,$operation);
if(!isset($objects[0]))$objects[0] = false;
return $objects[0];
}
/**
* Méthode de selection unique d'élements de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $colonnes (WHERE)
* @param $valeurs (WHERE)
* @param $operation="=" definis le type d'operateur pour la requete select
* @return $Entity ou false si aucun objet n'est trouvé en base
*/
public function getById($id,$operation='='){
return $this->load(array('id'=>$id),$operation);
}
/**
* Methode de comptage des éléments de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @return nombre de ligne dans l'entité'
*/
public function rowCount($columns=null)
{
$whereClause ='';
if($columns!=null){
$whereClause = ' WHERE ';
$i=false;
foreach($columns as $column=>$value){
if($i){$whereClause .=' AND ';}else{$i=true;}
$whereClause .= '`'.$column.'`=\''.$this->secure($value, $column).'\'';
}
}
$query = 'SELECT COUNT(1) FROM `'.MYSQL_PREFIX.$this->TABLE_NAME.'`'.$whereClause;
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$myQuery = $this->customQuery($query);
$number = $myQuery->fetch_array();
return $number[0];
}
/**
* Méthode de suppression d'éléments de l'entité
* @author Valentin CARRUESCO
* @category manipulation SQL
* @param $colonnes (WHERE)
* @param $valeurs (WHERE)
* @param $operation="=" definis le type d'operateur pour la requete select
* @return Aucun retour
*/
public function delete($columns,$operation='='){
$whereClause = '';
$i=false;
foreach($columns as $column=>$value){
if($i){$whereClause .=' AND ';}else{$i=true;}
$whereClause .= '`'.$column.'`'.$operation.'\''.$this->secure($value, $column).'\'';
}
$query = 'DELETE FROM `'.MYSQL_PREFIX.$this->TABLE_NAME.'` WHERE '.$whereClause.' ;';
if($this->debug)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$query.'
'.$this->dbconnector->connection->error;
$this->customQuery($query);
}
public function customQuery($request){
if($this->debugAllQuery)echo '
'.get_class($this).' ('.__METHOD__ .') : Requete --> '.$request.'
'.$this->dbconnector->connection->error;
$result = $this->dbconnector->connection->query($request);
$error = $this->error();
if ($error) {
error_log('Leed error: '.$this->error());
error_log('Leed query: '.$request);
}
return $result;
}
// ACCESSEURS
/**
* Méthode de récuperation de l'attribut debug de l'entité
* @author Valentin CARRUESCO
* @category Accesseur
* @param Aucun
* @return debug
*/
public function getDebug(){
return $this->debug;
}
/**
* Méthode de définition de l'attribut debug de l'entité
* @author Valentin CARRUESCO
* @category Accesseur
* @param $debug
*/
public function setDebug($debug){
$this->debug = $debug;
}
public function getObject_fields(){
return $this->object_fields;
}
/**
* @return VRAI si la table existe, FAUX sinon
*/
public function tableExists() {
$table = MYSQL_PREFIX.$this->TABLE_NAME;
$result = $this->customQuery("SHOW TABLES LIKE '$table'");
$assoc = $result->fetch_assoc();
return !is_null($assoc);
}
/**
* Protège les requêtes contre l'injection
*/
public function escape_string($argument) {
return $this->dbconnector->connection->escape_string($argument);
}
/**
* Méthode de récupération d'un opérateur défini dans la valeur d'un filtre avant réquête
* @author Simon Alberny
* @param Opérateur (ex. : '=', '!=', '<', '<=', '>', '>=')
* @param Valeur ou opérateur valeur (ex. : '1', '< 1')
* @return 0: opérateur, 1: valeur
*/
protected function getCustomQueryOperator($operation_default, $value) {
$valid_operators = array('=','!=','<','<=','>','>=');
$operation = $operation_default;
// Modification de l'opération si contenu dans la valeur du filtre
$value_list = explode(' ', $value);
if((count($value_list) > 0) && (in_array($value_list[0],$valid_operators))) {
$operation = $value_list[0];
$value = $value_list[1];
}
return array($operation, $value);
}
/**
* Définition des clauses du WHERE dans une requête à la base de données
* @author Simon Alberny
* @param Tableau de correspondance colonne => valeur (ex. : array( 'column' => 'value', 'column2' => '!= 2' ) )
* @param Opérateur (ex. : '=', '!=', '<', '<=', '>', '>=')
* @return WHERE...
*/
protected function getWhereClause($columns,$operation) {
$whereClause = '';
$operation_default = $operation;
if($columns!=null && sizeof($columns)!=0){
$whereClause .= ' WHERE ';
$i = false;
foreach($columns as $column=>$value){
$customQueryOperator = $this->getCustomQueryOperator($operation_default, $value);
if($i){$whereClause .=' AND ';}else{$i=true;}
$whereClause .= '`'.$column.'`'.$customQueryOperator[0].'\''.$this->secure($customQueryOperator[1], $column).'\'';
}
}
return $whereClause;
}
public function error() {
return $this->dbconnector->error();
}
}
?>