diff --git a/manager/Database.php b/manager/Database.php index 7812b48..34e20a1 100755 --- a/manager/Database.php +++ b/manager/Database.php @@ -119,7 +119,7 @@ if( !$oneDimension && isset($fetchData[0]) && is_array($fetchData[0]) ){ // on supprime les doublons des entrées (indice numérique) - for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour tout les utilisateurs + for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour toutes les lignes foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées if( !\mb_detect_encoding($val, 'UTF-8') ) diff --git a/manager/ORM/Rows.php b/manager/ORM/Rows.php index 48d4399..248aaf5 100644 --- a/manager/ORM/Rows.php +++ b/manager/ORM/Rows.php @@ -8,8 +8,9 @@ class Rows{ /* Attributs */ - public $where; // Tableau associatif contenant les conditions - private $schema; // Tableau contenant les informations associées aux données + public $where; // Tableau associatif contenant les conditions + public $select; // Tableau contenant la liste des champs à afficher + private $schema; // Tableau contenant les informations associées aux données /* CONSTRUCTEUR @@ -23,6 +24,9 @@ /* (2) On initialise les conditions */ $this->where = []; + + /* (3) On initialise les champs à retourner */ + $this->select = []; } @@ -171,16 +175,15 @@ - /* RETOURNE UNIQUEMENT LES CHAMPS SELECTIONNES + /* SELECTIONNE UNIQUEMENT LES CHAMPS SELECTIONNES * * @fields Libellé du champ à afficher * - * @return data Tableau contenant les champs sélectionnés - * @return data Valeur du champ sélectionné (si 1 seul champ) + * @return this Retourne l'object courant * */ public function select($fields=[]){ - /* [0] On formatte les champs + /* [1] On formatte les champs =========================================================*/ /* (1) On met en tableau quoi qu'il en soit */ $fields = is_array($fields) ? $fields : [$fields]; @@ -194,6 +197,59 @@ sort($fields); + /* [2] On enregistre la liste des champs + =========================================================*/ + foreach($fields as $f=>$field) + if( !in_array($field, $this->select) ) // On ajoute si pas déja + $this->select[] = $field; + + + /* [3] On retourne l'object courant + =========================================================*/ + return $this; + } + + + + + + + + /* MODIFIE DES ENTREES + * + * @updates Tableau associatif contenant les nouvelles valeurs + * + * @return this Retourne l'objet courant (modifié) + * + */ + public function edit($updates){} + + + + + + /* SUPPRIME LES ENTREES + * + * @return status Retourne si TRUE ou FALSE les entrées ont bien été supprimées + * + */ + public function delete(){} + + + + + + + + /* RETOURNE LES DONNEES / NULL si une erreur survient + * + * @unique VRAI si on veut un seul résultat (itérateur) + * + * @return data Tableau contenant les champs sélectionnés + * @return data Valeur du champ sélectionné (si 1 seul champ) + * + */ + public function fetch($unique=false){ /* [1] On rédige la requête =========================================================*/ @@ -201,12 +257,12 @@ $requestS = "SELECT "; /* (2) Si aucun champ, on sélectionne tous les champs */ - if( count($fields) == 0 ) + if( count($this->select) == 0 ) $requestS .= "* "; /* (3) Sinon, on sélectionne les champs que l'on veut */ else - foreach($fields as $f=>$field) + foreach($this->select as $f=>$field) if( $f == 0 ) $requestS .= $field; else $requestS .= ', '.$field; @@ -244,32 +300,96 @@ /* [6] On retourne le résultat =========================================================*/ - return Database::delNumeric( $request->fetchAll() ); + /* (1) Si unique */ + if( $unique ) + return $this->format( $request->fetch() ); + + /* (2) Si tout */ + return $this->format( $request->fetchAll() ); } - /* MODIFIE DES ENTREES + + /* ON FORMATTE LES DONNEES DE SORTIE * - * @updates Tableau associatif contenant les nouvelles valeurs + * @data Données / Tableau de données * - * @return this Retourne l'objet courant (modifié) + * @return formatted Données formattées / Tableau de données formatté * */ - public function edit($updates){} + private function format($data){ + /* [0] On initialise le processus + =========================================================*/ + /* (0) Initialisation du retour */ + $formatted = $data; + + /* (1) On vérifie qu'il s'agit d'un tableau (non vide) */ + if( !is_array($formatted) || count($formatted) < 1 ) + return $formatted; + + /* (2) On regarde si c'est des données simples */ + $twoDimensions = is_array($formatted[0]); + + /* (3) On regarde s'il s'agit d'un Tableau de données en bonne et due forme */ + if( $twoDimensions ){ + $sameKeys = true; // VRAI si chaque entrée a les mêmes clés + $last_keys = null; // Clés de l'entrée précédente + + foreach($formatted as $i=>$entry){ + if( !is_null($last_keys) && count(array_diff(array_keys($entry), $last_keys)) > 0 ){ // Si différent du précédent, ducoup on est pas bon + $sameKeys = false; + break; + } + + $last_keys = array_keys($entry); + } + + // Si pas les mêmes clés, on a une erreur + if( !$sameKeys ) + return $formatted; + } + /* [1] On retire les doublons à indices numériques + =========================================================*/ + /* (1) Si 1 dimensions, on met en 2 pour traiter tout de la même manière */ + if( !$twoDimensions ) + $formatted = [$formatted]; + + /* (2) On retire les indices numériques */ + + // Pour chaque entrée + foreach($formatted as $i=>$entry) + + // Pour chaque champ + foreach($entry as $index=>$value) + + // Si dans le schéma on applique le type + if( array_key_exists($index, $this->schema['columns']) ){ + + if( $this->schema['columns'][$index]['type'] == 'int' ) + $formatted[$i][$index] = intval( $value ); + else if( $this->schema['columns'][$index]['type'] == 'float' ) + $formatted[$i][$index] = floatval( $value ); + + }else // Si pas dans le schéma, on le retire + unset($formatted[$i][$index]); - /* SUPPRIME LES ENTREES - * - * @return status Retourne si TRUE ou FALSE les entrées ont bien été supprimées - * - */ - public function delete(){} + /* (3) On remet 1 dimension si 1 dimension à la base */ + if( !$twoDimensions ) + $formatted = $formatted[0]; + + /* [2] On retourne le résultat + =========================================================*/ + return $formatted; + + } + } diff --git a/test/automate.php b/test/automate.php index 2c96f29..d46dfc0 100755 --- a/test/automate.php +++ b/test/automate.php @@ -345,7 +345,9 @@ $userTable = Table::get('user') ->getByIdWarehouse(7) - ->select(['mail', 'username', 'firstname']); + ->select(['mail', 'username', 'firstname']) + ->select('id_user') + ->fetch(true); var_dump($userTable);