8722 sujets

Développement web côté serveur, CMS

Bonjour à tous, voila jai fait un formulaire PHP qui vérifie que tous les champs sont remplis avanty d'être envoyer, sinon on redemande le formulaire, seulement j'aimerai que les champs qui ont déjà été rempli le restent, comment on peut faire ?

<div id="centre">
<div id="centretxt">
<div id="texte">
<FORM METHOD="POST" ACTION="<?php echo $_SERVER["PHP_SELF"] ?>">
  <table align="center" border="0" width="400">
  <p>Veuillez remplir le formulaire, toutes les cases notées d'un * sont obligatoires</p>

    <tbody>

      <tr>

        <td width="200"><b>Nom* </b></td>

        <td width="200"> <input name="login" type="text"> </td>

      </tr>

      <tr>

        <td width="200"><b>Prenom*</b></td>

        <td width="200"> <input name="prenom" type="text"> </td>

      </tr>

      <tr>

        <td width="200"><b>Mot de Passe*</b></td>

        <td width="200"> <input name="mdp" type="password"> </td>

      </tr>

      <tr>

        <td width="200"><b>E-Mail*</b></td>

        <td width="200"> <input name="mail" type="text"> </td>

      </tr>

 
        <td width="200"><b>Adresse*</b></td>

        <td width="200"> <input name="rue" type="text"> </td>

      </tr>

      <tr>

        <td width="200"><b>Code postale*</b></td>

        <td width="200"> <input name="cp" type="text"> </td>

      </tr>
      
            <tr>

        <td width="200"><b>Ville*</b></td>

        <td width="200"> <input name="ville" type="text"> </td>

      </tr>

      <tr>
      <tr>

        <td colspan="2"> <input name="OK" value="Envoyer les informations" type="submit"> </td>
       

      </tr>

           </tbody>
  </table>
<?php
// On commence par récupérer les champs
if(isset($_POST["OK"]) && !empty($_POST["OK"]))
{
($_POST['login']);
if(isset($_POST['login']))      $login=$_POST['login'];
else      $login="";

($_POST['prenom']);
if(isset($_POST['prenom']))      $prenom=$_POST['prenom'];
else      $prenom="";

$_POST['mdp'];
if(isset($_POST['mdp']))      $mdp=md5($_POST['mdp']);
else      $mdp="";

if(!ereg('([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)', $_POST['mail'])){
	 echo 'Attention l\'email doit être de forme ***@***.com<br>';
	
}
else {($_POST['mail']);
if(isset($_POST['mail']))      $mail=$_POST['mail'];
else      $mail="";}

if(isset($_POST['rue']))      $rue=$_POST['rue'];
else      $rue="";


if(isset($_POST['cp']))      $cp=$_POST['cp'];
else      $cp="";


if(isset($_POST['ville']))      $ville=$_POST['ville'];
else      $ville="";

    
// On vérifie si les champs sont vides
if(empty($login) OR empty($prenom) OR empty($mdp) OR empty($mail) OR empty($rue) OR empty($cp) OR empty($ville))
{
 echo ('<font color="red">Attention, veuillez remplir tout les champs </font>');
}

//Aucun champ n'est vide, on peut enregistrer dans la table
else     
{
       // connexion à la base
$db = mysql_connect('localhost', 'root', '')  or die('Erreur de connexion ');
// sélection de la base  

    mysql_select_db('projet',$db)  or die('Erreur de selection ');
    
    // on écrit la requête sql
    $sql = "INSERT INTO users(id, login, prenom, mdp, mail, rue, cp, ville) VALUES('','$login','$prenom','$mdp','$mail', '$rue', '$cp', '$ville')";
    
    // on insère les informations du formulaire dans la table
    mysql_query($sql) or die('Erreur SQL !');

    // on affiche le résultat pour le visiteur
    echo 'Vos infos on été ajoutées.';
 }   } 
  
?> 

</form>
</div>
</div>
</div>


Voici le code,

Merci d'avance Smiley lol
Hello,

Dans le formulaire, par exemple pour le champ prénom:


<input name="prenom" type="text" value="<?php echo $_POST['prenom']; ?>">


Voilà, pas plus compliqué que ça Smiley smile
Hello.
SuD a écrit :

<input name="prenom" type="text" value="<?php echo $_POST['prenom']; ?>">
Avec un petit htmlspecialchars pour bien faire ! Smiley smile
salut julien, chacun sont tour Smiley smile
tant que le formulaire n'est pas envoyé, ne pas mettre de htmlspecialchars pour deux raisons, avec des allers-retours successif en cas d'erreurs répétées, le résultat va être mignon... et si le formulaire doit partir mar mail, il ne faut pas encoder les caractères qui seront inscrits encodés dans le mail, le htmlspecialchars ou entities se fait à partir du moment où ont commence à traiter les données pour les stocker côté serveur ou pour les afficher dans du corps html (except pour les champs de formulaires qui ne les décodent pas

have swing
virtualgadjo a écrit :
salut julien, chacun sont tour Smiley smile
Hello. Euh, désolé, mais pas cette fois-ci. Smiley cligne
virtualgadjo a écrit :
tant que le formulaire n'est pas envoyé, ne pas mettre de htmlspecialchars pour deux raisons, avec des allers-retours successif en cas d'erreurs répétées, le résultat va être mignon...
Je crois que tu ne comprends pas trop.

A partir du moment où la valeur de $_POST['prenom'] doit être utilisée dans l'attribut value, il faut absolument échapper les caractères "&", "<", ">" et """. Quand le navigateur parse le document, il transforme les entités en leurs caractères correspondants.

Et heureusement, sinon que se passerait-il si l'utilisateur soumettait la valeur suivante ?
"><script>alert("Coin Coin");</script>
Si tu ne t'en doutes pas, amuse-toi à faire le test !
Modifié par Julien Royer (27 Mar 2007 - 16:47)
ouh le coquin de canard qui me prend pour un poussin de l'année, (d'il y a bientôt cinquante ans oui Smiley smile dont dix les doigts dans php, depuis ses balbutiements en gros Smiley smile )

Attention, je dis bien ne pas manipuler les caractères, mais, oeuf (encore une histoire de poussin) corse, ça ne veut pas dire en virer impitoyablement toute chose pouvant être considérée comme nocive, sans pitié, je suis Smiley smile . Un petit strip_tags() me parait plus approprié...

@ sous peu

have swing
Modifié par virtualgadjo (27 Mar 2007 - 17:22)
J'avoue que ce que tu me dis me fait en effet te prendre pour un poussin. Smiley cligne

Teste le code suivant :
<form action="action">
  <input type="hidden" name="test" value="&quot;&lt;&gt;&amp;" />
  <input type="submit" value="OK" />
</form>
et tu verras que ton navigateur transmettras bien la valeur "<>& pour la variable test (et non &quot;&lt;&gt;&amp;).

Quant à ta solution (utiliser strip_tags) : si l'utilisateur a entré des caractères spéciaux dans le formulaire, il les perdra. ca ne te semble pas un peu exagéré ? Smiley cligne
Modifié par Julien Royer (27 Mar 2007 - 17:44)
:) un poil c'est vrai mais allez va, strip_tags a même une option qui permet d'en autoriser certaines (mauvaise idée, un simple <b> peut contenir un évènement javascript...). Mais je prends strip_tags(), plutôt comme exemple, perso, j'utiliserais plutôt une expression régulière pour supprimer les balises ouvrantes et fermante contenant une liste de contenu "sensible"

Sinon, je prends un cas classique, un formulaire qui va envoyer son contenu par mail et le stocker ensuite dans une base.

Si à chaque aller-retour tant que le formulaire n'est pas correctement rempli s'applique un htmlspecialchars, effectivement le champ de formulaire interprètera les caractères spéciaux, mais le mails sera truffé de
&quot; &amp; &lt; 
and co, les mails au format texte lisant les caractères brut de décoffrage.

Du coup, perso, je reconnais, impitoyable, no balise, ou alors insérée par l'outil que je mets en place genre fck editor sans l'option accès à la source et je nettoie tout ce que je ne veux pas voir.

Ensuite je fais mes allers retours tranquille, balance mon petit mail bien propre et ensuite échappe les variables avant de stocker dans la base. Quelques mauvaises surprises m'ont fait choisir entre "oh le gentil visiteur qui veut mettre en forme son message" Smiley smile et le gus système chez le client qui s'en tape du net, de la beauté du geste, etc, et me tombe sur le poil (pour rien) à la moindre occasion avec un rire narquois genre "pfff ces programmeurs de langages interprétés Smiley smile "

Mais je reconnais que, ça prend du temps, que du coup, peu de solution toute faite, chaque cas demande de se prendre le choux avec qui autorise quoi, veut laisser quelle impression de liberté à ses visiteurs, à quel prix, etc, etc

voilou, je me rends compte qu'avec tout ça, je ne suis pas sûr que nous ayons répondu à la question de base alors, sans doute, à suivre Smiley smile

Have swing
alors merci ça marche nikel sauf que dans les variable $post j'ai des <br/> qui squatte et je vois pas de où ils sortent Smiley eek
regarde la source HTML, c'est peut être des erreurs de notice qui ne sont pas affiché entièrement à cause des input.
en effet

<td width="200">: <input name="login" type="text" value="<br />
<b>Notice</b>: Undefined index: login in <b>c:\program files\easyphp1-8\www\bb\login.php</b> on line <b>16</b><br />
"> </td>

Mais je vois pas pourquoi il met ce message
Nico3333fr a écrit :
C'est pas encore plus direct d'utiliser htmlentities() ?
Direct ? Qu'est-ce que tu veux dire par là ? htmlentities échappe beaucoup plus de caractères, ce qui est inutile si l'encodage de ta page est correctement défini.
Modifié par Julien Royer (30 Mar 2007 - 09:38)
Jack O'Neill a écrit :
en effet

<td width="200">: <input name="login" type="text" value="<br />
<b>Notice</b>: Undefined index: login in <b>c:\program files\easyphp1-8\www\bb\login.php</b> on line <b>16</b><br />
"> </td>

Mais je vois pas pourquoi il met ce message


Cette erreur "notice" se produit quand on tente de lire la variable $_POST['login'] alors que cette varable n'est pas renseignée. En gros, le champ login est resté vide dans le formulaire.

Deux façon de lever l'erreur : utiliser error_reporting (hum, hum)
ou lire les variables avant de les utiliser :


$login = (isset($_POST['login'])) ? $_POST['login'] : "";


Ensuite, dans le code du formulaire :


<input name="login" value="<?php echo $login?>" />


et ceci non-obstant les remarques sur htmlspecialchars() et les vérifications d'usage sur les variables $_POST...

(il est où, Bison?)
Bonjour à tous, une manière plus lourde mais qui marche parfaitement.

Il faut avoir un petit :

<input type="hidden" name="envoie_form" value="oui" />


Ainsi, au départ de ton formulaire, tant qu'il n'a pas eu la variable ENVOIE_FORM qui vaut oui, alors il n'essaie pas d'insérer le contenu de tes variable qui n'existait pas.


Edit : Il faut bien sur (après relecture de mon écris oops) initialiser la variable Envoie_form

$envoie_form= (isset($_POST['envoie_form'])) ? $_POST['envoie_form'] : "";
/edit

En clair :

<input name="login" value="<?php if ($envoie_form){ echo htmlspecialchars($_POST['login']); } ?>" />


L'intéret de faire ainsi, c'est que si ton formulaire évolue tu n'as qu'un champs input à rajouter avec le bout de code.

Tu n'as pas besoin d'initialiser toutes les variables de ta page.
Modifié par Super_baloo8 (31 Mar 2007 - 15:11)
Super_baloo8 a écrit :
Bonjour à tous, une manière plus lourde mais qui marche parfaitement.

Il faut avoir un petit :

<input type="hidden" name="envoie_form" value="oui" />

Ca ne sert à rien Smiley cligne

Le plus mieux 2000 est de tester le type de requête :
if($_SERVER['REQUEST_METHOD'] == 'POST') {

  // verif

} else {

  // affichage initial
}
Bonjour.

J'ai posté dans le bar du forum un topic sur une illustration de ce qu'il serait possible de faire en utilisant une syntaxe modifiée de l'attribut "target".

http://forum.alsacreations.com/topic-9-24398-1-Extension-du-champ-dapplication-de-lattribut-target.html

Cette modification propose de donner l'identificateur d'un élément du DOM comme cible du résultat de la soumission d'un formulaire ou comme zone d'affichage d'un lien.

On remarquera le "#" dans le contenu de la propriété "target":

<form method="get" action="php/testform2.php" target="#reponse">



Techniquement, ceci se réalise via un bout de javascript qui intercepte les attributs target mentionnant effectivement un id, et modifient submit en conséquence.


<!DOCTYPE html SYSTEM "http://lomago.com/xhtarget/dtd/xhtml-xhtarget.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<title>Formulaire</title>
		<script type="text/javascript" src="js/xhtarget.js"> </script>
	</head>
<body>
<form method="get" action="php/testform2.php" target="#reponse">
  <table align="center" border="0" width="400">
  <p id="reponse">Veuillez remplir le formulaire, toutes les cases notées d'un * sont obligatoires</p>

    <tbody>
      <tr>
        <td width="200"><b>Nom* </b></td>
        <td width="200"> <input name="login" type="text"> </td>
     ...
      <tr>
        <td colspan="2"> <input name="OK" value="Envoyer les informations" type="submit"> </td>
      </tr>
    </tbody>
  </table>
</form>
<body>
</html>


Le code de validation php se situe dans fichier externe dont le résultat est réorienté vers la balise "p" munie de l'id "reponse".


<?php
$count = (isset($_GET)) ? count($_GET) : 0;
$s="";
$ok=true;
if ($count > 0)
{
	foreach($_GET as $name=>$value)
	{
		if ($value=="")
		{
			$s .= "<div>Le champ $name n'est pas renseigné, veuillez le compléter</div>";	
			$ok = false;
		}
	}
}

if ($ok)
{
	$s.= "<div>Félicitation !! le formulaire est bien rempli. Encore Bravo!</div>";
}

echo $s;
?>


De cette manière, il n'y a pas de regénération du formulaire, celui-ci reste en l'état, conservant les saisies des visiteurs.
A chaque soumission, le code php effectue des tests, et élabore un message en conséquence. Ce message s'affiche dans la balise "<p id="reponse"">

J'ai mis une petite démo en ligne pour se faire une idée:
http://www.lomago.com/xhtarget/formulaire.html

... Ainsi qu'un petit exposé sur la proposition.
http://www.lomago.com/xhtarget