Refactor 3 DB + ajout de la récupération du semestre courant d'un ETU (traitement à FAIRE) + il faut prendre en compte dans affichage des données

This commit is contained in:
xdrm-brackets 2015-11-10 10:50:43 +01:00
parent e4bde4d031
commit 716afc8565
7 changed files with 272 additions and 139 deletions

View File

@ -7,7 +7,7 @@ require_once __ROOT__.'/manager/repo/semestre.php';
// require_once __ROOT__.'/manager/repo/module.php';
// require_once __ROOT__.'/manager/repo/ue.php';
// require_once __ROOT__.'/manager/repo/note.php';
debug();
// debug();
class DBAccess{};
@ -59,9 +59,24 @@ class DataBase{
/* */
/*************************************************************/
/* SUPPRIME LES VALEURS À CLÉS NUMÉRIQUES DANS UN FETCH D'UNE TABLE DE LA BDD
*
* @fetchData<Array> le résultat d'une $requeteSQL->fetchAll()
*
* @return newFetchData<Array> retourne le tableau donné en paramètre mais sans les valeurs à clés numériques
*
*/
public static function delNumeric($fetchData){
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour tout les utilisateurs
foreach($fetchData[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $fetchData[$i][$col] ); // on le supprime
return $fetchData;
}
@ -82,30 +97,7 @@ class DataBase{
/*** création d'un utilisateur dans la bdd ***/
/*********************************************/
public function creerUtilisateur($identifiant, $prenom, $nom, $mail, $mdp, $droits){
$getLastCount = DataBase::getPDO()->query('SELECT count(identifiant) as count FROM utilisateur');
$lastCount = (int) $getLastCount->fetch()['count'];
// on applique une normalisation
$prenom = ucwords( strtolower($prenom) ); // majuscule à chaque mot sinon minuscule
$nom = strtoupper($nom); // nom en majuscules
$mail = strtolower($mail); // email en minuscules
$mdp = sha1($mdp); // on hash le password
$req = DataBase::getPDO()->prepare("INSERT INTO utilisateur(identifiant, prenom, nom, mail, mdp, droits) VALUES(:identifiant, :prenom, :nom, :mail, :mdp, :droits)");
$req->execute(array(
':identifiant' => $identifiant,
':prenom' => $prenom,
':nom' => $nom,
':mail' => $mail,
':mdp' => $mdp,
':droits' => $droits
));
$getNewCount = DataBase::getPDO()->query('SELECT count(identifiant) as count FROM utilisateur');
$newCount = (int) $getNewCount->fetch()['count'];
if( $newCount > $lastCount ) // si on a bien ajouté un entrée
if( userRepo::creer($identifiant, $prenom, $nom, $mail, $mdp, $droits) ) // si l'utilisateur a bien été créé
return 'success';
else
return 'error';
@ -119,25 +111,24 @@ class DataBase{
public function utilisateurInfo($identifiant){
// si l'utilisateur n'existe pas on retourne 'unknown_user'
if( !($utilisateurUID=userRepo::UID($identifiant)) ) return 'unknown_user';
$getUtilisateurInfo = DataBase::getPDO()->prepare("SELECT identifiant, prenom, nom, mail, droits FROM utilisateur WHERE identifiant = :identifiant");
$getUtilisateurInfo->execute(array( ':identifiant' => $utilisateurUID ));
return $getUtilisateurInfo->fetch(); // retourne les info, si pas de résultat, retourne [FAUX]
return userRepo::info($utilisateurUID);
}
/* retourne le semestre courant d'un étudiant
/* retourne le semestre en cours d'un étudiant
*
* @etudiant<String> l'identifiant (UID) de l'étudiant à ajouter au groupe
*
* @return semestreUID<int> l'UID du semestre courant
*
*/
public static function studentCurrent($etudiant){
return '2';
public static function studentSemestre($etudiant, $semestre_pair, $annee){
if( $semestre = semestreRepo::studentCurrent($etudiant, $semestre_pair, $annee) ) // si on a un résultat
return $semestre;
else
return 'error';
}
/**********************************************************/
@ -210,16 +201,8 @@ class DataBase{
));
$userlist = $appartenance->fetchAll();
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($userlist) ; $i++ ) // pour tout les utilisateurs
foreach($userlist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $userlist[$i][$col] ); // on le supprime
return $userlist; // on retourne le liste d'utilisateurs
// on fetch tous les utilisateurs & on supprime les doublons des entrées (indice numérique)
return DataBase::delNumeric( $appartenance->fetchAll() ); // on retourne le tout
}
@ -604,15 +587,8 @@ class DataBase{
':UEUID' => $UE['id']
));
$modulelist = $getModuleList->fetchAll(); // on récupère la liste des modules
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($modulelist) ; $i++ ) // pour tout les modules
foreach($modulelist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $modulelist[$i][$col] ); // on le supprime
$UEList[$iter]['modules'] = $modulelist; // on ajoute la liste des mdules
// on ajoute la liste des modules en supprimant les valeurs à indinces numériques
$UEList[$iter]['modules'] = DataBase::delNumeric( $getModuleList->fetchAll() );
}
return $UEList;
@ -673,15 +649,8 @@ class DataBase{
':annee' => $annee
));
$modulelist = $getModuleList->fetchAll(); // on récupère la liste des modules
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($modulelist) ; $i++ ) // pour tout les modules
foreach($modulelist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $modulelist[$i][$col] ); // on le supprime
return $modulelist;
// on retourne les modules en supprimant les valeurs à indices numériques
return DataBase::delNumeric( $getModuleList->fetchAll() );
}
@ -739,15 +708,8 @@ class DataBase{
':semestreUID' => $semestreUID
));
$UElist = $getUEList->fetchAll(); // on récupère la liste des modules
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($UElist) ; $i++ ) // pour tout les modules
foreach($UElist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $UElist[$i][$col] ); // on le supprime
return $UElist;
// on retourne la liste d'UEs en supprimant les doublons à clés numériques
return DataBase::delNumeric( $getUEList->fetchAll() );
}
@ -820,15 +782,8 @@ class DataBase{
':annee' => $annee
));
$modulelist = $getModuleList->fetchAll(); // on récupère la liste des modules
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($modulelist) ; $i++ ) // pour tout les modules
foreach($modulelist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $modulelist[$i][$col] ); // on le supprime
$UEList[$iter]['modules'] = $modulelist; // on ajoute la liste des mdules
// on ajoute la liste des modules en supprimant les valeurs à indinces numériques
$UEList[$iter]['modules'] = DataBase::delNumeric( $getModuleList->fetchAll() );
}
return $UEList;
@ -889,15 +844,8 @@ class DataBase{
':annee' => $annee
));
$UElist = $getUEList->fetchAll(); // on récupère la liste des modules
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($UElist) ; $i++ ) // pour tout les modules
foreach($UElist[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $UElist[$i][$col] ); // on le supprime
return $UElist;
// on retourne la liste d'UEs en supprimant les doublons à clés numériques
return DataBase::delNumeric( $getUEList->fetchAll() );
}
@ -1075,7 +1023,7 @@ class DataBase{
// si on a l'UID utilisateur & l'UID groupe => on récupère les modules
$getModuleList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ".
$getNoteList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ".
"FROM note, appartenance as app, semestre as s, module as m, mcc_ue, mcc_module as mcc_m, controle as ctrl ".
"WHERE note.id_appartenance = app.id_appartenance ".
"AND ctrl.id_controle = note.id_controle ".
@ -1092,21 +1040,14 @@ class DataBase{
"AND app.id_etudiant = :etudiantUID ".
"AND s.id_semestre = :semestreUID ".
"ORDER BY ctrl.date_publication ASC");
$getModuleList->execute(array(
$getNoteList->execute(array(
':moduleUID' => $moduleUID,
':etudiantUID' => $etudiantUID,
':semestreUID' => $semestreUID
));
$notes = $getModuleList->fetchAll(); // on récupère la liste des notes
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($notes) ; $i++ ) // pour toutes les notes
foreach($notes[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $notes[$i][$col] ); // on le supprime
return $notes;
// on retourne la liste des notes et supprime les doublons à indices numériques
return DataBase::delNumeric( $getNoteList->fetchAll() );
}
@ -1164,7 +1105,7 @@ class DataBase{
return 'unknown_UE';
// si on a l'UID utilisateur & l'UID UE => on récupère les notes
$getUEList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ".
$getNoteList = DataBase::getPDO()->prepare("SELECT m.nom as module, m.libelle as modulelib, ctrl.intitule, note.valeur, ctrl.base, ctrl.coefficient ".
"FROM note, appartenance as app, semestre as s, module as m, ue, mcc_ue, mcc_module as mcc_m, controle as ctrl ".
"WHERE note.id_appartenance = app.id_appartenance ".
"AND ctrl.id_mcc_module = mcc_m.id_mcc_module ".
@ -1182,21 +1123,14 @@ class DataBase{
"AND app.id_etudiant = :etudiantUID ".
"AND s.id_semestre = :semestreUID ".
"ORDER BY m.nom, ctrl.date_publication ASC");
$getUEList->execute(array(
$getNoteList->execute(array(
':UEUID' => $UEUID,
':etudiantUID' => $etudiantUID,
':semestreUID' => $semestreUID
));
$notes = $getUEList->fetchAll(); // on récupère la liste des notes
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($notes) ; $i++ ) // pour toutes les notes
foreach($notes[$i] as $col => $val) // pour toutes les entrées
if( is_int($col) ) // si l'indice est un entier
unset( $notes[$i][$col] ); // on le supprime
return $notes;
// on retourne la liste de notes et supprime les doublons à indices numériques
return DataBase::delNumeric( $getNoteList->fetchAll() );
}

View File

@ -103,6 +103,33 @@ require_once __ROOT__.'/manager/database.php';
$answer->request = 'permission_error';
break;
/**************************************/
/* retourne le semestre d'un étudiant */
/**************************************/
case 'getSemestre': if( connected() ){
$areSetParam = isset($request->etudiant); // les arguments existent
$typeOkParam = $areSetParam && is_string($request->etudiant); // si c'est des strings
$nEmptyParam = $typeOkParam && strlen($request->etudiant) > 0; // d'au moins 1 caractère
$etudiantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->etudiant); // etudiant (username) bon format
if( $etudiantCheck ){ // si tout les paramètres sont bons
$semestre = DataBase::getInstance()->studentCurrent($request->etudiant, $_SESSION['semestre_pair'], $_SESSION['annee']);
if( is_numeric($semestre) ){ // si c'est un nombre, c'est que c'est bon
$answer->request = 'success';
$answer->semestre = $semestre;
}else
$answer->request = $semestre;
}else
$answer->request = 'param_error';
}else
$answer->request = 'permission_error';
break;
/*******************************************************************/
/* retourne les utilisateurs de tous les groupes du semestre donné */

View File

@ -19,10 +19,8 @@ class groupRepo extends DBAccess{
*
*/
public static function UID($nom){
$db = DataBase::getPDO();
/*** on cherche un groupe avec ce nom ***/
$getGroupeUID = $db->prepare("SELECT id_groupe as id FROM groupe WHERE nom = :nom");
$getGroupeUID = DataBase::getPDO()->prepare("SELECT id_groupe as id FROM groupe WHERE nom = :nom");
$getGroupeUID->execute(array(
':nom' => $nom
));
@ -43,10 +41,8 @@ class groupRepo extends DBAccess{
*
*/
public static function appartenanceUID($etudiant, $groupe, $semestre){
$db = DataBase::getPDO();
/*** on cherche un groupe avec ce nom ***/
$getAppartenanceUID = $db->prepare("SELECT id_appartenance as id ".
$getAppartenanceUID = DataBase::getPDO()->prepare("SELECT id_appartenance as id ".
"FROM appartenance ".
"WHERE id_etudiant = :etudiant ".
"AND id_groupe = :groupe ".
@ -75,8 +71,6 @@ class groupRepo extends DBAccess{
*
*/
public static function creer($nom){
$db = DataBase::getPDO();
/* [1] On vérifie l'existence d'un groupe avec ce nom
======================================================*/
if( $this->UID($nom) ) // si le groupe existe déjà
@ -87,7 +81,7 @@ class groupRepo extends DBAccess{
$nom = strtoupper($nom); // on met le nom en majuscules
// on créé et envoie la requête de création du groupe
$creerGroupe = $db->prepare("INSERT INTO groupe(id_groupe, nom) VALUES(default, :nom)");
$creerGroupe = DataBase::getPDO()->prepare("INSERT INTO groupe(id_groupe, nom) VALUES(default, :nom)");
$creerGroupe->execute(array(
':nom' => $nom
));
@ -109,11 +103,9 @@ class groupRepo extends DBAccess{
*
*/
public static function ajouterMembre($etudiant, $groupe, $semestre){
$db = DataBase::getPDO();
/* [1] On vérifie si l'utilisateur appartient à un groupe pour ce semestre
===========================================================================*/
$dejaMembre = $db->prepare("SELECT id_appartenance as id ".
$dejaMembre = DataBase::getPDO()->prepare("SELECT id_appartenance as id ".
"FROM appartenance ".
"WHERE id_etudiant = :etudiant ".
"AND id_semestre = :semestre ");
@ -127,7 +119,7 @@ class groupRepo extends DBAccess{
/* [2] On modifie l'appartenance
==============================*/
// création et exécution de la requête de modification de l'appartenance
$ajouterMembres = $db->prepare("UPDATE appartenance ".
$ajouterMembres = DataBase::getPDO()->prepare("UPDATE appartenance ".
"SET id_groupe = :groupe ".
"WHERE id_appartenance = :appartenanceUID");
$ajouterMembre->execute(array(
@ -140,7 +132,7 @@ class groupRepo extends DBAccess{
/* [2] On créé l'appartenance
==============================*/
// création et exécution de la requête de création d'appartenance
$ajouterMembres = $db->prepare("INSERT INTO appartenance(id_etudiant, id_groupe, id_semestre) ".
$ajouterMembres = DataBase::getPDO()->prepare("INSERT INTO appartenance(id_etudiant, id_groupe, id_semestre) ".
"VALUES( ".
"(SELECT identifiant FROM utilisateur WHERE identifiant = :etudiant), ".
"(SELECT id_groupe FROM groupe WHERE id_groupe = :groupe), ".

View File

@ -26,10 +26,8 @@ class semestreRepo extends DBAccess{
return false; // aucun résultat possible
$db = DataBase::getPDO();
/*** on cherche un semestre avec ce rang et cette année (qui est forcément unique) ***/
$getSemestreUID = $db->prepare("SELECT id_semestre as id FROM semestre WHERE rang = :rang AND annee = :annee");
$getSemestreUID = DataBase::getPDO()->prepare("SELECT id_semestre as id FROM semestre WHERE rang = :rang AND annee = :annee");
$getSemestreUID->execute(array(
':rang' => $rang,
':annee' => $annee
@ -40,16 +38,63 @@ class semestreRepo extends DBAccess{
}
/* RENVOIE LES INFORMATIONS D'UN SEMESTRE D'UID DONNÉ
*
* @semestreUID<int> l'UID du semestre duquel on veut les infos
*
* @return semestre<Array> tableau associatif contenant tout les champs de la BDD pour ce semestre
*
*/
public static function info($semestreUID){
// on considère que le semestre existe
$getSemestreInfo = DataBase::getPDO()->prepare("SELECT * FROM semestre WHERE id_semestre = :semestreUID");
$getSemestreInfo->execute(array(
':semestreUID' => $semestreUID
));
// on retourne le résultat en supprimant les doublons à indices numériques
return DataBase::delNumeric( $getSemestreInfo->fetch() );
}
/* retourne le semestre courant d'un étudiant
*
* @etudiant<String> l'identifiant (UID) de l'étudiant à ajouter au groupe
*
* @return etudie<Boolean> FALSE si l'étudiant n'est dans aucun semestre en cours
* @return semestreUID<int> l'UID du semestre courant
*
*/
public static function studentCurrent($etudiant){
}
public static function studentCurrent($etudiant, $semestre_pair, $annee){
// on formate les variables
$semestre_pair = ($semestre_pair) ? '1' : '0';
$getSemestreUID = DataBase::getPDO()->prepare("SELECT s.id_semestre as id ".
"FROM semestre as s, appartenance as app ".
"WHERE app.id_semestre = s.id_semestre ".
"AND app.id_etudiant = :etudiant ".
"AND s.annee = :annee ".
"AND s.rang % 2 = :semestre_pair ".
"ORDER BY s.rang DESC");
$getSemestreUID->execute(array(
':etudiant' => $etudiant,
':annee' => $annee,
':semestre_pair' => $semestre_pair
));
// on retourne l'UID du semestre courant
return $getSemestreUID->fetch()['id'];
}

View File

@ -19,10 +19,8 @@ class userRepo extends DBAccess{
*
*/
public static function UID($identifiant){
$db = DataBase::getPDO();
/*** on cherche un utilisateur avec cet identifiant ***/
$getUtilisateurUID = $db->prepare("SELECT identifiant as id FROM utilisateur WHERE identifiant = :identifiant");
$getUtilisateurUID = DataBase::getPDO()->prepare("SELECT identifiant as id FROM utilisateur WHERE identifiant = :identifiant");
$getUtilisateurUID->execute(array(
':identifiant' => $identifiant
));
@ -33,4 +31,88 @@ class userRepo extends DBAccess{
/* RENVOIE LES INFORMATIONS D'UN UTILISATEUR D'UID DONNÉ
*
* @utilisateurUID<int> l'UID de l'utilisateur duquel on veut les infos
*
* @return utilisateur<Array> tableau associatif contenant tout les champs de la BDD pour cet utilisateur
*
*/
public static function info($utilisateurUID){
// on considère que le semestre existe
$getUtilisateurInfo = DataBase::getPDO()->prepare("SELECT identifiant, prenom, nom, mail, droits FROM utilisateur WHERE identifiant = :utilisateurUID");
$getUtilisateurInfo->execute(array(
':utilisateurUID' => $utilisateurUID
));
// on retourne le résultat en supprimant les doublons à indices numériques
return $getUtilisateurInfo->fetch();
}
/* CREE UN NOUVEL UTILISATEUR DANS LA BASE DE DONNES
*
* @identifiant<String> l'identifiant (unique) de l'utilisateur à créer
* @prenom<String> le prénom du nouvel utilisateur
* @nom<String> le nom du nouvel utilisateur
* @mail<String> le mail du nouvel utilisateur
* @mdp<String> le mot de passe du nouvel utilisateur
* @droits<Array> les droits à donner au nouvel utilisateur
*
* @return UID<String> l'UID du nouvel utilisateur s'il a bien été créé
* @return created<Boolean> VRAI si l'utilisateur n'existait pas déjà* et qu'il a bien été créé
* (*) Si aucun autre n'avait le même @identifiant
*
*/
public static function creer($identifiant, $prenom, $nom, $mail, $mdp, $droits){
/* [1] On normalise les données
=================================================================================================*/
foreach($droits as $droit)
if( !is_int( array_search($droit, getPermissions()) ) ) // si le droit n'est pas dans la liste des droits existants
return false; // on retourne une erreur comme quoi le droit est inexistant
$identifiant = strtolower($identifiant); // on met l'identifiant en minuscule
$prenom = ucwords( strtolower($prenom) ); // majuscule à chaque mot sinon minuscule
$nom = strtoupper($nom); // nom en majuscules
$mail = strtolower($mail); // email en minuscules
$mdp = sha1($mdp); // on hash le password (SHA1)
$droits = implode(',', $droits); // on met le droit sous forme de chaine
/* [2] On vérifie que l'utilisateur n'est pas déjà créé
=================================================================================================*/
if( $this->UID($identifiant) ) // si on a un résultat, c'est qu'un utilisateur a déjà cet identifiant (UID)
return false;
/* [3] On créé le nouvel utilisateur
=================================================================================================*/
$creationUtilisateur = DataBase::getPDO()->prepare("INSERT INTO utilisateur(identifiant, prenom, nom, mail, mdp, droits) ".
"VALUES(:identifiant, :prenom, :nom, :mail, :mdp, :droits)");
$creationUtilisateur->execute(array(
':identifiant' => $identifiant,
':prenom' => $prenom,
':nom' => $nom,
':mail' => $mail,
':mdp' => $mdp,
':droits' => $droits
));
/* [4] On vérifie que l'utilisateur a bien été créé
=================================================================================================*/
return $this->UID($identifiant);
}
}

View File

@ -153,7 +153,6 @@ require_once __ROOT__.'/manager/database.php';
* @return Boolean true si l'utilisateur est ok
*/
function user_authentification($username, $password){
// [1] On récupère la liste d'utilisateurs (/src/userlist.json)
$userList = user_getUserList();
@ -165,6 +164,7 @@ require_once __ROOT__.'/manager/database.php';
// [4] On récupère les informations dans la base de données
if( $utilInfo = Database::getInstance()->utilisateurInfo($username) ){ // si l'utilisateur est dans le BDD
$_SESSION['identifiant'] = $utilInfo['identifiant'];
$_SESSION['droits'] = explode(',', $utilInfo['droits']);
@ -175,13 +175,20 @@ require_once __ROOT__.'/manager/database.php';
// on défini si le semestre est pair ou non
$_SESSION['semestre_pair'] = semestrePair(time());
/* TEMPORAIRE */
$_SESSION['semestre'] = '2';
/* on récupère le semestre courant si c'est un étudiant */
if( permission('student') ){
$semestre = DataBase::studentSemestre( $_SESSION['identifiant'], $_SESSION['semestre_pair'], $_SESSION['annee']);
if( is_numeric($semestre) )// si on a bien récupéré le semestre
$_SESSION['semestre'] = ''.$semestre.'';
else
$_SESSION['semestre'] = null;
}
return 'success';
}else
return 'not_in_db';
return 'success';
}else
return 'wrong_password';

View File

@ -1,7 +1,6 @@
<?php define('__ROOT__', dirname(__FILE__) );
require_once __ROOT__.'/manager/security.php';
phpinfo();
/***************/
/*** A FAIRE ***/
@ -48,6 +47,52 @@ require_once __ROOT__.'/manager/security.php';
/*** RETOURNE LE SEMESTRE COURANT D'UN ETUDIANT ***/
require_once __ROOT__.'/manager/groups.php';
$request = new stdClass();
$answer = new stdClass();
$request->level_1 = 'getSemestre';
$request->etudiant = 'mrd1609a';
groups_switch_level_1($request, $answer);
echo var_dump( $answer );
echo "<br><br><br><br><br><br><br>It works !";
@ -66,6 +111,7 @@ require_once __ROOT__.'/manager/security.php';
// echo "<br><br><br><br><br><br><br>It works !";