Page 1 sur 1

probleme recuperation des variables depuis un formulaire

Posté : 23 oct. 2006, 15:28
par rincevent
Bonjour à tous
Je débute en PHP et je bloque sur un genre de livred'or pour mon site, les variables de mon formulaire génère un message d'erreur qui s'affiche dans ma page web :

Code : Tout sélectionner

Notice: Undefined index: nom in c:\program files\easyphp1-8\www\mon_site\index.php on line 81
Voici le code qui pose problème :
 <td CLASS = menu align="center" width="80%"><br>
                  <h4 align=center>Les News : Infos sur le site, messages et commentaires</h4>
		  <form action="<? echo $PHP_SELF ?>" method="POST">
		  Ki me parle : <input name="nom">  Kes ki dit : <br>
		  <textarea align=center cols=60 rows=5 name="message" wrap=virtual></textarea><br><br>
	          <input type="submit" value="Deposer votre message ">
		  </form>
                                <?
				$mon = getdate();
				$cjoursem = $mon['weekday'];
				$jourdumois = $mon['mday'];
				$cmois = $mon['month'];
				$yannee = $mon['year'];
                                $nom = $_POST['nom'];
				$message = $_POST['message'];
				if(isset($message))
				{
					$fp = fopen("news.txt","a");
					fwrite($fp,"
<h4 align=left>-----------------------------------------------------------------------------------------<br>
$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br>
-----------------------------------------------------------------------------------------
</h4>\n");
					fclose($fp);
				}
				?>
				<p align=left>Ci dessous les messages precedents : </p>
				<?
				readfile("news.txt");
				?>
		 

		</td>
les erreurs proviennent des variables $nom et $message. Je fais tourner tout ça sous linux et mozilla et ça marche et qd je passe sous windows et Internet explorer ça marche plus (j'utilise EasyPHP).

Voilà, en espérant que quelqu'un situe le problème :roll:

Posté : 23 oct. 2006, 15:29
par yoannb64
Peut être la configuration du serveur apache n'est elle pas la même ?
Je sais pas je suis noob aussi ^^

Posté : 23 oct. 2006, 15:32
par Vikchill
Teste les valeurs des tes variables saisies, même si je sais pas si le problème vient de là ça t'en évitera plein d'autres.

Posté : 23 oct. 2006, 15:39
par Invité
Merci pour la rapidité de vos réponses

La config de serveur apache est pas défaut celle d'EasyPHP, je pense que ç a tourne puisque les pages s'affiche et le PHP s'éxecute (avec un bug mais il s'execute).
Pour le test des variables, je veux bien, ça change rien au problème, meme si je contrôle la taille ou autre, j'ai le meme message d'erreur

en tout cas c'est bon de ne plus se sentir seul :D

Posté : 23 oct. 2006, 15:46
par sadeq
Pour éviter ces erreurs d'index de tableau sur n'importe quelle plateforme il faut bien écrire les choses en testant l'existence des index avant leurs utilisation si ces index peuvent ne pas exister dans certains cas.
Le postage $_POST et $_GET, les données de session $_SESSION ou autres tableaux sont un bon exemple.

Dans ton cas tu as commis des erreurs dans ce sens, le $_POST['nom'] et $_POST['message'] n'existent pas au démarrage alors que ton programme essaye de les affecter dans des variables quelque soit le contexte.

La correction est de vérifier d'abord s'il y a postage et dans ce cas récupèrer les données (index) postées.

Correction avec test d'erreurs prévisibles:
<?php
if (isset($_POST['nom']) && isset($_POST['message']) 
&& trim($_POST['nom']) != "" && trim($_POST['message']) != "") { //test si un postage a eu lieu
$mon = getdate(); 
$cjoursem = $mon['weekday']; 
$jourdumois = $mon['mday']; 
$cmois = $mon['month']; 
$yannee = $mon['year']; 
$nom = $_POST['nom']; 
$message = $_POST['message']; 

//Enregistrement avec test d'erreurs d'ouverture et d'écriture
if ( ($fp = @fopen("news.txt","a"))  
 && @fwrite($fp,"
<h4 align=left>-----------------------------------------------------------------------------------------<br>
$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br>
-----------------------------------------------------------------------------------------</h4>\n")){ 
   echo "<p>Message enregistré</p>";
}
else    echo "<p>Message non enregistré</p>";  

if ($fp) @fclose($fp); //fermer le fichier dans tous les cas

}//fin if (postage)
else echo "<p>Veuillez remplir les champs obligatoires!</p>"; 

?> 
<p align=left>Ci dessous les messages precedents : </p> 
<?php
readfile("news.txt"); 
?>
Donc le problème n'a rien à voir avec linux, windows ou easyphp, mais attaché à la logique de programmation de l'interaction le formulaire et sa procédure de traitement.
Comme tu vois on a pris en compte quelque erreurs prévisibles attachées au postage et à l'accès fichier et prévu ainsi des messages d'avertissement en cas d'erreur et d'information en cas de situation normale.

ps: le modificateur @ qui préfixe les fonctions fichiers est là pour déasctiver l'echo système en cas d'echec de ces fonctions puisqu'on pris en main la gestion des erreurs possibles.
Il est conseillé par contre de ne pas mettre ce modificateur @ pendant la période de développement et de test de la solution pour recevoir les erreurs systèmes qui sont révélateurs. Mais de les mettre en phase finale pour protéger la version finale (hors béta) contre les bugs systèmes déagréables et non critiques quant à l'évolution du produit.

Posté : 24 oct. 2006, 14:27
par rincevent
Merci pour ton aide

J'ai copié le code et j'ai tout relancé et ça marche (mieux....), il faut maintenant que je comprenne l'effet de chaque ligne mais ton explication est suffisament claire.
Par contre, j'ai un autre souci, quand je recharge ma page, le script réecrit le dernier message (il apparait donc autant de fois que je charge la page LOL). Il me semblait que puisque les zones de saisies du formulaire sont vides (quand on recharge) les contrôles que tu as mis en place (isset()....) devraient empêcher l'écriture en double du messages précédents.
Est ce que je dois réinitialiser les variables $message et $nom à "" (chaine vide, si c'est bien comme ça qu'on fait) à la fin de mon script ???

en tout cas tu m'as permis de franchir une étape et j'ai bien compris pourquoi j'avais un message d'erreur avant, encore merci :D

Posté : 24 oct. 2006, 15:12
par sadeq
Cet effet est normal et il est dù au navigateur qui garde dans le cache d'adresses l'url précédente. Cette dernière est automatiquement renvoyée à chaque actualisation (Refresh) de la page.

Ce mécanisme est totalement indépendant malheureusement du script php qui lui tourne côté serveur Web.
Ton programme php recevera donc suite à toute actualisation les paramètres éventuels existant depuis le précédent envoi.

Ceci dit, il y a des solutions techniques permettant d'éviter l'effet négatif du mécanisme d'actualisation automatique offert par les navigateurs.

La plus judicieuse des solutions et de fixer les contraintes de manipulation des données comme celles du modèle relationnel des BDD.
Par exemple, dans ton cas, tu veux éviter d'enregistrer des messages en double : la solution est de fixer un critère (règle ou index) d'unicité d'un enregistrement soit en inventant un id unique par message ou tout simplement en associant plusieurs champs pour former le critère unique. Par exemple dans ton cas, le critère d'unicité d'un message est la chaîne:

Code : Tout sélectionner

$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br>
Cette chaîne ne doit apparaitre qu'une fois dans le fichier des messages.

L'algorithme qui permet de vérifier ça peut être le suivant:
//si le critère d'unicité n'est pas trouvé dans le fichier news.txt alors c'est un nouveau message
$critère = "$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br>";
if ( file_exists("news.txt") && strpos(file_get_contents("news.txt") , $critère) === false ) {
     //Enregistrer ce nouveau message
     .....
}
else echo "<p>Ce message existe déjà!</p>";
En définitif ton code doit resembler à un truc comme ça:
<td CLASS = menu align="center" width="80%"><br> 
<h4 align=center>Les News : Infos sur le site, messages et commentaires</h4> 
<form action="<?php echo $PHP_SELF ?>" method="POST"> 
Ki me parle : <input name="nom" value="<?php echo (isset($_POST['nom'])?$_POST['nom']:""); ?>">  Kes ki dit : <br> 
<textarea align=center cols=60 rows=5 name="message" wrap=virtual><?php echo (isset($_POST['message'])?$_POST['message']:""); ?></textarea><br><br> 
<input type="submit" value="Deposer votre message "> 
</form>
<?php 
if (isset($_POST['nom']) && isset($_POST['message'])  
&& trim($_POST['nom']) != "" && trim($_POST['message']) != "") { //test si un postage a eu lieu 
	$mon = getdate();  
	$cjoursem = $mon['weekday'];  
	$jourdumois = $mon['mday'];  
	$cmois = $mon['month'];  
	$yannee = $mon['year'];  
	$nom = $_POST['nom'];  
	$message = $_POST['message'];  

	//si le critère d'unicité n'est pas trouvé dans le fichier news.txt alors c'est un nouveau message 
	$critère = "$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br>"; 
	if ( file_exists("news.txt") && strpos(file_get_contents("news.txt") , $critère) === false ) { 
     	//Enregistrer ce nouveau message avec test d'erreurs d'ouverture et d'écriture 
		if ( ($fp = @fopen("news.txt","a"))   
 		&& @fwrite($fp,"<h4 align=left>-----------------------------------------------------------------------------------------<br> 
$cjoursem $jourdumois $cmois $yannee, par $nom : <br>$message<br> 
-----------------------------------------------------------------------------------------</h4>\n")){  
   		echo "<p>Message enregistré</p>"; 
		} //fin if (test enregistrement)
		else    echo "<p>Message non enregistré</p>";   
		if ($fp) @fclose($fp); //fermer le fichier dans tous les cas 
	} //fin if (test unicité)
	else echo "<p>Ce message existe déjà!</p>";
}//fin if (test postage) 
else echo "<p>Veuillez remplir les champs obligatoires!</p>";  
?> 
<p align=left>Ci dessous les messages precedents : </p> 
<?php 
if (file_exists("news.txt")) readfile("news.txt"); 
?> 
</td>