summaryrefslogtreecommitdiff
path: root/Database/dbmain.php
blob: 43e39ef46cd4c25f8dac279f7262a99bb8634c18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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);
    }
}
?>