base_de_donnees; } function setBaseDeDonnees($bdd) { $this->base_de_donnees = $bdd; } // TableNom function getTableNom() { return $this->dao_table_nom; } function setTableNom($tn) { $this->dao_table_nom = $tn; } // Correspondance function 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 a if (!is_null($parametres)) { if (!is_array($parametres)) { $parametres = array('#0' => $parametres); } else { // Ajout d'un # devant chaque clé numérique if (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ériques foreach ($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 '
'.print_r($this, true).''; } } ?>