Posez votre question Signaler

[PHP] Problème de session/redirection [Résolu]

Azurlikeas - Dernière réponse le 16 janv. 2008 à 14:24
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.
Lire la suite 

[PHP] Problème de session/redirection »

9 réponses
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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();
}

?>


Ajouter un commentaire
Réponse
+0
moins plus
Tes expressions régulières me paraissent un peu étranges, tu les as testées ?

C'est toi qui les as faites ?

Raph
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « [PHP] Problème de session/redirection » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?