PHP : un premier formulaire simple

Les fichiers exemples associés à cette page (zippés) sont à télécharger ici

Introduction

Dans la page debuter avec php, nous avons créé une table toute simple comportant 3 champs : N° d'id, nom et prénom. Nous avons nous même écrit les données dans la table. Mais comment faire pour que ce soient les lecteurs de notre site web qui le fassent ? Un formulaire sur une page html va leur permettre de nous envoyer ces données que nous récupérerons ensuite pour les intégrer dans notre table sur le serveur.

Création du formulaire

Rien de sorcier ici, dans une page html, tapez ce qui suit :

<form method="post" action="<?echo $PHP_SELF?>">
<table border=1 align=center>
	<tr>
		<td colspan=2>Merci de m'indiquer :</td>
	</tr>

	<tr>
		<td>votre nom: <input type="text" name="f_nom" size="20"></td>
		<td>votre prénom: <input type="text" name="f_prenom" size="20"></td>
	</tr>

	<tr>
		<td>votre mail: <input type="text" name="f_mail" size="40"></td>
		<td><input type="submit" value="envoyer"></td>
	</tr>

</table>
</form>

ce qui affichera ceci :

Merci de m'indiquer :
votre nom:  votre prénom: 
votre mail: 

Commentaires :

Ce tableau est un formulaire classique (vous pouvez peaufiner sa présentation et les différentes options de façon classique, regardez l'aide html pour cela) avec quelques ajouts.
Dans la première ligne on a ajouté : action="<?echo $PHP_SELF?>">
ceci permet d'afficher les résultats dans la même page. Si vous voulez que lorsque le formulaire est saisi une autre page soit affichée, par exemple pour remercier vos visiteurs, indiquez le chemin de cette page à cet endroit : action="merci.php".

Le nom des boites de texte (ici f_nom et f_prenom) sera utilisé comme variable dans php en ajoutant un simple $ devant. Dans php, $f_nom renvoie le contenu de ce qui a été saisi dans la boite f_nom. Le "f_" est juste un truc que j'utilise pour me souvenir de la provenance de la variable (f_ pour formulaire).

Envoi des données vers la table tutoriel

Nous allons maintenant récupérer les données, les traiter et les envoyer sur la table tutoriel.
Pour plus d'homogénéité, nous voulons que tous les noms propres soient en minuscule avec la première lettre en majuscule. Il faut aussi traiter les problèmes d'affichage de certains caractères comme l'apostrophe dans un nom qui sont des caractères réservés en php. Ces caractères sont : l'apostrophe, le guillemet et l'antislash lui même. On "échappe" ces caractères enajoutant un antislash devant, ce que fait la fonction php addslashes.

<? 
//récupération et traitement des valeurs :
  $nom=$f_nom;
  $nom=strtolower($nom); // met les noms en minuscule
  $nom=ucfirst($nom); //met la première lettre en majuscule
  $nom=addslashes($nom);
  $prenom=addslashes(ucfirst(strtolower($f_prenom))); //écriture plus condensée !
  $mail=$f_mail;

// envoi à la base de données
// on commence par se connecter :
  require("connect.php"); // modifiez cette ligne pour indiquer le chemin de votre fichier connect
// on utilise l'instruction insert into pour ajouter les nouvelles données
  $insert = mysql_query("insert into tutoriel values ('', '$nom', '$prenom', '$mail' )" 
  or die ("Impossible de se connecter ").mysql_error();	
		
  mysql_close($connexion); // Pour fermer l'accès
  echo "Merci d'avoir ajouté votre nom sur nos listes !";
		
//envoi d'un mail au webmaster. Vous pouvez compètement supprimer cette partie
//attention, ça ne fonctionne pas en local mais c'est OK sur online ou free. 
//Certains FAI n'acceptent pas ou proposent une syntaxe un peu différente
  $sujet ="un nouveau lecteur s'est inscrit";
  $d= date ( "d/m/Y" );
  $msg="le $d, $nom, $mail, a ajouté son nom sur la table tutoriel";
   if (!email("webmaster", "webmaster@monsiteamoi.net", $sujet, $msg))
     {echo "Le mail n'a pas été envoyé suite à une erreur.<br>";}
   else{echo "Un mail a été envoyé au webmaster pour le prévenir de votre proposition.<br>";}

//réinitialisation pour nouvelle saisie 
  unset($nom, $prenom, $mail);
?>

Optimisation

ce script fonctionne tel quel mais à l'ouverture de votre page, des données vides sont envoyées vers votre table. Pour éviter cela, on va ajouter un test de validation de formulaire: dans le formulaire, on ajoute un champ caché f_valid dont la valeur initiale est 0. Elle passera à 1 après validation et on n'enverra les données vers la table qu'à cette condition.
On va donc en fait inverser le traitement :
on met le code php AVANT le formulaire. De cette façon, rien n'est envoyé à la base de données tant que les données n'ont pas été saisies. Quand on valide le formulaire, le champ f_valid passe à 1, la page est rappelée, les données traitées et envoyées vers la table.

A ce stade notre page est donc construite comme ceci :

  <html>
  <head>
  </head>

  <body>

  <? 
   if ($f_valid=="1") {
//récupération et traitement des valeurs :
   $nom=$f_nom;
   $nom=strtolower($nom); // met les noms en minuscule
   $nom=ucfirst($nom); //met la première lettre en majuscule
   $nom=addslashes($nom);
   $prenom=addslashes(ucfirst(strtolower($f_prenom))); //écriture plus condensée !
   $mail=$f_mail;

// envoi à la base de données
// on commence par se connecter :
   require("connect.php"); // modifiez cette ligne pour indiquer le chemin de votre fichier connect
// on utilise l'instruction insert into pour ajouter les nouvelles données
   $insert = mysql_query("insert into tutoriel values ('', '$nom', '$prenom', '$mail' )" 
    or die ("Impossible de se connecter ").mysql_error();	
		
   mysql_close($connexion); // Pour fermer l'accès
   echo "Merci d'avoir ajouté votre nom sur nos listes !";
		
//envoi d'un mail au webmaster. Vous pouvez compètement supprimer cette partie
//attention, ça ne fonctionne pas en local mais c'est OK sur online ou free. Certains FAI n'acceptent 
//pas ou proposent une syntaxe un peu différente
  $sujet ="un nouveau lecteur s'est inscrit";
  $d= date ( "d/m/Y" );
  $msg="le $d, $nom, $mail, a ajouté son nom sur la table tutoriel";
    if (!email("webmaster", "webmaster@monsite.net", $sujet, $msg))
     {echo "Le mail n'a pas été envoyé suite à une erreur.<br>";}
    else{echo "Un mail a été envoyé au webmaster pour le prévenir de votre proposition.<br>";}

	//réinitialisation pour nouvelle saisie 
  unset($nom, $prenom, $mail);
} // fin de if f_valid=1
?>

<form method="post" action="<?echo $PHP_SELF?>">
<table border=1 align=center>

	<tr>
		<td colspan=2>Merci de m'indiquer :</td>
	</tr>
	<tr>
		<td>votre nom: <input type="text" name="f_nom" size="20"></td>

		<td>votre prénom: <input type="text" name="f_prenom" size="20"></td>
	</tr>
	<tr>
		<td>votre mail: <input type="text" name="f_mail" size="40"></td>

		<input type=hidden name=f_valid value="1">

		<td><input type="submit" value="envoyer"></td>
	</tr>
</table>
</form>
</body>

</html>

Dans la prochaine étape, nous verrons comment ajouter une étape de validation des données envoyées à la table.

Fonction f_valid de votre logiciel

Undefined variable: f_valid in C:\Program Files\EasyPHP-5.3.3.1\www\etre\fc-phpformulaire1.php on line 14
c'est à dire à la ligne: if ($f_valid=="1") {
Il m'est impossible de poursuivre avec cet exemple puisque j'ai cette erreur continuelle .
Quelqu'un peut-il m'aider à résoudre ce problème alors que j'ai copier et coller le code php?
Sincères salutations
claudine