Aller au contenu

[Resolu] - Gestion d'erreur dans un script


Sujets conseillés

Posté (modifié)

Bonjour le Hub,

Petite question.

J'execute un script dans ce style

for ($i=0;  $i<10; $i++)

(...)
instruction if >> si ok je continue // si erreur, je kill le script

Hors, dans l'instruction if, au lieu de tuer le script, je souhaiterais récupérer l'erreur dans une variable, et revenir au debut du code, soit sur la boucle "for".

Comment puis je faire cela ?

Merci de vos eclairages divers et variés.

Stef'

Modifié par steph13
Posté
instruction if >> si ok je continue // si erreur, je kill le script

Si ce que tu veux faire c'est juste continuer la boucle for il te suffit de ne rien faire à part :

$erreur[]="probleme à l'enregistrement ".$i;

A la fin de ta boucle tu rajoutes un

print_r($erreur) et toutes les lignes ou tu as des erreurs vont apparaitre.

Si ce n'est pas ca que tu voulais précises ta question.

Ludo

Posté

Bonjour,

la gestion d'erreurs fait l'office d'un explicatif complet dans le manuel PHP... mais ce n'est pas "exactement" ce que tu demande...

Pour "sortir" d’une boucle tu as l'instruction break qui arrête la boucle et qui exécute le code se trouvant après...

Une autre possibilité, si ton script est appelé depuis un autre fichier avec un include ou un require, est d'utiliser la fonction return... Ainsi lorsque cette fonction est appelée dans le fichier qui a été "inclu", le reste du fichier n'est pas appelé et le script contenu a être interprété depuis la ligne qui suit l'appelle à include ou require (dans le fichier de base, depuis lequel tu as fait l'appelle pour "l'inclusion").

Dans la gestion de retour pour un formulaire ça peut être utile par exemple... mais toutes les instructions qui ont été effectuées par ton script avant ce "retour" auront été effectuées...le script ne peut pas annuler des actions qui vient de s'exécuter juste en utilisant ce genre de technique...d'ailleurs il ne peut tout simplement pas le faire... tu devrais le faire toi même.

Une autre méthode pour la gestion d'erreur (très utilisée dans le framework PHP en général) est la variable de session...et lorsque l'erreur se produit, le script redirige l'utilisateur vers un page et juste avant cela enregistre le message d'erreur dans une variable de session (un tableau en général)... Cela a un inconvénient, c'est qu'il faut obligatoirement gérer une session, mais comme c'est souvent le cas dans une application, pourquoi pas ;)

EDIT: Pardon, je t'avais mal compris... le break en l'occurence ne va pas t'aider si tu souhaite continuer ta boucle ;)

Posté

Bonjour

Hors, dans l'instruction if, au lieu de tuer le script, je souhaiterais récupérer l'erreur dans une variable, et revenir au debut du code, soit sur la boucle "for".

Dans ce cas, à mon avis, le mieux est de créer une fonction. Si tu as une erreur, tu quitte la fonction avec return(), ce qui te permet au passage de récupérer l'erreur. Ensuite, rien de compliqué à rappeller la fonction pour "revenir au debut du code" ;)

Posté

Merci à toi Ludo, cela répond en partie à mon besoin.

Je vais tenter d'être plus precis dans ma démarche:

En effet, je souhaite pouvoir continuer ma boucle for.

Celle ci est la pour me permettre de traiter l'envoi de photos.

Un formulaire permet l'envoi de dix photos.

Pour chacune, je traite:

Le poids, l'extension, et la categorie.

Si l'une de ces trois conditions n'est pas convenablement remplis, il y a redirection sur une page d'erreur.

Ce qui me convient à moitié.

Je voudrais pouvoir récupérer l'erreur en question, la stocker dans une variable, passer à l'image suivante.

En fin de boucle, je redirige vers une age qui affiche les images et un rapport d'upload avec les éventuelles erreurs.

Posté
En effet, je souhaite pouvoir continuer ma boucle for.

Celle ci est la pour me permettre de traiter l'envoi de photos.

Pour ca tu peux utiliser l'instruction continue qui te permet de "zapper" la suite dans la boucle et de passer à l'itération suivante.

Posté (modifié)

Edit:

J'avais zappé des réponses ! Toutes mes excuses.

The_Rec, je viens de regarder la page que tu as mise en lien sur la gestion d'erreur, ouarf! C'est du costaud lol

Pour la fonction return, je vais regarder cela de plus près égalemant.

Concernant la structure de mon appli pour cette partie:

Page qui appel le form via un include >> envoi au script qui traite le formulaire >> on finis sur une dernière page qui affiche les photos.

Norseb;

Merci pour l'info également, je vais regarder cela aussi.

Dans tout les cas, je pense que je vais revenir vers vous d'ici peu :P

Merci à vous pour ces infos, j'ai déja de quoi creuser plus avant.

Modifié par steph13
Posté (modifié)
Une autre méthode pour la gestion d'erreur (très utilisée dans le framework PHP en général) est la variable de session...et lorsque l'erreur se produit, le script redirige l'utilisateur vers un page et juste avant cela enregistre le message d'erreur dans une variable de session (un tableau en général)... Cela a un inconvénient, c'est qu'il faut obligatoirement gérer une session, mais comme c'est souvent le cas dans une application, pourquoi pas ;)

Hum, ca m'interesse cette histoire avec les sessions.

Car je viens de lire tout les liens proposé, et j'avour ne pas vraiment trouver mon bonheur.

La solution de Ludo me semblait bien, mais j'ai un petit soucis pour transmettre les erreurs d'une page à l'autre.

Donc, les sessions, cela peut être bon, car tout ceci se passe dan un espace, et donc, il y a déja des sessions.

Par exemple :

//on verifie que le membre a bien selectionné une catégorie pour chaque photo
$categorie=$_POST['categorie'][$i];
if($categorie=='14'){

>>si la categorie est egale a '14', c'est une erreur, donc:
>>je suppose que c'est ici que je dois donc initialiser la variable.

continue; // pour passer au traitement de l'image suivante

}

Modifié par steph13
Posté

si c'est juste pour passer d'un page a l'autre :

tu peux aussi stocker dans $erreur qui est une string à la place d'un tableau :

cf :

if($probleme){$erreur+="Erreur à l'upload de l'enregistrement ".$i." §§";}

a la page suivant tu "exploses"

$tab_erreur=explode("§§",$_request["erreur"]);

print_r($tab_erreur);

C'est pas tres tres propre mais ca t'evite de faire compliqué pour un truc simple.

Ludo

Posté

Merci à toi Ludo,

J'ai préféré opté pour la gestion via les sessions, avec les quelles je bataille en ce moment même ;)

Posté

Tout d'abord tu trouvera beaucoup d'exemple de gestion de sessions dans le manuel PHP à ce sujet.

Une fois ta session "démarrée", il faut utiliser le tableau de superglobales $_SESSION (dans la même lignée que $_POST, $_GET on n'utilise plus le $HTTP_SESSION_VARS). Il y a une fonction pour enregistrer un variable de session, mais tu peux tout aussi bien le faire directement comme avec un tableau "normal", selon le code que tu mas donnée :

  $_SESSION['errors']= array();

for($i=0; $i <= $valeurlimite; $i++) { // boucle d'exemple
//on vérifie que le membre a bien sélectionné une catégorie pour chaque photo
$categorie=$_POST['categorie'][$i];
if($categorie=='14'){
$_SESSION['errors'][] = 'La ligne '.$i.' a causé une erreur'; //cette ligne n'est pas bonne je pense !!
}
}

if(!empty($_SESSION['errors'])) {
// Redirection vers ta page ou tu souhaite afficher l'erreur... la fonction redirect est a écrire par tes soins
// Une redirection avec headers sera très bien si tu n'as pas envoyé d'autres données au navigateur avant de la faire
redirect('page_erreur.php');
}

Ensuite sur la page d'erreur tu démarre à nouveau la session (soit tu as passé l'identifiant de session par l'URL soit par un cookie (c'est le comportement par défaut sur la majorité des serveurs, regarde le manuel à ce sujet)) et tu auras accès à ce tableau :

  if(!empty($_SESSION['errors'])) {
foreach($_SESSION['errors'] as $error) {
echo '<p>'.$error.'</p>';
}
}

Ainsi chaque erreur est affichée...sur une autre page, après avoir redirigé l'utilisateur...

Posté (modifié)

Edit: Autant pour moi, je n'avais pas bien lu le dernier post.

Tout est OK !!! :)

Merci de votre aide à tous.

Modifié par steph13
Posté

Sans avoir le reste du code de ta page d'erreur ça me semble difficile de te dire pourquoi :S

Essaie peut être :

echo '<pre>'; print_r($_SESSION); echo '</pre>';

Au début de ton fichier pour voir ce qui se trouve dans ton tableau de variables de sessions. Je ne vois pas comment un foreach pourrait fonctionner pour une itération et pas pour les suivantes, à moins que ton tableau soit "effacé" à l'intérieur d'une itération...et encore le foreach travaille sur une copie du tableau en arrière-scène. A moins que tu sois en PHP5 et que tu passe le tableau en référence (avec un & devant le nom de variable).

EDIT : Alors peux-tu donner la raison de ton problème...cela aidera peut-être d'autres qui se trouveront ou se trouvent dans le même cas que toi.

Posté

Donc, j'ai suivi les conseils de TheRec.

Dans le script qui gère l'upload:

$_SESSION['errors']=array();

(...)

//on verifie que le membre a bien selectionné une catégorie pour chaque photo
$categorie=$_POST['categorie'][$i];
if($categorie=='14'){
$_SESSION['errors'][]=$i;
continue;
}

Dans la page qui affiche les images ET les erreurs éventuelles :

foreach($_SESSION['errors'] as $error) {
echo '<p>La photo '.$error.' n\'a pas été envoyée : Pas de catégorie selectionée.</p>';
}

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...