[PHP] Problème de session/redirection

Résolu/Fermé
Azurlikeas - 14 janv. 2008 à 22:38
 lo - 6 juin 2012 à 16:39
Bonjour,

J'ai un 1er fichier php, que je démarre (tout en haut) par une ouverture de session avec session_start();.
J'y mets un formulaire html pour le client de d'un restaurant qui veut passer une commande, avec action = "session.php" et un bouton submit.

Voici le contenu de mon fichier session.php :

<?php
session_start();

//cas où le champ nom a été rempli
if(!empty($_POST['nom_client'])){

// Cas où il y a erreur de saisie sur le nom (retour vers le formulaire)
if(!eregi('#^[^-][[:alpha:]-][^-]+$#',$_POST['nom_client']) OR !eregi('[^0-9.^()[]$+*|/\{}]',$_POST['nom_client']){
$_SESSION['err_nom_invalide'] = "Veuillez entrer un nom valide";
header("location:commande_restau.php");
exit();
}
// cas où tout est bon (redirection vers le fichier php de traitement de la commande)
else {
$_SESSION['err_nom_invalide'] = "";
header("location:ttt_restau.php");
exit();
}
}
// sinon, cas où le champ nom n'a pas été rempli (retour vers le formulaire)
else{
$_SESSION['err_nom_abs'] = "Veuillez entrer votre nom";
header("location:commande_restau.php");
exit();
}

?>

Problème : quand je soumets mon formulaire, j'obtiens une page blanche, quelle que soit la saisie pour le champ nom : vide, erronnée ou juste.

J'ai essayé de remplacer :
if(!empty($_POST['nom_client'])){
par if(!isset($_POST['nom_client'])){
ou if($_POST['nom_client'] !=0){
mais le résultat est le même.

Voyez-vous d'où peut venir le problème ?

Merci pour vos réponses.

10 réponses

R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
14 janv. 2008 à 22:46
Bonsoir,

pour les contenu de tes apppels à header(), tu devrais tenter de mettre un L majuscule et un espace APRES les deux points (:)

Bref, remplacer les :
 header("location:script.php"); 


par des
 header("Location: script.php"); 


C'est important car ça va faire partie du protocole HTTP, en fait.

Et puis si ça marche toujours pas, au lieu d'un "header...", fais un "echo 'blablabla'" pour être sûr de l'endroit où la programme s'oriente.

Raph
0
Merci, Raph, pour ta réponse.

J'ai modifié le code comme tu l'indiques, mais ça ne donne rien de plus. Par contre, je ne suis pas sûre d'avoir compris où je devais placer le echo. J'ai fait fait coimme ça :

<?php
session_start();

//cas où le champ nom a été rempli
if(!empty($_POST['nom_client'])){

// Cas où il y a erreur de saisie sur le nom
	if(!eregi('#^[^-][[:alpha:]-][^-]+$#',$_POST['nom_client']) OR !eregi('[^0-9.^()[]$+*|/\{}]',$_POST['nom_client']){
		$_SESSION['err_nom_invalide'] = "Veuillez entrer un nom valide";
		header("Location: commande_restau.php");
		echo "blibli";
		exit();
	}
// cas où tout est bon
	else {
		$_SESSION['err_nom_invalide'] = "";
		header("Location: ttt_restau.php");
		echo "blublu";
		exit(); 
	}
}
// sinon, cas où le champ nom n'a pas été rempli
else{
	$_SESSION['err_nom_abs'] = "Veuillez entrer votre nom";
	header("Location: commande_restau.php");
	echo "blabla";
	exit();
}

?>



Mes pages restent blanches.

Domi
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
15 janv. 2008 à 11:04
En fait, les echo, c'est fait pour remplacer les "header(...)" de manière à voir quelque chose affiché vu qu'avec un header, tu ne vois rien.

Mais en l'état actuel de ton code, comme tu ne vois rien, c'est que les instructions header(...) ne sont jamais éxécutées!



Tu as enlevé l'affichage des erreurs ?

En fait, je viens de mettre le code sur un serveur et ça plante. Juste une bête erreur de parenthèse...


Je te remets le code sans erreur (et sans les "echo()") :


<?php
session_start();

//cas où le champ nom a été rempli
if(!empty($_POST['nom_client'])){

// Cas où il y a erreur de saisie sur le nom
        if(!eregi('#^[^-][[:alpha:]-][^-]+$#',$_POST['nom_client']) OR !eregi('[^0-9.^()[]$+*|/\{}]',$_POST['nom_client'])){
                $_SESSION['err_nom_invalide'] = "Veuillez entrer un nom valide";
                header("Location: commande_restau.php");
                exit();
        }
// cas où tout est bon
        else {
                $_SESSION['err_nom_invalide'] = "";
                header("Location: ttt_restau.php");
                exit();
        }
}
// sinon, cas où le champ nom n'a pas été rempli
else{
        $_SESSION['err_nom_abs'] = "Veuillez entrer votre nom";
        header("Location: commande_restau.php");
        exit();
}

?>


0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
15 janv. 2008 à 12:05
Tes expressions régulières me paraissent un peu étranges, tu les as testées ?

C'est toi qui les as faites ?

Raph
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci pour ta correction. C'est bon, plus de pages blanches ! J'ai mis du temps à trouver cette fichue parenthèses qui manquait !

Pour les regex : il y a un problème. Isolés dans un petit script, ça semblait fonctionner, mais là, ça ne marche plus. Même quand je rentre un nom valide, je suis renvoyée au formulaire ("commande_restau.php").

Le 1er regex : '#^[^-][[:alpha:]-][^-]+$#'
Je l'ai trouvé sur un forum de commentcamarche. Il permet d'accepter un tiret à l'intérieur d'une chaîne de caractères, mais pas au début, ni à la fin.

Le 2e regex : '[^0-9.^()[]$+*|/\{}]'
Je l'ai créé moi-même. Il interdit les chiffres et certains caractères spéciaux.

Qu'est-ce qui te semble bizarre ?
Est-ce qu'on utilise autre chose habituellement, pour tester un champ nom ou prénom ?


J'ai une autre question :
Je veux tester aussi le champ prénom.

J'écris mon code comme ça (j'exclus pour le moment les regex) :

<?php
session_start();

//cas où le champ nom a été rempli
if(!empty($_POST['nom_client'])){
	$_SESSION['err_nom_invalide'] = "";
	header("Location: ttt_commande.php");
	exit();
}
// sinon, cas où le champ nom n'a pas été rempli
else{
        $_SESSION['err_nom_abs'] = "Veuillez entrer votre nom";
        header("Location: commande_restau.php");
        exit();
}
//cas où le champ prenom a été rempli
if(!empty($_POST['prenom_client'])){
	$_SESSION['err_prenom_invalide'] = "";
	header("Location: ttt_commande.php");
	exit();
}
// sinon, cas où le champ prenom n'a pas été rempli
else{
        $_SESSION['err_prenom_abs'] = "Veuillez entrer votre prénom";
        header("Location: commande_restau.php");
        exit();
}
?>


Dans mon fichier commande_restau.php, en dessous de l'input du nom, j'écris :
<? if(isset($_SESSION['err_nom_abs'])){
	echo "<span style='color:red'>".$_SESSION['err_nom_abs']."</span><br />";
	}
?>

et en-dessous de l'input du prénom, je mets :
<? if(isset($_SESSION['err_prenom_abs'])){
	echo "<span style='color:red'>".$_SESSION['err_prenom_abs']."</span><br />";
	}
?>

de façon à ce que les messages d'erreur s'affichent juste au-dessous des champs appropriés. Ca marche pour le champ nom, mais pas pour le champ prénom. C'est-à-dire que quand je laisse vides les 2 champs, le message s'affiche bien sous le champ nom, mais pas sous le champ prénom.. Où est l'errer ?

Domi
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
15 janv. 2008 à 16:31
Le soucis, c'est que tu fais la redirection dès que tu constates une erreur, donc s'il y a 2 erreurs, seule la première est pris en compte.

Ce qu'il faudrait faire :


<?php
session_start();

// Cas où le champ nom n'a pas été rempli
if(empty($_POST['nom_client'])){
        $_SESSION['err']['nom_abs'] = "Veuillez entrer votre nom";
}

if(empty($_POST['prenom_client'])){
        $_SESSION['err']['prenom_abs'] = "Veuillez entrer votre prénom";
}

if ($_SESSION['err']) { # dans ce cas il y a au moins une erreur
        header("Location: commande_restau.php");
	exit;
}


$_SESSION['err_nom_invalide'] = "";
header("Location: ttt_commande.php");
exit();

?>




Les regexps que tu as sont vraiment pas terribles. En plus, tu mets des # (dièses) pour délimiter la regexp dans une fonction eregi, alors que c'est prévu pour preg_match uniquement.


L'expression régulière n°1 (#^[^-][[:alpha:]-][^-]+$# ) signifie (si on utilise preg_match et non pas eregi :
- début de ligne (^)
- suivi d'un caractère qui peut être n'importe quoi sauf un tiret [^-]
- suivi de un caractère alphabétique ou tiret [[:alpha:]-]
- suivi de n'importe quels caractères sauf tiret
- suivi de fin de ligne ($)

Un truc qui marche avec cette expression régulière alors que ça ne te convient pas : $a@:;::

Si tu veux un nom/prénom qui ne commence ni ne se termine par un tiret (-) :

preg_match('#\A:alpha:[[:alpha:]-]*:alpha:\Z#',$prenom)

1- utilisation de preg_match (donc les dièses qui entourent l'expression régulière sont considérés comme délimiteurs)
2- début de chaîne de caractère (\A)
3- un caractère alphabetique :alpha:
4- des caractères alphabétiques ou tiret [[:alpha:]-]*
5- un caractère alphabétique :alpha:
6- fin de chaîne de caractères

Pour le nom du client, que veux-tu de plus que pour le prénom ?
- des espaces
- des apostrophes
- toujours s'assurer qu'on commence et qu'on termine par une lettre

preg_match("#\A:alpha:[[:alpha:]-' ]*:alpha:\Z#",$nom)

et voilà.

Raph
0
Bonsoir, Raph,

Merci pour tes explications. Elles sont limpides.

En fait, j'ai encore un petit soucis. Voici la dernière version de mon code :

<?php
session_start();

$nom=$_POST['nom'];
$prenom=$_POST['prenom'];

// Cas où le champ nom n'a pas été rempli
if(empty($_POST['nom_client'])){
        $_SESSION['err']['nom_abs'] = "Veuillez entrer votre nom";
}
//sinon, cas où le champ nom comporte des erreurs
elseif(!preg_match("#\A:alpha:[[:alpha:]-' ]*:alpha:\Z#",$nom)){
        $_SESSION['err']['nom_inv'] = "Veuillez entrer un nom valide";

}
// Cas où le champ prénom n'a pas été rempli
if(empty($_POST['prenom_client'])){
        $_SESSION['err']['prenom_abs'] = "Veuillez entrer votre prénom";
}
//sinon, cas où le champ prenom comporte des erreurs
elseif(!preg_match('#\A:alpha:[[:alpha:]-]*:alpha:\Z#',$prenom)){
        $_SESSION['err']['prenom_inv'] = "Veuillez entrer un prénom valide";
}

if ($_SESSION['err']) { # dans ce cas il y a au moins une erreur
    header("Location: commande_restau1.php");
	exit;
}

header("Location: ttt_commande.php");
exit();

?>


Dans le fichier formulaire, j'ai aussi rajouté :
unset($_SESSION['err']['nom_abs']);

à la fin de chaque affichage de variable, pour obtenir place nette quand je fais un rafraîchissement.

Mon problème, c'est que quand je rentre des infos valides, je n'arrive plus à accéder à mon fihcier ttt_commande.php. je retombe toujours sur commande_restau1.php.
Je ne comprends pas ce qui cloche.

Domi
0
R4f Messages postés 441 Date d'inscription dimanche 13 janvier 2008 Statut Membre Dernière intervention 5 mai 2008 62
15 janv. 2008 à 23:53
Le soucis, c'est que tu utilises une fois $_POST['nom'] et l'autre fois $_POST['nom_client'], c'est ça qui cloche.

Fais bien attention à tous les noms de champs/variables car sinon tu vas t'emmeler les pinceaux ! ;-)

Raph
0
Ouh là là !!! J'étais un peu fatiguée hier soir !
C'est sûr, ça marche drôlement mieux comme ça !

Merci encore pour toutes tes contributions et pour ta réactivité.

Domi
0
Bonjour,
j'ai un peu le même code que Azurlikeas, à ceci près que mon dernier if contient des écho.
Il s'en suit enfin un else {header('location:inscription.php')}

Comme le header suit des echo, il ne fonctionne donc pas, faudrait-il que je supprime tous les echo, quitte à mettre sur une autre page toute cette partie et faire un header(location') vers cette partie pour que mon header('location.php')soit pris en compte?

quoi qu'il en soit mon header suivra un else.

voici mon code:
   
  //idem date naissance  
  if (!isset($_POST['naissance']) or empty($_POST['naissance'])) 
   $_SESSION['erreur']['naissance']='<p class="erreur">Merci de renseigner votre date de naissance.</p>'; 
  else 
   { 
   $_SESSION['form']['naissance']=ctype_digit($_POST['naissance']); 
   } 



// sinon si toutes les valeurs sont bonnes alors ecris "ok" vérifie mais ne montre pas le formulaire à re-remplir! 
if (empty($_SESSION['erreur'])) 
   { 
   echo '<p class="pas_erreur">Bienvenue '.$_POST['pseudo'].'. Votre inscription est maintenant effectuée. Vous pourrez acceder au forum, laisser des commentaires et poster vos séances. Vérifiez vos entrées ci-dessous</p>'; 
   echo '<form> 
<fieldset> 
 <legend>Vérification des données:</legend> 
   <label for="pseudo">Nom d\'utilisateur</label> 
   <input type="text" name="pseudo" id="pseudo" value="'.$_POST['pseudo'].'"/> 
   <br />   

   <label for="mail">Votre email</label> 
   <input type="email" name="mail" id="email" value="'.$_POST['mail'].'"/> 
   <br />  
       
   <label for="pass">Mot de passe</label> 
   <input type="text" name="pass" id="mot de passe" value="'.$_POST['pass'].'"/> 
   <br /> 
    
   <label for"naissance">Date de naissance</label> 
   <input type="text" name="date" id="date" value="'.$_POST['naissance'].'"/> 
   <br /> 

</fieldset> 
</form> 
   <p class="bouton_formulaire"> 
   <a href="http://loleran.free.fr"><input type="submit" value="naviguer" title="continuer"/></a> 
   <a href="http://loleran.free.fr/principale/inscription.php"><input type="submit" value="recommencer!" title="retour inscription"/></a> 
   </p>'; 
   //on vide variables de session 

   $_SESSION['erreur']='';$_SESSION['form']=''; 
   }    
else 
{header('Location:inscription.php'); 
exit;} 
?> 



merci pour votre aide!
0