Rechercher : dans
Par :

[PHP] Problème de session/redirection

Dernière réponse le 16 jan 2008 à 14:24:15 Azurlikeas, le 14 jan 2008 à 22:38:42 
 Signaler ce message aux modérateurs

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.

Configuration: Mac OS X
Firefox 2.0.0.1

Meilleures réponses pour « [PHP] Problème de session/redirection » dans :
[Webmaster] Faire une redirection VoirLes différentes solutions sont présentées de la meilleure (.htaccess) à la moins bonne (JavaScript). Un .htaccess Le .htaccess est à placer dans le répertoire qui doit être redirigé. On applique une redirection de cette façon : RedirectPermanent...
Servlets - Gestion des sessions VoirHTTP: un protocole non connecté Le protocole HTTP est un protocole non connecté (on parle aussi de protocole sans états, en anglais stateless protocol), cela signifie que chaque requête est traitée indépendamment des autres et qu'aucun historique...

1

R4f, le 14 jan 2008 à 22:46:36

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

Répondre à R4f

2

Azurlikeas, le 15 jan 2008 à 09:08:02

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

Répondre à Azurlikeas

3

R4f, le 15 jan 2008 à 11:04:00

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();
}

?>


Répondre à R4f

4

R4f, le 15 jan 2008 à 12:05:31

Tes expressions régulières me paraissent un peu étranges, tu les as testées ?

C'est toi qui les as faites ?

Raph

Répondre à R4f

5

Azurlikeas, le 15 jan 2008 à 16:07:55

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

Répondre à Azurlikeas

6

R4f, le 15 jan 2008 à 16:31:52

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

Répondre à R4f

7

Azurlikeas, le 15 jan 2008 à 22:27:03

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

Répondre à Azurlikeas

8

R4f, le 15 jan 2008 à 23:53:45

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

Répondre à R4f

9

 Azurlikeas, le 16 jan 2008 à 14:24:15

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

Répondre à Azurlikeas