Gestion du TYPAGE + de la suppression des INDICES NUMERIQUES (et inconnus) + gestion de la récupération UNIQUE/MULTIPLE

This commit is contained in:
xdrm-brackets 2016-07-22 19:51:03 +02:00
parent 28ee595406
commit 6a0d92ef28
3 changed files with 143 additions and 21 deletions

View File

@ -119,7 +119,7 @@
if( !$oneDimension && isset($fetchData[0]) && is_array($fetchData[0]) ){ if( !$oneDimension && isset($fetchData[0]) && is_array($fetchData[0]) ){
// on supprime les doublons des entrées (indice numérique) // 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 foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées
if( !\mb_detect_encoding($val, 'UTF-8') ) if( !\mb_detect_encoding($val, 'UTF-8') )

View File

@ -9,6 +9,7 @@
/* Attributs */ /* Attributs */
public $where; // Tableau associatif contenant les conditions 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 private $schema; // Tableau contenant les informations associées aux données
@ -23,6 +24,9 @@
/* (2) On initialise les conditions */ /* (2) On initialise les conditions */
$this->where = []; $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<Array> Libellé du champ à afficher * @fields<Array> Libellé du champ à afficher
* *
* @return data<Array> Tableau contenant les champs sélectionnés * @return this<Rows> Retourne l'object courant
* @return data<mixed> Valeur du champ sélectionné (si 1 seul champ)
* *
*/ */
public function select($fields=[]){ public function select($fields=[]){
/* [0] On formatte les champs /* [1] On formatte les champs
=========================================================*/ =========================================================*/
/* (1) On met en tableau quoi qu'il en soit */ /* (1) On met en tableau quoi qu'il en soit */
$fields = is_array($fields) ? $fields : [$fields]; $fields = is_array($fields) ? $fields : [$fields];
@ -194,6 +197,59 @@
sort($fields); 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<Array> Tableau associatif contenant les nouvelles valeurs
*
* @return this<Rows> Retourne l'objet courant (modifié)
*
*/
public function edit($updates){}
/* SUPPRIME LES ENTREES
*
* @return status<Boolean> 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<Boolean> VRAI si on veut un seul résultat (itérateur)
*
* @return data<Array> Tableau contenant les champs sélectionnés
* @return data<mixed> Valeur du champ sélectionné (si 1 seul champ)
*
*/
public function fetch($unique=false){
/* [1] On rédige la requête /* [1] On rédige la requête
=========================================================*/ =========================================================*/
@ -201,12 +257,12 @@
$requestS = "SELECT "; $requestS = "SELECT ";
/* (2) Si aucun champ, on sélectionne tous les champs */ /* (2) Si aucun champ, on sélectionne tous les champs */
if( count($fields) == 0 ) if( count($this->select) == 0 )
$requestS .= "* "; $requestS .= "* ";
/* (3) Sinon, on sélectionne les champs que l'on veut */ /* (3) Sinon, on sélectionne les champs que l'on veut */
else else
foreach($fields as $f=>$field) foreach($this->select as $f=>$field)
if( $f == 0 ) $requestS .= $field; if( $f == 0 ) $requestS .= $field;
else $requestS .= ', '.$field; else $requestS .= ', '.$field;
@ -244,32 +300,96 @@
/* [6] On retourne le résultat /* [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<Array> Tableau associatif contenant les nouvelles valeurs * @data<Array> Données / Tableau de données
* *
* @return this<Rows> Retourne l'objet courant (modifié) * @return formatted<Array> 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 /* (3) On remet 1 dimension si 1 dimension à la base */
* if( !$twoDimensions )
* @return status<Boolean> Retourne si TRUE ou FALSE les entrées ont bien été supprimées $formatted = $formatted[0];
*
*/ /* [2] On retourne le résultat
public function delete(){} =========================================================*/
return $formatted;
}
} }

View File

@ -345,7 +345,9 @@
$userTable = $userTable =
Table::get('user') Table::get('user')
->getByIdWarehouse(7) ->getByIdWarehouse(7)
->select(['mail', 'username', 'firstname']); ->select(['mail', 'username', 'firstname'])
->select('id_user')
->fetch(true);
var_dump($userTable); var_dump($userTable);