diff --git a/TP8_web.pdf b/TP8_web.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e5fad7af7b8c5c94bc9dc9ec5cc69ae72f2b35d7 Binary files /dev/null and b/TP8_web.pdf differ diff --git a/controller/ControleurAuteur.php b/controller/ControleurAuteur.php index 5bbaa7e204a877b9bc3fd0d33a89d9f173d210f0..2cabde191b5051afc9b96128d6122e269d06f623 100644 --- a/controller/ControleurAuteur.php +++ b/controller/ControleurAuteur.php @@ -10,12 +10,12 @@ class ControleurAuteur extends ControleurObjet * Charge la page de la liste des auteurs. * @return string */ - public static function lireAuteurs() : string + public static function lireAuteurs(): string { $auteurs = Auteur::getAllAuteurs(); $objects = []; - foreach ($auteurs as $auteur){ + foreach ($auteurs as $auteur) { $object['idName'] = "numAuteur"; $object['idValue'] = $auteur->numAuteur; $object['type'] = "Auteur"; @@ -35,7 +35,7 @@ class ControleurAuteur extends ControleurObjet * Charge la page du détail d'un auteur. * @return string */ - public static function lireAuteur() : string + public static function lireAuteur(): string { if (empty($_GET["numAuteur"])) { die("Le paramètre numAuteur n'est pas spécifié."); @@ -46,4 +46,9 @@ class ControleurAuteur extends ControleurObjet 'pageContent' => $auteur->afficher() ]); } + + public static function definirNationalites(): string + { + return ""; + } } diff --git a/controller/ControleurLivre.php b/controller/ControleurLivre.php index e70b7024faa4016f075490e8dc509289989be88f..48e02257add1e6c2507cdd1eff6a0a473a257b22 100644 --- a/controller/ControleurLivre.php +++ b/controller/ControleurLivre.php @@ -5,6 +5,7 @@ require_once("models/Livre.php"); class ControleurLivre extends ControleurObjet { protected static string $object = "Livre"; + /** * Charge la page de la liste des adhérents. * @return string @@ -15,7 +16,7 @@ class ControleurLivre extends ControleurObjet $livres = Livre::getAllLivres(); $objects = []; - foreach ($livres as $livre){ + foreach ($livres as $livre) { $object['idName'] = "numLivre"; $object['idValue'] = $livre->numLivre; $object['type'] = "Livre"; @@ -48,4 +49,9 @@ class ControleurLivre extends ControleurObjet 'pageContent' => $livre->afficher() ]); } + + public static function definirAuteurs(): string + { + return ""; + } } \ No newline at end of file diff --git a/controller/ControleurObjet.php b/controller/ControleurObjet.php index 7dfa733098803db3c3c36bb0ad32d9e0e4609c3e..6aca10a0a3d1658d2c6276b35125ec083bf78a41 100644 --- a/controller/ControleurObjet.php +++ b/controller/ControleurObjet.php @@ -8,7 +8,6 @@ class ControleurObjet */ public static function createObject(): string { - $createdObject = []; // Si reçoie une requête POST pour créer un objet et qu'on a plus d'une entrée if (!empty($_POST["objectName"]) && count($_POST) > 1) { $columns = []; @@ -18,15 +17,23 @@ class ControleurObjet } } - $createdObject = Objet::addObject($_POST["objectName"], $columns); - if ($createdObject["status"] === "fail") { - $createdObject["status"] = "danger"; // Pour le style Bootstrap + try { + Objet::addObject($_POST["objectName"], $columns); + $createStatus = [ + "status" => "success", + "message" => "Création réussie !" + ]; + } catch (ErrorException $e) { + $createStatus = [ + "status" => "danger", + "title" => "Erreur", + "message" => $e->getMessage() + ]; } } - return view('formulaire-creation-objet', [ 'pageTitle' => 'Créer un objet', - 'insertMessage' => $createdObject + 'insertMessage' => $createStatus ?? [] ]); } @@ -36,8 +43,22 @@ class ControleurObjet */ public static function describeTable(): string { + header('Content-Type: application/json; charset=utf-8'); if (!empty($_GET["tableName"])) { - return json_encode(Objet::describeObject($_GET["tableName"])); + try { + $columns = Objet::describeObject($_GET["tableName"]); + } catch (ErrorException $e) { + return json_encode([ + "status" => "fail", + "message" => json_encode($e->getMessage()), + "columns" => [] + ]); + } + + return json_encode([ + "status" => "success", + "columns" => $columns + ]); } else { return json_encode([ "status" => "fail", @@ -50,8 +71,37 @@ class ControleurObjet public static function modifyObject(): string { if (!empty($_GET["tableName"]) && !empty($_GET["idName"]) && !empty($_GET["idValue"])) { - $object = Objet::getObject($_GET["tableName"], ['name' => $_GET["idName"], 'value' => $_GET["idValue"]]); - $ojectTableDesc = Objet::describeObject($_GET["tableName"]); + try { + $object = Objet::getObject( + $_GET["tableName"], + [ + 'name' => $_GET["idName"], + 'value' => $_GET["idValue"] + ] + ); + } catch (ErrorException $e) { + return view('return-message', [ + 'pageTitle' => "Erreur lors de la récupération de l'objet {$_GET["tableName"]}", + 'returnMessage' => [ + "status" => "danger", + "title" => "Erreur", + "message" => $e->getMessage() + ] + ]); + } + + try { + $objectTableDesc = Objet::describeObject($_GET["tableName"]); + } catch (ErrorException $e) { + return view('return-message', [ + 'pageTitle' => "Erreur lors de la récupération des spécifications de l'objet {$_GET["tableName"]}", + 'returnMessage' => [ + "status" => "danger", + "title" => "Erreur", + "message" => $e->getMessage() + ] + ]); + } $sqlToInputType = [ "int" => "number", @@ -60,7 +110,7 @@ class ControleurObjet ]; $properties = []; - foreach ($ojectTableDesc['columns'] as $column) { + foreach ($objectTableDesc as $column) { // On vérifie que la colonne en question n'est pas une clé primaire // Et qu'elle ne possède pas l'indicateur d'interdiction de modification "%!update%" en commentaire if ($column['Key'] !== "PRI" && !in_array("%!update%", explode(',', $column["Comment"]))) { @@ -80,7 +130,7 @@ class ControleurObjet // Ici on va associer varchar(x) = text, etc. preg_match("/([a-z]*)/", $column["Type"], $sqlTypeMatch); $input["type"] = $sqlToInputType[$sqlTypeMatch[0]]; - $input["value"] = $object["data"][$column["Field"]]; + $input["value"] = $object[$column["Field"]]; // Ici on va rechercher un potentiel commentaire qui ne serait pas un indicateur $input["comment"] = ""; @@ -101,25 +151,37 @@ class ControleurObjet 'pageContent' => "Il manque des paramètres dans l'url.", 'properties' => $properties ]); - } elseif(!empty($_POST["tableName"]) && !empty($_POST["idName"]) && !empty($_POST["idValue"])){ - foreach ($_POST as $index => $value){ - if(!in_array($index, ["action", "tableName", "idName", "idValue"])){ + } elseif (!empty($_POST["tableName"]) && !empty($_POST["idName"]) && !empty($_POST["idValue"])) { + $postData = []; + foreach ($_POST as $index => $value) { + if (!in_array($index, ["action", "tableName", "idName", "idValue"])) { $postData[$index] = $value; } } - $response = Objet::modifyObjectById($_POST["tableName"], - [ - "name" => $_POST["idName"], - "value" => $_POST["idValue"] - ], - $postData); - if($response['status'] === "fail"){ - $response['status'] = "danger"; + try { + Objet::modifyObjectById($_POST["tableName"], + [ + "name" => $_POST["idName"], + "value" => $_POST["idValue"] + ], + $postData); + } catch (ErrorException $e) { + return view('return-message', [ + 'pageTitle' => "Erreur lors de la modification de l'objet {$_GET["tableName"]}", + 'returnMessage' => [ + "status" => "danger", + "title" => "Erreur", + "message" => $e->getMessage() + ] + ]); } - return view('sql-result', [ + return view('return-message', [ 'pageTitle' => "Modification d'un(e) {$_POST["tableName"]}", - 'response' => $response + 'returnMessage' => [ + "status" => "success", + "message" => "Modification réussie !" + ] ]); } return view('simple-data', [ @@ -131,27 +193,40 @@ class ControleurObjet public static function supprimerObjet(): string { $pageTitle = "Suppression d'un(e) {$_GET["tableName"]}"; - if (!empty($_GET["tableName"]) && !empty($_GET["idName"]) && !empty($_GET["idValue"])){ - $response = Objet::deleteObjectById($_GET["tableName"], - [ - "name" => $_GET["idName"], - "value" => $_GET["idValue"] - ]); - if($response){ - return view('simple-data', [ - 'pageTitle' => $pageTitle, - 'pageContent' => "Objet supprimé avec succès." - ]); - }else{ - return view('simple-data', [ - 'pageTitle' => $pageTitle, - 'pageContent' => "Erreur lors de la suppression de l'objet." + if (!empty($_GET["tableName"]) && !empty($_GET["idName"]) && !empty($_GET["idValue"])) { + try { + Objet::deleteObjectById($_GET["tableName"], + [ + "name" => $_GET["idName"], + "value" => $_GET["idValue"] + ]); + } catch (ErrorException $e) { + return view('return-message', [ + 'pageTitle' => "Erreur lors de la suppression de l'objet {$_GET["tableName"]}", + 'returnMessage' => [ + "status" => "danger", + "title" => "Erreur", + "message" => $e->getMessage() + ] ]); } + + return view('return-message', [ + 'pageTitle' => "Suppression d'un objet", + 'returnMessage' => [ + "status" => "success", + "title" => $pageTitle, + "message" => "{$_GET["tableName"]} supprimé avec succès !" + ] + ]); } - return view('simple-data', [ - 'pageTitle' => $pageTitle, - 'pageContent' => "Il manque des paramètres dans l'url." + return view('return-message', [ + 'pageTitle' => "Suppression d'un objet", + 'returnMessage' => [ + "status" => "danger", + "title" => "Erreur", + "message" => "Il manque des paramètres dans l'url" + ] ]); } } \ No newline at end of file diff --git a/models/Objet.php b/models/Objet.php index 468e42937fbf81aa43e63a00610aa83d17ada70e..614f2597d554a83a2450b7cb20723536754db4ed 100644 --- a/models/Objet.php +++ b/models/Objet.php @@ -8,94 +8,90 @@ class Objet { public function __construct($data = null) { - if(!is_null($data)){ - foreach ($data as $key => $value){ + if (!is_null($data)) { + foreach ($data as $key => $value) { $this->$key = $value; } } } - /** - * @param $name - * @return mixed - */ - public function __get($name) - { - return $this->$name ?? null; - } - - /** - * @param $name - * @param $value - * @return void - */ - public function __set($name, $value) - { - $this->$name = $value; - } /** * Permet d'insérer un objet dans la base de données * @param String $tableName * @param array $columns - * @return array|string[] + * @return void + * @throws ErrorException */ - public static function addObject(String $tableName, array $columns) : array + public static function addObject(string $tableName, array $columns): void { - $result["status"] = "success"; - $result["message"] = "$tableName créé avec succès !"; - $validation = Objet::verifyTableAndFormat($tableName, $columns); - if($validation["status"] !== "success"){ - return $validation; + if (!$validation) { + throw new ErrorException("Erreur lors de la vérification de l'existance de la table $tableName et/ou lors de la vérification du format du nom des colonnes."); } // On prépare la requête $queryString = ("INSERT INTO $tableName (" . implode(", ", array_keys($columns)) . ") VALUES (:" . implode(", :", array_keys($columns)) . ")"); $insertQuery = Database::pdo()->prepare($queryString); - try{ + try { // Et on l'exécute $insertQuery->execute($columns); } catch (PDOException $e) { - return [ - "status" => "fail", - "message" => "L'insertion de l'objet a échoué.", - "pdoError" => $e - ]; + throw new ErrorException($e->getMessage()); } + } - return $result; + /** + * Permet de vérifier le format du nom de la table et des nom des colonnes + vérifier l'existance de la table. + * @param String $tableName + * @param array|null $columns + * @return false + * @throws ErrorException + */ + public static function verifyTableAndFormat(string $tableName, array $columns = null): bool + { + // On va vérifier que $tableName est bien en format alphanumérique + if (!isAlphaNumeric($tableName)) { + throw new ErrorException("La table n'existe pas."); + } + + // Maintenant on va vérifier que la table existe + try { + Database::pdo()->query("SELECT 1 FROM $tableName LIMIT 1"); + } catch (PDOException) { + return false; + } + + if (!is_null($columns)) { + // On va vérifier que l'index de chaque est bien en format alphanumérique + foreach ($columns as $index => $value) { + if (!isAlphaNumeric($index)) { + return false; + } + } + } + return true; } /** * Permet de décrire une table représentant un objet. * @param $tableName * @return array + * @throws ErrorException */ - public static function describeObject($tableName) : array + public static function describeObject($tableName): array { - if(!isAlphaNumeric($tableName)){ - return [ - "status" => "fail", - "message" => "Le format du nom de la table est incorrect.", - "columns" => [] - ]; - }else{ - try{ + if (!isAlphaNumeric($tableName)) { + throw new ErrorException("Le format du nom de la table $tableName est incorrect."); + } else { + try { $query = Database::pdo()->query("SHOW FULL COLUMNS FROM $tableName"); $columns = $query->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { - return [ - "status" => "fail", - "message" => $e->getMessage(), - "columns" => [] - ]; + throw new ErrorException($e->getMessage()); } - return [ - "status" => "success", - "columns" => $columns - ]; + return $columns; } } @@ -105,17 +101,18 @@ class Objet * @param array $id * @param array $columns * @return array|string[] + * @throws ErrorException */ - public static function modifyObjectById(String $tableName, array $id, array $columns) : array + public static function modifyObjectById(string $tableName, array $id, array $columns): array { $result["status"] = "success"; $result["message"] = "Modification réussie"; $validation = Objet::verifyTableAndFormat($tableName, $columns); - if($validation["status"] !== "success"){ - return $validation; + if (!$validation) { + throw new ErrorException("Erreur lors de la vérification de l'existance de la table et/ou lors de la vérification du format du nom des colonnes."); } - if(empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])){ + if (empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])) { return [ "status" => "fail", "message" => "L'identifiant de la table envoyé est incorrect!" @@ -123,24 +120,20 @@ class Objet } // On prépare la requête - foreach ($columns as $index => $value){ + $updateQuery = []; + foreach ($columns as $index => $value) { $updateQuery[] = "$index=:$index"; } $queryString = ("UPDATE $tableName SET " . implode(", ", $updateQuery) . " WHERE " . $id["name"] . "=:" . $id["name"]); $insertQuery = Database::pdo()->prepare($queryString); - try{ + try { // Et on l'exécute $insertQuery->execute(array_merge($columns, [ $id["name"] => $id["value"] ])); } catch (PDOException $e) { - return [ - "status" => "fail", - "message" => "La modification de l'objet a échoué.", - "pdoError" => $e - ]; + throw new ErrorException($e->getMessage()); } - return $result; } @@ -149,104 +142,71 @@ class Objet * @param string $tableName * @param array $id * @return array|string[] + * @throws ErrorException */ - public static function getObject(string $tableName, array $id) : array + public static function getObject(string $tableName, array $id): array { $validation = Objet::verifyTableAndFormat($tableName); - if($validation["status"] !== "success"){ - return $validation; + if (!$validation) { + throw new ErrorException("La table $tableName n'existe pas."); } - if(empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])){ - return [ - "status" => "fail", - "message" => "L'identifiant de la table envoyé est incorrect!" - ]; + if (empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])) { + throw new ErrorException("L'identifiant de la table envoyé est incorrect !"); } // On prépare la requête $queryString = ("SELECT * FROM $tableName WHERE " . $id["name"] . "=?"); $insertQuery = Database::pdo()->prepare($queryString); - try{ + try { // Et on l'exécute $insertQuery->execute([$id["value"]]); } catch (PDOException $e) { - return [ - "status" => "fail", - "message" => "La récupération de l'objet a échoué.", - "pdoError" => $e - ]; + throw new ErrorException($e->getMessage()); } - return [ - "status" => "success", - "data" => $insertQuery->fetch(PDO::FETCH_ASSOC) - ]; + return $insertQuery->fetch(PDO::FETCH_ASSOC); } /** - * Permet de vérifier le format du nom de la table et des nom des colonnes + vérifier l'existance de la table. - * @param String $tableName - * @param array|null $columns - * @return array|string[] + * @throws ErrorException */ - public static function verifyTableAndFormat(string $tableName, array $columns = null) : array - { - // On va vérifier que $tableName est bien en format alphanumérique - if(!isAlphaNumeric($tableName)){ - return [ - "status" => "fail", - "message" => "Le format du nom de la table est incorrect." - ]; - } - - // Maintenant on va vérifier que la table existe - try{ - Database::pdo()->query("SELECT 1 FROM $tableName LIMIT 1"); - } catch (PDOException $e) { - return [ - "status" => "fail", - "message" => "La table $tableName ne semble pas exister.", - "pdoError" => $e - ]; - } - - if(!is_null($columns)){ - // On va vérifier que l'index de chaque est bien en format alphanumérique - foreach($columns as $index => $value){ - if(!isAlphaNumeric($index)){ - return [ - "status" => "fail", - "message" => "Le format " . htmlspecialchars($index) . " est incorrect." - ]; - } - } - } - return [ - "status" => "success", - "message" => "Validation réussie." - ]; - } - - public static function deleteObjectById(string $tableName, array $id): bool + public static function deleteObjectById(string $tableName, array $id): void { $validation = Objet::verifyTableAndFormat($tableName); - if($validation["status"] !== "success"){ - return false; + if (!$validation) { + throw new ErrorException("La table $tableName n'existe pas."); } - if(empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])){ - return false; + if (empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])) { + throw new ErrorException("L'identifiant donné n'est pas valide."); } // On prépare la requête $queryString = ("DELETE FROM $tableName WHERE " . $id["name"] . "=?"); $insertQuery = Database::pdo()->prepare($queryString); - try{ + try { // Et on l'exécute $insertQuery->execute([$id["value"]]); } catch (PDOException $e) { - echo $e->getMessage(); - return false; + throw new ErrorException($e->getMessage()); } - return true; + } + + /** + * @param $name + * @return mixed + */ + public function __get($name) + { + return $this->$name ?? null; + } + + /** + * @param $name + * @param $value + * @return void + */ + public function __set($name, $value) + { + $this->$name = $value; } } \ No newline at end of file diff --git a/resources/views/formulaire-creation-objet.php b/resources/views/formulaire-creation-objet.php index 5ea204994ac50fab9087ea56436aebe700e6b508..9cde01f2af10eb090ede1f8ead684c5ae5fdcec0 100644 --- a/resources/views/formulaire-creation-objet.php +++ b/resources/views/formulaire-creation-objet.php @@ -9,9 +9,9 @@ </noscript> @if(!empty($insertMessage)) <div class="alert alert-{{ $insertMessage["status"] }}" role="alert"> - @if(!empty($insertMessage["pdoError"])) - <strong>{{ $insertMessage["message"] }}</strong> - <br>{{ $insertMessage["pdoError"] }} + @if(!empty($insertMessage["title"])) + <strong>{{ $insertMessage["title"] }}</strong> + <br>{{ $insertMessage["message"] }} @else {{ $insertMessage["message"] }} @endif diff --git a/resources/views/return-message.php b/resources/views/return-message.php new file mode 100644 index 0000000000000000000000000000000000000000..9a64688b8ab6b53d6235b6e691947ac38c0289fe --- /dev/null +++ b/resources/views/return-message.php @@ -0,0 +1,17 @@ +@extends('layouts.page-layout') + +@section('title', '{{ $pageTitle }}') + +@section('content') +<div class="container mt-3"> + <h1>{{ $pageTitle }}</h1> + <div class="alert alert-{{ $returnMessage["status"] }}" role="alert"> + @if(!empty($returnMessage["title"])) + <strong>{{ $returnMessage["title"] }}</strong> + <br>{{ $returnMessage["message"] }} + @else + {{ $returnMessage["message"] }} + @endif + </div> +</div> +@endsection \ No newline at end of file diff --git a/resources/views/sql-result.php b/resources/views/sql-result.php deleted file mode 100644 index e8a6ea1d24cb545e73df9aea0564129a174691c4..0000000000000000000000000000000000000000 --- a/resources/views/sql-result.php +++ /dev/null @@ -1,17 +0,0 @@ -@extends('layouts.page-layout') - -@section('title', '{{ $pageTitle }}') - -@section('content') -<div class="container mt-3"> - <h1>{{ $pageTitle }}</h1> - <div class="alert alert-{{ $response["status"] }}" role="alert"> - @if(!empty($response["pdoError"])) - <strong>{{ $response["message"] }}</strong> - <br>{{ $response["pdoError"]->getMessage() }} - @else - {{ $response["message"] }} - @endif - </div> -</div> -@endsection \ No newline at end of file