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