
Introduction :
Quand une requête SQL est en erreur dans le back end PHP PDO, on peut vouloir voir le message d’erreur SQL s’afficher en direct dans l’application FRONT END angularJs.
Ce problème est insupportable si l’on gère différement les retours des requêtes $http à chaque fois, il faut donc etre géré toujours de la meme manière .
En fait , il s’agit d’un design pattern.
Comment faire :
Etape 1 :Activer l’affichage des erreurs de la connexion PDO : exemple :
$this->bdd = new PDO('mysql:host=' . self::DB_HOST . ';port='. self::PORT . ' ;dbname=' . self::DB_NAME , self::LOGIN , self::PWD);
$this->bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Note : c’est la 2 ème ligne qui importe .
Etape 2 : Créer une fonction avec un try catch dans une classe PHP, exemple :
protected function Update($table, $tab_value, $id) {
try {
$sql = 'UPDATE ' . $table . ' SET ';
// LES NOMS DE CHAMPS ET LEUR VALEUR
if($tab_value) {
foreach($tab_value as $i=>$v){
$sql .= $i.'= :'.$i.', ';
}
} else {
$tab_value = array();
}
// ENLEVER LA DERNIERE VIRGULE
$sql = substr($sql, 0, -2);
$sql .= ' WHERE id_'.$table.' = '.$id;
$req = $this->bdd->prepare($sql);
$req->execute($tab_value);
} catch(PDOException $e) {
die('Erreur : '.$e->getMessage());
}
return true;
}
Note : ici , on remarque qu’elle retourne TRUE, seulement à la fin, mais que le CATCH annulera le TRUE si la requête SQL est en erreur, et que le message d’erreur PDO parviendra bien au FRONT END .
Etape 3 :
Appeler la fonction dans le WEB SERVICE en PHP comme ceci (Exemple):
echo json_encode($user ->Update($table, $tab_value, $id));
Etape 4 : Dans le front end , Gérer l’erreur dans AngularJS :
$http.post(webServicesUrl+'?action=UpdateUser',this.utilisateur)
.then(function (response, status, headers, config) { // return true or the PDO error
if (response.data == "true") {
Notification.error({message: 'ok cest bien TRUE', delay: 5000});
} else {
Notification.error({message: response.data, delay: 5000});
}
}.bind(this));
Note : On remarque que TRUE est un string, et que toute autre réponse que TRUE provenant du back end provoque l’affichage de l’erreur dans le FRONT END .
Conclusion :
Il faut désormais toujours utiliser ce pattern pour les requêtes. AngularJs attends soit un TRUE, soit autre chose, et rien d’autres (pas des 1 et des 0 , par exemple (booléens). En fait, il faut choisir, soit en prends les booléens, mais alors on ne récupère pas le message d’erreur PDO ; soit on fait comme plus haut.
Apparté :
En cas de problème :
En fait, le code n’est pas exactement celui ça décrit dans ce cas, car il y a
- Le web Service
- La classe Users
- La classe Query qui comprends des méthodes génériques private pour updater automatiquement n’importe quelle table sql .
De ce fait, le code exact est :
Dans le web service :
echo json_encode($user ->UpdateUser($data));
( ou $data est un objet)
Dans la classe Users :
return $this->update(self::TABLE,$tab_value,$id);
ou les paramêtres sont l’objet $data scindé en plusieurs variables, dont un tableau, la classe query le nécessite.
Dans la classe query, c’est identique à expliqué au début.