summaryrefslogtreecommitdiff
path: root/Database
diff options
context:
space:
mode:
authorDebulois <quentin@debulois.fr>2022-02-03 13:02:21 +0100
committerDebulois <quentin@debulois.fr>2022-02-03 13:02:21 +0100
commit5ddf8de3691fde866c5a48b440cffa2990b2014c (patch)
treee19215cb4a699ed767c731f65d3f796b4435530a /Database
Initial commit
Diffstat (limited to 'Database')
-rw-r--r--Database/dbmain.php143
-rw-r--r--Database/meth_dbsearch.php78
-rw-r--r--Database/meth_dbuser.php154
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