JeuWeb - Crée ton jeu par navigateur
Gestion d'affichage d'erreur - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Gestion d'affichage d'erreur (/showthread.php?tid=1737)

Pages : 1 2 3


Gestion d'affichage d'erreur - Hell-AstiK - 20-12-2010

Bonjour,
le titre ne vous dit peut être pas quelques choses, ce que je souhaite réaliser c'est une page php ou je liste toute les erreurs possible qui peuvent être afficher a un joueur/visiteurs (etc...) sur mon site.
lorsqu'une erreur survient (par exemple formulaire non rempli), je désigne $erreur[16].
je redirige le visiteur vers ce formulaire avec l'id 16 dans l'url (ou alors en post si possible).
et j'affiche l'erreur.

Vous me dirais : AJAX !
Oui, certe, mais je ne veut pas l'utiliser, car je n'utilise pas forcement ces erreur que pour des formulaire, ca devient compliqué après, surtout que moi et l'ajax.. :heuuu:

En gros voici avec plus de details :
L'utilisateur est sur la page inscription.php, il fait une erreur (ici on va prendre comme exemple, de valider la page sans avoir rentrée de données).
donc dans check_inscription.php cela correspond à l'erreur $erreur[16].
Toujours dans check_inscription.php, si une erreur existe, je redirige vers inscription.php avec l'id de l'erreur 16 en url (inscription.php?erreur=16) ou en post.
Si il n'y a pas d'erreur, je fait mes requête (ici, insertion du membre dans la BDD).

Ce que je n'arrive pas a faire :
C'est de lister les erreurs que le visiteur fait, de mettre ces id dans l'url (ou en post) et de rediriger avec ces id dans l'url (inscription.php?erreur=2,5,9 etc...)

et de récupérer ces id qui sont dans l'url pour afficher leur erreurs.

Ce pseudo n'est pas disponible
Vous devez indiquer un mot de passe
Cette adresse Email est invalide

Ce que j'avais fait avant, m'afficher toute la liste des erreur (la page idErreurs.php) or je ne veut que les erreurs voulu via leur id.

j'espère que vous avez compris ou je veut en arriver, je vous montre maintenant mon code

Ici, la page ou je liste les erreurs :
idErreurs.php

<?php
// Toute les id, et leurs descriptions de toutes les erreurs qui peuvent être affichées.
$erreur = array();

$erreur[00] = "";

# inscription.php
# check_inscription.php
$erreur[01] = "Vous devez indiquer un pseudo";
$erreur[02] = "Ce pseudo n'est pas disponible";
$erreur[03] = "Votre pseudo est trop court, la taille minimale est de 3 caractères";
$erreur[04] = "Votre pseudo est trop long la taille maximale est de 15 caractères";
$erreur[05] = "Vous devez indiquer un mot de passe";
$erreur[06] = "Vous n'avez pas saisie la confirmation du mot de passe";
$erreur[07] = "Le mot de passe et sa vérification ne sont pas identique";
$erreur[08] = "Vous n'avez pas saisie votre adresse e-mail";
$erreur[09] = "Cette adresse Email est invalide";
$erreur[10] = "Un compte existe déjà sous cette adresse mail";
$erreur[11] = "Vous avez oublier de donner un nom a votre commissariat";
$erreur[12] = "Ce nom de commissariatt n'est pas disponible";
$erreur[13] = "Le nom de votre commissariat est trop court, la taille minimale est de 3 caractères.";
$erreur[14] = "Le nom de votre commissariat est trop long la taille maximale est de 15 caractères.";
$erreur[15] = "Le pseudo de votre parrain n'existe pas.";
$erreur[16] = "Le formulaire d'inscription n'a pas été rempli. <a href='./inscription.php'>Inscrivez vous !</a>";
?>
Jusque la, ca va.

Ensuite, mon formulaire d'inscription :
inscription.php


<form method="post" action="./check_inscription.php" accept-charset="UTF-8">
<p>
<label for="pseudo">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" /><br />
<label for="mot_passe">Mot de passe :</label> <input type="password" name="mot_passe" id="mot_passe" /><br />
<label for="mot_passe_verif">Retapez le mot de passe :</label> <input type="password" name="mot_passe_verif" id="mot_passe_verif" /><br />
<label for="mail">Adresse mail :</label> <input type="text" name="mail" id="mail" /><br />
<label for="nom_commissariat">Nom de votre commissariat :</label> <input type="text" name="nom_commissariat" id="nom_commissariat" /><br />
<label for="parrain">Parrain :</label> <input type="text" name="parrain" id="parrain" value="<?php echo $parrain; ?>" /><br />
</p>
<p>
<?php
// require_once('./recaptcha/recaptchalib.php');
// $publickey = "clée publique";
// echo recaptcha_get_html($publickey);
?>
</p>
<p>
<input type="submit" name="inscription" id="inscription" value="S'inscrire" />
</p>
</form>

et mon traitement du formulaire :
check_inscription.php

<?php
include'./global/connexion.php';
include'./global/divers.fonction.php';
include'./global/exist.fonction.php';
include'./global/idErreurs.php';

$erreur = array();
if (!empty($_POST['inscription'])) {
if (empty($_POST['pseudo'])) {
$erreur[01];
}
else {
if (existPseudo($_POST['pseudo']) == 1) {
$erreur[02];
}

if (strlen($_POST['pseudo']) < 3) {
$erreur[03];
}
if (strlen($_POST['pseudo']) > 20) {
$erreur[04];
}
}
if (empty($_POST['mot_passe'])) {
$erreur[05];
}
if (empty($_POST['mot_passe_verif'])) {
$erreur[06];
}
if ($_POST['mot_passe'] != $_POST['mot_passe_verif']) {
$erreur[07];
}
if (empty($_POST['mail'])) {
$erreur[08];
}
elseif (!verifMail($_POST['mail'])) {
$erreur[09];
}
if (existMail($_POST['mail']) == 1) {
$erreur[10];
}

if (empty($_POST['nom_commissariat'])) {
$erreur[11];
}
else {
if (existCommissariat($_POST['nom_commissariat']) == 1) {
$erreur[12];
}
if (strlen($_POST['nom_commissariat']) < 3) {
$erreur[13];
}
if (strlen($_POST['nom_commissariat']) > 15) {
$erreur[14];
}
}
if(!empty($_POST['parrain'])) {
$exist_parrain = $bdd->prepare("SELECT COUNT(pseudo) FROM Membres WHERE pseudo = :pseudo_parrain");
$exist_parrain->bindValue(':pseudo_parrain', htmlspecialchars($_POST['parrain'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$exist_parrain->execute();

if($exist_parrain->fetchColumn() == 0) {
$erreur[15];
}
else {
$select_parrain = $bdd->prepare("SELECT id FROM Membres WHERE pseudo = :pseudo_parrain");
$select_parrain->bindValue(':pseudo_parrain', htmlspecialchars($_POST['parrain'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$select_parrain->execute();
$donnees_parrain = $select_parrain->fetch();

$parrain = $donnees_parrain['id'];
$select_parrain->closeCursor();
}
$exist_parrain->closeCursor();
}
else {
$parrain = NULL;
}
// reCaptcha
// require_once('./recaptcha/recaptchalib.php');
// $privatekey = "clée privée";
// $resp = recaptcha_check_answer ($privatekey,
// $_SERVER["REMOTE_ADDR"],
// $_POST["recaptcha_challenge_field"],
// $_POST["recaptcha_response_field"]);

// if (!$resp->is_valid) {
// faire $erreur (je l'ai oublier celui la)
// }
// end reCaptcha

if (empty($erreur)) {
$hash_inscription = md5(GRAIN_INSCRIPTION.$_POST['pseudo'].$_POST['nom_commissariat']);
$hash_pass = md5(GRAIN_PASS.$_POST['mot_passe']);
$nouveau_membre = $bdd->prepare("INSERT INTO Membres(
pseudo,
mot_passe,
date_inscription,
hash_inscription,
mail,
nom_commissariat,
parrain)
VALUES(
:pseudo,
:mot_passe,
NOW(),
:hash_inscription,
:mail,
:nom_commissariat,
:parrain)");
$nouveau_membre->bindValue(':pseudo', htmlspecialchars($_POST['pseudo'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':mot_passe', $hash_pass, PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':hash_inscription', $hash_inscription, PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':mail', $_POST['mail'], PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':nom_commissariat', htmlspecialchars($_POST['nom_commissariat'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
if(!is_null($parrain)) {
$nouveau_membre->bindParam(':parrain', htmlspecialchars($parrain, ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_INT);
$nouveau_membre->execute();
}
else {
$parrain = NULL;
$nouveau_membre->bindParam(':parrain', $parrain, PDO:TongueARAM_NULL);
$nouveau_membre->execute();
}

// envoie du mail :

}
}
else {
$erreur[16];
}
?>


Merci beaucoup à ceux qui pourrons m'aider pour ce nouveau problème qui me creuse la tête.



Quel torchons mon post sorry pour la déformation du fofo en largeur:$


RE: Gestion d'affichage d'erreur - Ter Rowan - 20-12-2010

de ce que je lis de ton code :

tu crées un tableau $erreur en y mettant des messages (dans idErreurs.php)
puis tu vides ce tableau $erreur= array(); (dans check_inscription.php)
puis tu fais un tas de tests où tu ne fais ... rien ( "$erreur[32];" ça ne fait rien)


maintenant le sujet est intéressant, et je serais intéressé par une conception l'ayant moi même à traiter.


perso, si je suivais ton approche, je créerai une variable genre $erreursTrouvees = array(); (dans check_inscription, à la place de $erreur = array() )

et là où tu mets $erreur[32] , je mettrais :

$erreursTrouvees[] = $erreur[32];


ainsi, en fin de traitement j'aurais dans $erreursTrouvees l'ensemble des erreurs que tu identifies.

avec si count($erreursTrouvees) > 0 alors il y a au moins un probleme dans le formulaire


mais bon, maintenant je mets des exceptions et je ne suis pas à l'aise avec la conception de ces éléments là, je préfère donc juste réagir à ton dispositif que proposer un autre qui ne serait pas forcément plus satisfaisant


RE: Gestion d'affichage d'erreur - niahoo - 20-12-2010

Hmm pas trop le temps de me pencher dessus mais attention :

$erreur[08] n'est pas une expression valide,

08 en php vaut null, la notation octale est en base 8 (0,1,2,3,4,5,6,7)

Il te faut faire $erreur[8]


RE: Gestion d'affichage d'erreur - Hell-AstiK - 20-12-2010

Merci Ter Rowan je vais essayer ceci, et en dire des nouvelles.
Merci aussi niahoo, je ne savait pas que le 0 gênerais.

J'éditerais ce post si personne n'a poster en dessous, je code çà de suite.

EDIT :
Voilà, pour le moment çà marche bien, un petit var_dump($erreurstrouvees); a la fin de la page check_inscription me retourne bien les bonnes erreurs.
Maintenant, je me demande comment transmettre $erreursTrouvees a la page inscription.php ?

if(count($erreursTrouvees) >1) {
go('./inscription.php');
}

go() étant une fonction que j'ai créer pour rediriger, il me faudrait arriver a passer par url ou par post les erreurs.


RE: Gestion d'affichage d'erreur - Ter Rowan - 20-12-2010

(20-12-2010, 07:16 PM)Hell-AstiK a écrit : if(count($erreursTrouvees) >1) {
go('./inscription.php');
}

go() étant une fonction que j'ai créer pour rediriger, il me faudrait arriver a passer par url ou par post les erreurs.

bah je dirais

if(count($erreursTrouvees) >0) {

echo ' ici j'explique mets les erreurs';
include('inscription.php');
}
else
include('lasuite');


RE: Gestion d'affichage d'erreur - Hideaki - 20-12-2010

Hell Astik a sans doute voulu dire >= 1 Wink


RE: Gestion d'affichage d'erreur - Hell-AstiK - 20-12-2010

uhm en fait j'afficherais mes erreurs dans une boite en javascript (Sexy Alert Box) sur la page inscription.php
Le problème c'est que je ne peut inclure inscription.php sur la page check_inscription.php
car j'ai un module de changement design (rapellez vous : http://www.jeuweb.org/showthread.php?tid=7189)

Et donc quand je l'inclue, en haut il me met :
Notice: Constant NOM_TEMPLATE already defined in C:\wamp\www\nouveaujeu\global\connexion.php on line 21

plus :

Notice: A session had already been started - ignoring session_start() in C:\wamp\www\nouveaujeu\global\connexion.php on line 2

Car connexion.php est inclue sur les deux pages, et ce connexion.php définie le templates et démarre session_start();

Sinon, je peut les déplacer dans un autre fichier (top.php), mais lorsque je ferais des traitement sans besoin d'afficher un templates, il me faudra rajouter session_start en haut de ce fichier (pas dérangeant).

Mais bon, pour m'adapter à ce sujet, je peut faire cà, sa serais plus pratique d'ailleurs pour afficher mes erreurs.


Hideaki : C'est exact :p

Donc j'en suit maintenant ici, j'affiche mes erreurs (quand il y en as) sur la page check_inscription.php en incluant inscription.php pour permettre de re tentée la validation du formulaire.


if(count($erreursTrouvees) > 0) {
for($i=0;$i<sizeof($erreursTrouvees);$i++)
{
echo $erreursTrouvees[$i].'<br>';
}
include'./inscription.php';
}

et je mettrais la fonction de Sexy Alert Box ici, pour afficher la boite. Jusque la, je n'ai plus de problème Smile

edit : si quelqu'un a déjà utiliser Sexy Alert box, je veut bien savoir comment on fait pour afficher une box sans besoin de cliquer sur un lien...
Merci


RE: Gestion d'affichage d'erreur - Hell-AstiK - 21-12-2010

Bonjour, c'est re moi, désolé pour ce second post au lieu d'éditer,
j'ai réussi a faire fonctionner sexy alert box sans besoin de cliquer sur un lien, le nouveau problème, c'est que quand je cliques sur le bouton envoyer du formulaire sans avoir rentrée une seule données dans les champs, au lieu d'avoir l'erreur 17 qui est :
Citation :"Le formulaire d'inscription n'a pas été rempli. <a href='./inscription.php'>Inscrivez vous !</a>"

J'ai droit a chaque erreurs détailler :

Citation :- Vous devez indiquer un pseudo
- Vous devez indiquer un mot de passe
- Vous n'avez pas saisie la confirmation du mot de passe
- Vous n'avez pas saisie votre adresse e-mail
- Vous avez oublier de donner un nom a votre commissariat

Le code de ma page check_inscription.php

<?php
include'./global/connexion.php';
include'./global/divers.fonction.php';
include'./global/exist.fonction.php';
include'./global/idErreurs.php';

$erreursTrouvees = array();

if (!empty($_POST['inscription'])) {
if (empty($_POST['pseudo'])) {
$erreursTrouvees[] = $erreur[1];;
}
else {
if (existPseudo($_POST['pseudo']) == 1) {
$erreursTrouvees[] = $erreur[2];;
}

if (strlen($_POST['pseudo']) < 3) {
$erreursTrouvees[] = $erreur[3];;
}
if (strlen($_POST['pseudo']) > 20) {
$erreursTrouvees[] = $erreur[4];;
}
}
if (empty($_POST['mot_passe'])) {
$erreursTrouvees[] = $erreur[5];
}
if (empty($_POST['mot_passe_verif'])) {
$erreursTrouvees[] = $erreur[6];
}
if ($_POST['mot_passe'] != $_POST['mot_passe_verif']) {
$erreursTrouvees[] = $erreur[7];
}
if (empty($_POST['mail'])) {
$erreursTrouvees[] = $erreur[8];
}
elseif (!verifMail($_POST['mail'])) {
$erreursTrouvees[] = $erreur[9];
}
if (existMail($_POST['mail']) == 1) {
$erreursTrouvees[] = $erreur[10];
}

if (empty($_POST['nom_commissariat'])) {
$erreursTrouvees[] = $erreur[11];
}
else {
if (existCommissariat($_POST['nom_commissariat']) == 1) {
$erreursTrouvees[] = $erreur[12];
}
if (strlen($_POST['nom_commissariat']) < 3) {
$erreursTrouvees[] = $erreur[13];
}
if (strlen($_POST['nom_commissariat']) > 15) {
$erreursTrouvees[] = $erreur[14];
}
}
if(!empty($_POST['parrain'])) {
$exist_parrain = $bdd->prepare("SELECT COUNT(pseudo) FROM Membres WHERE pseudo = :pseudo_parrain");
$exist_parrain->bindValue(':pseudo_parrain', htmlspecialchars($_POST['parrain'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$exist_parrain->execute();

if($exist_parrain->fetchColumn() == 0) {
$erreursTrouvees[] = $erreur[15];
}
else {
$select_parrain = $bdd->prepare("SELECT id FROM Membres WHERE pseudo = :pseudo_parrain");
$select_parrain->bindValue(':pseudo_parrain', htmlspecialchars($_POST['parrain'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$select_parrain->execute();
$donnees_parrain = $select_parrain->fetch();

$parrain = $donnees_parrain['id'];
$select_parrain->closeCursor();
}
$exist_parrain->closeCursor();
}
else {
$parrain = NULL;
}
// reCaptcha
// require_once('./recaptcha/recaptchalib.php');
// $privatekey = "clée privé";
// $resp = recaptcha_check_answer ($privatekey,
// $_SERVER["REMOTE_ADDR"],
// $_POST["recaptcha_challenge_field"],
// $_POST["recaptcha_response_field"]);

// if (!$resp->is_valid) {
// $erreursTrouvees[] = $erreur[16]; = "Le captcha est invalide, veuillez recommencer s.v.p";
// }
// end reCaptcha

if (count($erreursTrouvees) == 0) {
$hash_inscription = md5(GRAIN_INSCRIPTION.$_POST['pseudo'].$_POST['nom_commissariat']);
$hash_pass = md5(GRAIN_PASS.$_POST['mot_passe']);
$nouveau_membre = $bdd->prepare("INSERT INTO Membres(
pseudo,
mot_passe,
date_inscription,
hash_inscription,
mail,
nom_commissariat,
parrain)
VALUES(
:pseudo,
:mot_passe,
NOW(),
:hash_inscription,
:mail,
:nom_commissariat,
:parrain)");
$nouveau_membre->bindValue(':pseudo', htmlspecialchars($_POST['pseudo'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':mot_passe', $hash_pass, PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':hash_inscription', $hash_inscription, PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':mail', $_POST['mail'], PDO:TongueARAM_STR);
$nouveau_membre->bindValue(':nom_commissariat', htmlspecialchars($_POST['nom_commissariat'], ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_STR);
if(!is_null($parrain)) {
$nouveau_membre->bindParam(':parrain', htmlspecialchars($parrain, ENT_NOQUOTES, "UTF-8"), PDO:TongueARAM_INT);
$nouveau_membre->execute();
}
else {
$parrain = NULL;
$nouveau_membre->bindParam(':parrain', $parrain, PDO:TongueARAM_NULL);
$nouveau_membre->execute();
}
// envoie du mail
}
}
else {
$erreursTrouvees[] = $erreur[17];
}
if(count($erreursTrouvees) > 0) {
?>
<script type="text/javascript">
function alerte() {
Sexy.alert("<?php
for($i=0;$i<sizeof($erreursTrouvees);$i++) {
echo '- '.$erreursTrouvees[$i].'<br />';
}
?>");
}
window.onload = function() {
alerte();
}
</script>
<?php
include'./inscription.php';
}
?>

Comment cela ce fait ? Alors que avant tout marcher impeccable.


RE: Gestion d'affichage d'erreur - Ter Rowan - 21-12-2010

il y a plusieurs choses à voir :

le système de tableau d'erreurs permet de tracer toutes les erreurs ( $erreursTrouvees[] = )
si tu ne veux pas tracer toutes les erreurs tu as plusieurs possibilités :

- tu n'affiches que la première erreur ($erreursTrouvees[0] )

- au lieu de mettre une succession de if, tu mets des elseif (du coup, ton $erreursTrouvees sera soit vide soit avec une entrée)

- au lieu de réaliser comme on l'a fait là, tu pars sur des exceptions (try, throw, catch, ...) et dès la première exception levée tu adresses la gestion d'exception (ici erreurs utilisateur)

- d'autres peut être plus intelligentes.

maintenant perso, je trouve dommage de n'afficher qu'une erreur à la fois sur un formulaire (par principe) en effet, si le login est déjà pris et que l'email ne marche pas, cela fait à l'utilisateur deux pages d'inscription (la première pour dire que le login est à changer, il le change, et paf encore une erreur sur l'email cette fois)

le plus pertinent à mon sens est de capitaliser sur le tableau des erreurs pour changer le formulaire d'inscription (mettre en rouge les champs qui ne vont pas, et/ou encore, afficher à côté de chaque champ avec un problème la nature du problème, etc...)


RE: Gestion d'affichage d'erreur - Hell-AstiK - 21-12-2010

Merci Ter Rowan,
sa sent un peu l'AJAX ta dernière phrase :p

J'ai repensé un petit peu ma page check_inscription.php,
maintenant, lorsque je charge cette page sans être passer par inscription.php, j'ai bien l'erreur 17 qui s'affiche.
Le truc qu'il ne marche pas encore, c'est quand je valide le formulaire vide via inscription.php, l'erreur 17 ne s'affiche pas, j'ai encore tout les détails (ce que tu m'a expliquer dans ton post).

Si vraiment on ne peut pas faire autrement, je peut faire ta dernière phrase, mais si vraiment on peut pas hein Big Grin