diff options
| author | Debulois <quentin@debulois.fr> | 2022-02-03 13:02:21 +0100 |
|---|---|---|
| committer | Debulois <quentin@debulois.fr> | 2022-02-03 13:02:21 +0100 |
| commit | 5ddf8de3691fde866c5a48b440cffa2990b2014c (patch) | |
| tree | e19215cb4a699ed767c731f65d3f796b4435530a /Database | |
Initial commit
Diffstat (limited to 'Database')
| -rw-r--r-- | Database/dbmain.php | 143 | ||||
| -rw-r--r-- | Database/meth_dbsearch.php | 78 | ||||
| -rw-r--r-- | Database/meth_dbuser.php | 154 |
3 files changed, 375 insertions, 0 deletions
diff --git a/Database/dbmain.php b/Database/dbmain.php new file mode 100644 index 0000000..43e39ef --- /dev/null +++ b/Database/dbmain.php @@ -0,0 +1,143 @@ +<?php +// **************************************************************************** +// Description: Partie commune des deux ensembles de méthodes +// pour la gestion de la BDD +// **************************************************************************** +// Utilisation de PDO: +// https://www.php.net/manual/fr/pdo.connections.php +// +// private: accessible uniquement dans la class +// protected: accesible depuis l'extérieur et donc via extend mais non modifiable +// public: accessible et modifiable depuis l'extérieur +// final: ne peut etre ré-écris (overload) +// +class DbMain { + // Salt pour chiffrement + private $salt = "cTKXHBoN3oxymlhNem2h"; + // Configuration du serveur MYSQL / MARIADB + private $conn; + private $host = "127.0.0.1"; + private $user = "root"; + private $pass = ""; + // Déclaration des tables + private $database = "ExoPhp"; + // UserAccount, infos du compte nécessaire à la connection + // Timestamp auto si non renseigné + private $createTableUserAccount = "userAccount ( + id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + email VARCHAR(128) NOT NULL, + password VARCHAR(128) NOT NULL, + tokenAutoLogin VARCHAR(128), + inscriptionDate TIMESTAMP NOT NULL, + isUser BOOL NOT NULL, + isConsultant BOOL NOT NULL, + isAdmin BOOL NOT NULL + )"; + // Infos complémentaires des utilisateur, liée à userAccount par userId à id + private $createTableUserInfo = "userInfo ( + lastname VARCHAR(128) NOT NULL, + firstname VARCHAR(128) NOT NULL, + job varchar(128), + degree VARCHAR(128), + capability TEXT, + description TEXT, + phoneNumber VARCHAR(10), + adress VARCHAR(128), + zipCode VARCHAR(6), + city VARCHAR(128), + userId INT UNSIGNED PRIMARY KEY, + FOREIGN KEY (userId) + REFERENCES userAccount(id) + )"; + // Infos sur les missions effectuées, liée à userAccount par userId et consultantId à id + private $createTableMission = "mission ( + id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, + date TIMESTAMP NOT NULL, + subject VARCHAR(128), + note INT(1) UNSIGNED, + review TEXT, + userId INT UNSIGNED NOT NULL, + FOREIGN KEY (userId) + REFERENCES userAccount(id), + consultantId INT UNSIGNED NOT NULL, + FOREIGN KEY (consultantId) + REFERENCES userAccount(id) + )"; + + // Noms des tables + protected $tableUserAccount = "userAccount"; + protected $tableUserInfo = "userInfo"; + protected $tableMission = "mission"; + + // Création de la DB si elle n'existe pas + private function create_db() { + $reqInitDb = "CREATE DATABASE IF NOT EXISTS ".$this->database; + $res = $this->conn->prepare($reqInitDb); + $res->execute(); + } + + // Sélection de la DB + private function select_db() { + $reqSelectDb = "USE ".$this->database; + $res = $this->conn->prepare($reqSelectDb); + $res->execute(); + } + + // Création des tables si elles n'existent pas + private function create_table() { + $reqInitUserAccount = "CREATE TABLE IF NOT EXISTS ".$this->createTableUserAccount; + $res = $this->conn->prepare($reqInitUserAccount); + $res->execute(); + $reqInitUserInfo = "CREATE TABLE IF NOT EXISTS ".$this->createTableUserInfo; + $res = $this->conn->prepare($reqInitUserInfo); + $res->execute(); + $reqInitMission = "CREATE TABLE IF NOT EXISTS ".$this->createTableMission; + $res = $this->conn->prepare($reqInitMission); + $res->execute(); + } + + // Déclenche les méthodes pour créer la BDD + private function init() { + $this->create_db(); + $this->select_db(); + $this->create_table(); + } + + // Chiffre la data reçue + final public function crypt_pass($pass) { + $crypt = crypt($pass, $this->salt); + return $crypt; + } + + // Prépare la requète pour mitiger (se protéger) les injections SQL et + // initialise si nécessaire la BDD à chaque requète + final public function exec_cmd($req, $arg) { + $this->init(); + $res = $this->conn->prepare($req); + $res->execute($arg); + return $res; + } + + // Vérifie si l'email existe dans la table userAccount de la BDD + final public function check_exist_email($email) { + $reqCheckEmailExist = "SELECT EXISTS(SELECT * FROM ".$this->tableUserAccount." WHERE email = ?)"; + $data = $this->exec_cmd($reqCheckEmailExist, array($email))->fetchAll(PDO::FETCH_NUM); + // Retourne 1 si existe, sinon 0 + return $data[0][0]; + } + + // Vérifie si l'id est un consultant dans la table userAccount de la BDD + final public function check_exist_consultant($id) { + $reqCheckExistConsultant = "SELECT EXISTS(SELECT * FROM ".$this->tableUserAccount." WHERE id = ? AND isConsultant = '1')"; + $data = $this->exec_cmd($reqCheckExistConsultant, array($id))->fetchAll(PDO::FETCH_NUM); + // Retourne 1 si existe, sinon 0 + return $data[0][0]; + } + + // Fonction "auto", déclenchée à l'instanciation + final public function __construct() { + // Essaie de se connecter a la BDD + $this->conn = new PDO("mysql:host=".$this->host, $this->user, $this->pass); + } +} +?>
\ No newline at end of file diff --git a/Database/meth_dbsearch.php b/Database/meth_dbsearch.php new file mode 100644 index 0000000..0a325aa --- /dev/null +++ b/Database/meth_dbsearch.php @@ -0,0 +1,78 @@ +<?php +// **************************************************************************** +// Description: Ensemble de méthodes pour étendre dbmain afin +// d'effectuer des recherches dans la bdd +// **************************************************************************** +// Infos pour les "join": +// https://www.freecodecamp.org/news/sql-joins-tutorial/ +// +// Import de dbmain +require_once(dirname( __FILE__ )."/dbmain.php"); +// Extension de cette classe avec dbmain +class DbSearch extends DbMain { + // Récupérer toutes les infos de la table userAccount + final public function search_all() { + $reqGetAll = "SELECT * FROM ".$this->tableUserAccount; + $data = $this->exec_cmd($reqGetAll, array())->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Récupération des infos d'un compte par son id + final public function search_user_by_id($id) { + $reqSearchUser = "SELECT id, email, inscriptionDate, isAdmin, isUser, isConsultant + FROM ".$this->tableUserAccount." WHERE id = ?"; + $data = $this->exec_cmd($reqSearchUser, array($id))->fetch(PDO::FETCH_ASSOC); + return $data; + } + + // Récupération des infos d'un utilisateur par son id + final public function get_user_info_by_id($id) { + $reqGetUserInfo = "SELECT lastname, firstname, job, degree, + capability, description, phoneNumber, + adress, zipCode, city + FROM ".$this->tableUserInfo." WHERE userId = ?"; + $data = $this->exec_cmd($reqGetUserInfo, array($id))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Récupération des infos d'un consultant par son nom + final public function search_consultant_by_name($research) { + $reqSearchConsultant = "SELECT id, lastname, firstname, job, capability FROM ".$this->tableUserInfo." + INNER JOIN ".$this->tableUserAccount." + ON ".$this->tableUserInfo.".userId = ".$this->tableUserAccount.".id + WHERE isConsultant = '1' AND lastname LIKE CONCAT('%', ?, '%')"; + $data = $this->exec_cmd($reqSearchConsultant, array($research))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Récupération des notes d'un consultant par son nom + final public function get_consultant_note_by_name($name) { + $reqCountMission = "SELECT note FROM ".$this->tableMission." + INNER JOIN ".$this->tableUserInfo." + ON ".$this->tableMission.".consultantId = ".$this->tableUserInfo.".userId + WHERE lastname = ?"; + $data = $this->exec_cmd($reqCountMission, array($name))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Récupérations des missions d'un consultant par son id + final public function get_all_mission_by_id($id) { + $reqGetAllMission = "SELECT subject, note, review, lastname FROM ".$this->tableMission." + INNER JOIN ".$this->tableUserInfo." + ON ".$this->tableMission.".userId = ".$this->tableUserInfo.".userId + WHERE consultantId = ?"; + $data = $this->exec_cmd($reqGetAllMission, array($id))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } + + // Compte le nombre de mission d'un consultant par son nom + final public function count_consultant_mission_by_name($name) { + $reqCountMission = "SELECT COUNT(*) FROM ".$this->tableMission." + INNER JOIN ".$this->tableUserInfo." + ON ".$this->tableMission.".consultantId = ".$this->tableUserInfo.".userId + WHERE lastname = ?"; + $data = $this->exec_cmd($reqCountMission, array($name))->fetchAll(PDO::FETCH_ASSOC); + return $data; + } +} +?>
\ No newline at end of file diff --git a/Database/meth_dbuser.php b/Database/meth_dbuser.php new file mode 100644 index 0000000..8e6ec35 --- /dev/null +++ b/Database/meth_dbuser.php @@ -0,0 +1,154 @@ +<?php +// **************************************************************************** +// Description: Ensemble de méthodes pour étendre dbmain +// afin de gérer les utilisateurs +// **************************************************************************** +// +// Import de dbmain +require_once(dirname( __FILE__ )."/dbmain.php"); +// Extension de cette classe avec dbmain +class DbUser extends DbMain { + // Enregistrement d'un nouvel utilisateur + final public function add_user($email, $pass, $is_admin, $is_user, $is_consultant) { + // On vérifie si l'email existe deja dans la bdd + $exist = $this->check_exist_email($email); + // Si non + if (!$exist) { + // Chiffrement du pass + $crypt = $this->crypt_pass($pass); + // Préparation de la requète + $reqAddUser = "INSERT INTO ".$this->tableUserAccount." + (email, password, inscriptionDate, isAdmin, isUser, isConsultant) + VALUES (?, ?, ?, ?, ?, ?)"; + // Execution de la requète + $this->exec_cmd($reqAddUser, + array($email, + $crypt, + date("Y-m-d H:i:s"), + $is_admin, + $is_user, + $is_consultant + ) + ); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Suppresion d'un utilisateur + final public function del_user($id) { + // Préparation de la requète pour voir si l'utilisateur existe + $reqCheckExistId = "SELECT EXISTS(SELECT * FROM ".$this->tableUserAccount." WHERE id = ?)"; + // Exécution de la requète + $data = $this->exec_cmd($reqCheckExistId, array($id))->fetchAll(PDO::FETCH_NUM); + // Si il existe + if ($data[0][0]) { + // Préparation de la requète pour suppression + $reqDelUser = "DELETE FROM ".$this->tableUserAccount." WHERE id = ?"; + // Exécution de la requète + $this->exec_cmd($reqDelUser, array($id)); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Mise à jour des infos d'un utilisateur + final public function update_user_info($lastname, $firstname, $job, $degree, + $capability, $description, $phoneNumber, + $adress, $zipCode, $city, $userId) { + // Préparation de la requète pour mise à jour des infos + $reqAddInfo = "REPLACE INTO ".$this->tableUserInfo." + (lastname, firstname, job, degree, capability, + description, phoneNumber, adress, zipCode, city, userId) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + // Exécution de la requète + $this->exec_cmd($reqAddInfo, + array($lastname, $firstname, $job, $degree, + $capability, $description, $phoneNumber, + $adress, $zipCode, $city, $userId + ) + ); + } + + // Enregistrement d'une mission + final public function register_mission($subject, $note, $review, $userId, $consultantId) { + // Vérification de l'existance de l'id de consultant + $exist = $this->check_exist_consultant($consultantId); + // Si il existe + if ($exist) { + // Préparation de la requète pour enregistrement de la mission + $reqAddMission = "INSERT INTO ".$this->tableMission." + (date, subject, note, review, userId, consultantId) + VALUES (?, ?, ?, ?, ?, ?)"; + // Exécution de la requète + $this->exec_cmd($reqAddMission, + array(date("Y-m-d H:i:s"), $subject, + $note, $review, + $userId, $consultantId + ) + ); + // Retourne 1 pour réussite + return 1; + } else { + // Retourne 0 pour échec + return 0; + } + } + + // Vérification de la combinaison email - pass pour authentification + final public function check_credential($email, $pass) { + // Préparation de la requète pour récupérer les infos ou l'email est présent + $reqCheckCredential = "SELECT id, password + FROM ".$this->tableUserAccount." WHERE email = ? "; + // Chiffrement du mot de passe + $crypt = $this->crypt_pass($pass); + // Execution de la requète + $data = $this->exec_cmd($reqCheckCredential, array($email))->fetchAll(PDO::FETCH_ASSOC); + // Vérifiaction de correspondance email & pass + foreach ($data as $rows) { + if ($rows["password"] == $crypt) { + return $rows["id"]; + } + } + } + + // Vérification de la combinaison email - jeton d'auto-login pour authentification + final public function check_token_autologin($email, $token) { + // Préparation de la requète pour récupérer les infos ou l'email est présent + $reqCheckToken = "SELECT id, tokenAutoLogin + FROM ".$this->tableUserAccount." WHERE email = ?"; + // Exécution de la requète + $data = $this->exec_cmd($reqCheckToken, array($email))->fetchAll(PDO::FETCH_ASSOC); + // Vérifiaction de correspondance email & jeton d'auto-connection + foreach ($data as $rows) { + if ($rows["tokenAutoLogin"] == $token) { + return $rows["id"]; + } + } + } + + // Mise à jour du jeton d'auto-login + final public function update_token_autologin($email, $token) { + // Préparation de la requète pour mise à jour du jeton d'auto-connection + $reqUpdateToken = "UPDATE ".$this->tableUserAccount." SET tokenAutoLogin = ? + WHERE email = ?"; + // Execution de la requète + $this->exec_cmd($reqUpdateToken, array($token, $email))->fetchAll(PDO::FETCH_ASSOC); + } + + // Supression du jeton d'auto-login + final public function delete_token_autologin($email) { + // Préparation de la requète pour supression du jeton d'auto-connection + $reqDeleteToken = "UPDATE ".$this->tableUserAccount." SET tokenAutoLogin = NULL + WHERE email = ?"; + // Execution de la requète + $this->exec_cmd($reqDeleteToken, array($email))->fetchAll(PDO::FETCH_ASSOC); + } +} +?>
\ No newline at end of file |
