Rev 173 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpabstract class aGttSql {/*** Attributs : */private $base_de_donnees = GTT_BDD_NOM;protected $table_nom;protected $correspondance;/*** Accesseurs : */// Base De Donneesfunction getBaseDeDonnees(){return $this->base_de_donnees;}function setBaseDeDonnees($bdd){$this->base_de_donnees = $bdd;}// TableNomfunction getTableNom(){return $this->dao_table_nom;}function setTableNom($tn){$this->dao_table_nom = $tn;}// Correspondancefunction getCorrespondance($champ = null){if (!is_null($champ)) {return $this->dao_correspondance[$champ];}return $this->dao_correspondance;}function setCorrespondance($c){$this->dao_correspondance = $c;}/*** Méthodes : *//** Instancie un objet utilisateur à partir d'un enregistrement issu de la base de donnée ou l'inverse.* Cette métohode permet de s'abstraire des noms des champs présent dans la base de donnée.*/protected function basculerEnregistrementObjet($donnees, $instancier = false){$classe = get_class($this);if (is_array($donnees)) {if ($instancier) {foreach ($this->getCorrespondance() as $champ => $attribut) {if (isset($donnees[$champ]) && !is_null($donnees[$champ])) {$methode = $this->donnerMethodeSetAvecAttribut($attribut);$this->$methode($donnees[$champ]);}}} else {$Objet = new $classe;foreach ($this->getCorrespondance() as $champ => $attribut) {if (isset($donnees[$champ]) && !is_null($donnees[$champ])) {$methode = $this->donnerMethodeSetAvecAttribut($attribut);$Objet->$methode($donnees[$champ]);}}return $Objet;}} else if ($donnees instanceof $classe) {$enregistrement = array();foreach ($this->getCorrespondance() as $champ => $attribut) {$methode = $this->donnerMethodeGetAvecAttribut($attribut);if (method_exists($donnees, $methode)) {if (!is_null($donnees->$methode())) {$enregistrement[$champ] = $donnees->$methode();}}}return $enregistrement;}}private function donnerMethodeGetAvecAttribut($attribut){return 'get'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));}private function donnerMethodeGetAvecChamp($champ){return 'get'.str_replace(' ', '', ucwords(str_replace('_', ' ', $this->getCorrespondance($champ))));}private function donnerMethodeSetAvecAttribut($attribut){return 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));}private function donnerMethodeSetAvecChamp($champ){return 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $this->getCorrespondance($champ))));}/*** Consulter un ou plusieurs enregistrements dans la base de données.* Chaque requête comportant des paramêtre doivent les inclures sous la forme "#0" pour le paramêtre 0,* puis "#1" pour le paramêtre 1 et ainsi de suite.* Exemple : SELECT * FROM gestion_projet WHERE gp_id_projet = #0* ou SELECT * FROM gestion_projet WHERE gp_nom_projet = "#0"* @return mixed false, un objet, un tableau d'objet ou rien et instancie l'objet courant.*/public function consulter($requete = '', $parametres = null, $instancier = false){// Formatage de la requête avec les paramêtres s'il y en aif (!is_null($parametres)) {if (!is_array($parametres)) {$parametres = array('#0' => $parametres);} else {// Ajout d'un # devant chaque clé numériqueif (count($parametres) > 0) {foreach ($parametres as $c => $v) {$parametres['#'.$c] = $v;}}}// les indices numériques contiennent des copies des valeurs présentes// dans les indices [#0], [#1]... => wtf ? si le préfixe de table// contient un chiffre, celui-ci sera remplacé et tout va péter// => bricolage cracra, on enlève tous les indices numériquesforeach ($parametres as $k => &$v) {if (is_numeric($k)) {unset($parametres[$k]);}}// Remplacement dans la requete par les valeurs des paramêtres$requete = strtr($requete, $parametres);}if (GTT_DEBOGAGE_SQL) {trigger_error($requete, E_USER_NOTICE);}$tps = microtime(true);$resultat = $GLOBALS['db']->query($requete);$GLOBALS['_GTT_']['chrono']->setTempsSql($tps, microtime(true));(DB::isError($resultat)) ? trigger_error(GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete), E_USER_ERROR) : '' ;$tab_resultat = array();while ($donnees =& $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {$tab_resultat[] = $this->basculerEnregistrementObjet($donnees, $instancier);}$resultat_nbre = count($tab_resultat);if ($resultat_nbre >= 1) {return $tab_resultat;} else if ($resultat_nbre == 0) {return false;}}/*** Ajouter un enregistrement dans la base de données.* @return true si ok, false si aucun enregistrement effectué*/public function ajouter(){$enregistrement = $this->basculerEnregistrementObjet($this);$sql_attributs = '';$sql_valeurs = '';foreach($enregistrement as $champ => $val) {if (!is_numeric($val)) {$val = '"'.$val.'"';}$sql_attributs .= $champ.', ';$sql_valeurs .= $val.', ';}$sql_attributs = trim($sql_attributs, ', ');$sql_valeurs = trim($sql_valeurs, ', ');$requete = 'INSERT INTO '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' '.'( '.$sql_attributs.' ) '.'VALUES '.'( '.$sql_valeurs.' )';if (GTT_DEBOGAGE_SQL) {trigger_error($requete, E_USER_NOTICE);}$tps = microtime(true);$resultat = $GLOBALS['db']->query($requete);$GLOBALS['_GTT_']['chrono']->setTempsSql($tps, microtime(true));(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;$nbre_enregistrement_ajoute = $GLOBALS['db']->affectedRows();if ($nbre_enregistrement_ajoute == 1) {return true;} elseif ($nbre_enregistrement_ajoute == 0) {return false;}}/*** Modifier un enregistrement dans la base de données.* @param object l'ancien objet contenant les valeurs de clés primaires non modifiées. Laissé vide si on ne modifie pas les clés.* @return true si ok, false si aucun enregistrement effectué.*/public function modifier($Ancien = null){$enregistrement = $this->basculerEnregistrementObjet($this);$sql_where = '';$sql_set = '';foreach($enregistrement as $champ => $val) {if (!is_numeric($val)) {$val = '"'.$val.'"';}$sql_set .= $champ.' = '.$val.', ';$classe = get_class($this);if ($Ancien instanceof $classe) {$methode = $this->donnerMethodeGetAvecChamp($champ);$val = $Ancien->$methode();if (!is_numeric($val)) {$val = '"'.$val.'"';}}if (preg_match('/_id_/', $champ)) {$sql_where .= $champ.' = '.$val.' AND ';}}$sql_set = trim($sql_set, ', ').' ';$sql_where = trim($sql_where, ' AND ').' ';$requete = 'UPDATE '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' SET '.$sql_set.'WHERE '.$sql_where;if (GTT_DEBOGAGE_SQL) {trigger_error($requete, E_USER_NOTICE);}$tps = microtime(true);$resultat = $GLOBALS['db']->query($requete);$GLOBALS['_GTT_']['chrono']->setTempsSql($tps, microtime(true));(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;$nbre_enregistrement_ajoute = $GLOBALS['db']->affectedRows();if ($nbre_enregistrement_ajoute == 1) {return true;} elseif ($nbre_enregistrement_ajoute == 0) {return false;}}/*** Supprimer un enregistrement dans la base de données.* @return true si ok, false si aucun enregistrement effectué*/public function supprimer(){$enregistrement = $this->basculerEnregistrementObjet($this);$sql_where = '';foreach($enregistrement as $champ => $val) {if (!is_numeric($val)) {$val = '"'.$val.'"';}//if (preg_match('/_id_/', $champ)) {$sql_where .= $champ.' = '.$val.' AND ';//}}$sql_where = trim($sql_where, ' AND ').' ';$requete = 'DELETE FROM '.$this->getBaseDeDonnees().'.'.$this->getTableNom().' WHERE '.$sql_where ;if (GTT_DEBOGAGE_SQL) {trigger_error($requete, E_USER_NOTICE);}$tps = microtime(true);$resultat = $GLOBALS['db']->query($requete);$GLOBALS['_GTT_']['chrono']->setTempsSql($tps, microtime(true));(DB::isError($resultat)) ? die (GestionnaireErreur::retournerErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;$nbre_enregistrement_suppr = $GLOBALS['db']->affectedRows();if ($nbre_enregistrement_suppr == 1) {return true;} elseif ($nbre_enregistrement_suppr == 0) {return false;}}/** Mettre à NULL les champs de l'objet*/public function initialiser(){foreach ($this->getCorrespondance() as $champ => $attribut) {$methode = $this->donnerMethodeSetAvecAttribut($attribut);$this->$methode(null);}}/** Afficher l'objet courrant. */public function afficher(){echo '<pre>'.print_r($this, true).'</pre>';}}?>