Skip to content
Snippets Groups Projects
Commit 7059d916 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

Préparation au TP8 et uniformisation de la gestion des erreurs.

parent 9509fe70
No related branches found
No related tags found
No related merge requests found
File added
......@@ -46,4 +46,9 @@ class ControleurAuteur extends ControleurObjet
'pageContent' => $auteur->afficher()
]);
}
public static function definirNationalites(): string
{
return "";
}
}
......@@ -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
......@@ -48,4 +49,9 @@ class ControleurLivre extends ControleurObjet
'pageContent' => $livre->afficher()
]);
}
public static function definirAuteurs(): string
{
return "";
}
}
\ No newline at end of file
......@@ -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"] = "";
......@@ -102,24 +152,36 @@ class ControleurObjet
'properties' => $properties
]);
} 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"],
try {
Objet::modifyObjectById($_POST["tableName"],
[
"name" => $_POST["idName"],
"value" => $_POST["idValue"]
],
$postData);
if($response['status'] === "fail"){
$response['status'] = "danger";
} 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', [
......@@ -132,26 +194,39 @@ class ControleurObjet
{
$pageTitle = "Suppression d'un(e) {$_GET["tableName"]}";
if (!empty($_GET["tableName"]) && !empty($_GET["idName"]) && !empty($_GET["idValue"])) {
$response = Objet::deleteObjectById($_GET["tableName"],
try {
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."
} 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
......@@ -14,39 +14,19 @@ class Objet
}
}
}
/**
* @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
......@@ -57,45 +37,61 @@ class Objet
// 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
{
if (!isAlphaNumeric($tableName)) {
return [
"status" => "fail",
"message" => "Le format du nom de la table est incorrect.",
"columns" => []
];
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,15 +101,16 @@ 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"])) {
return [
......@@ -123,6 +120,7 @@ class Objet
}
// On prépare la requête
$updateQuery = [];
foreach ($columns as $index => $value) {
$updateQuery[] = "$index=:$index";
}
......@@ -134,13 +132,8 @@ class Objet
$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,18 +142,16 @@ class Objet
* @param string $tableName
* @param array $id
* @return array|string[]
* @throws ErrorException
*/
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!"
];
throw new ErrorException("L'identifiant de la table envoyé est incorrect !");
}
// On prépare la requête
......@@ -170,71 +161,23 @@ class Objet
// 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;
throw new ErrorException("L'identifiant donné n'est pas valide.");
}
// On prépare la requête
......@@ -244,9 +187,26 @@ class Objet
// 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
......@@ -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
......
......@@ -5,12 +5,12 @@
@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() }}
<div class="alert alert-{{ $returnMessage["status"] }}" role="alert">
@if(!empty($returnMessage["title"]))
<strong>{{ $returnMessage["title"] }}</strong>
<br>{{ $returnMessage["message"] }}
@else
{{ $response["message"] }}
{{ $returnMessage["message"] }}
@endif
</div>
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment