Récupérer données d'un formulaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récupérer données d'un formulaire

par dunbar » 29 juin 2009, 15:29

Bizarre chez moi ça fonctionne :?

par omezine » 28 juin 2009, 22:31

Salut Dunbar,

J'ai essayé avec ta boucle mais le formulaire envoie Array comme donnée.

Il vaut mieux que je crée dans ma table des champs pour chaque jour de la semaine ? Avec comme réponse OUI ou NON ou stocker tous les jours cochés dans le même champ ?

par dunbar » 28 juin 2009, 22:08

Salut,

Pourquoi pas une simple boucle :?:
<?php
$disponibilite = $_POST['dispo'];
for($i=0;$i<sizeof($disponibilite);$i++) //-->Tant que $i est inferieur au nombre d'éléments du tableau.--**
    {
    echo  stripslashes($disponibilite[$i]); //-->On affiche le(s) resultat(s), exemple Mardi-Mercredi-Vendredi-.--//
    echo '-';
    }

?>

par momox » 28 juin 2009, 21:31

J'essayais de le mener vers la solution tout doucement ;) mais tu n'as pas parasité ce que j'aidit.
Par contre, au lieu de sérialiser le tableau, je vérifierais tout d'abord que celui-ci contient des jours valides via un array_intersect() en utilisant d'un coté le tableau renvoyé via post et un tableau contenant tous les jours possibles.

Secundo, pour le stockage, utilisation d'implode() plutôt que serialize(), ce qui permet par la suite de faire des traitements directement en SQL ;)

par micetf » 28 juin 2009, 20:09

Bonsoir,

J'espère ne pas trahir momox en rajoutant ceci.
*********************************************************
Dans ton formulaire,
tu dois modifier tes input checkbox
<input type="checkbox" name="dispo" value="lundi" />
en
<input type="checkbox" name="dispo[]" value="lundi" />
ainsi, tu récupèreras les cases cochées dans un tableau.
Par exemple, si tu coches lundi et jeudi,
tu auras $_POS['dispo'] égal à array(0=>'lundi',1=>'jeudi').

A partir de là,
pour appliquer ton stripslashes aux valeurs de ton tableau,
il faut exécuter
$dispo = array_map("stripslashes",$_POST['dispo']);
Ensuite, pour stocker ton tableau dispo dans ta base de données,
j'utiliserais la fonction serialize() qui le transforme en chaîne de caractères.
$dispo = serialize(array_map("stripslashes",$_POST['dispo']));
Pour notre exemple : "a:2:{i:0;s:5:"lundi";i:1;s:5:"jeudi";}"
Lors de la lecture, il suffira d'utiliser la fonction unserialize() pour retrouver le tableau.

***********************************************************************
Quant aux messages d'erreurs sur une autre page,
en fait,
il faut que les contrôles, les traitements et le formulaire soient sur la même page.
En gros, tu peux une construire une page "formulaire.php" du style :

Code : Tout sélectionner

Si j'ai reçu des donnees ($_POST) Je contrôle la validité des données transmises. Si pas d'erreur je fais mes traitements. Si je n'ai pas reçu de données ou que j'ai une erreur J'affiche mon formulaire + eventuellement erreur Sinon j'affiche le résultat de mes traitements

Fred

par omezine » 28 juin 2009, 17:20

Oula ça devient compliqué pour moi.

J'ai déjà essayé de travailler sur les champs vide, par contre il m'affiche le message que le champ est vide sur une autre page, comment faire pour que le message apparaisse en dessous du champ concerné ?
<?php
mysql_connect("localhost", "login", "motdepasse")  OR die('Erreur de connexion à la base');
mysql_select_db("nomdelabase");

if(isset($_POST['Valider']))
{

$prenom = stripslashes($_POST['prenom']);
$pseudo = stripslashes($_POST['pseudo']);
$tournoi = stripslashes($_POST['tournoi']);
$dispo = stripslashes($_POST['dispo']);
$email = stripslashes($_POST['email']); 

if(empty($prenom)){
echo 'Veuillez indiquer votre prénom. <br/>';
}
else if(empty($pseudo)){
echo 'Veuillez indiquer votre pseudo.<br/>';
}
else if(empty($joueur)){
echo 'Veuillez indiquer le tournoi choisi.<br/>';
}
else if(empty($email)){
echo 'Veuillez indiquer votre adresse email.<br/>';
} else

{
// On ajoute une entrée avec mysql_query
$req = ("INSERT INTO inscriptions (ins_prenom,ins_pseudo,ins_tournoi,ins_dispo,ins_email)
VALUES ('".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')");
echo $req;
$res = mysql_query($req) or die ("Requête échouée");

}
}

mysql_close();
?>

par momox » 28 juin 2009, 16:17

Ton script ne prend pas en compte le fait que tu puisses cocher plusieurs fois le checkbox portant le nom "dispo"
Pour ce faire, tes checkbox doivent s'appeller dispo[] via l'attribut html name.
Cela te retournera un tableau comprenant l'attribut value des checkbox cochées, que tu devras traiter afin de récuprer les informations necessaires via une boucle ou un implode.
N'oublie pas de traiter ce tableau avec array_map() afin de le proteger des injections de code SQL comme tout autre entrée de formulaire réutilisée dans une requête SQL.

par omezine » 28 juin 2009, 15:39

Super, merci micetf, j'avance, j'avance !!

Alors maintenant, voila ce qui s'affiche après avoir validé le formulaire :
INSERT INTO inscriptions (ins_prenom,ins_pseudo,ins_tournoi,ins_dispo,ins_email) VALUES ('Essai','Monpseudo','saison1poule1','jeudi','[email protected]')
La base de données est enfin remplie ! Mais par contre j'ai essayé plusieurs fois, et elle s'est remplie plusieurs fois avec les mêmes données. Comment empêcher cela ?

Pour ce qui est des cases à cocher je n'ai qu'une seule réponse : jeudi. Alors que j'ai coché Lundi, Mardi et Jeudi.

par micetf » 28 juin 2009, 15:27

En passant,
je viens de voir ceci qui n'est pas correct :
if (isset($POST['Valider']) ) 
Ce n'est pas $POST mais $_POST donc le code correct est :
if (isset($_POST['Valider']) ) 
Fred

par omezine » 28 juin 2009, 15:00

D'accord.

Voici la page HTML nommée tournoi_formulaire.html :

Code : Tout sélectionner

<div id="page-body"> <form method="post" action="traitement_formulaire.php"> <div class="panel"> <div class="inner"><span class="corners-top"><span></span></span> <h2>Inscription</h2> <fieldset class="fields2"> <dl> <dd><strong>Veuillez remplir le formulaire ci-dessous pour participer au tournoi MySlam.</strong></dd></dl> <dl> <dt><label for="prenom">Prénom :</label></dt> <dd><input type="text" size="25" tabindex="1" name="prenom" class="inputbox autowidth" /></dd> </dl> <dl> <dt><label for="pseudo">Pseudo :</label></dt> <dd><input type="text" size="25" tabindex="2" name="pseudo" class="inputbox autowidth" /></dd> </dl> <dl> <dt><label for="tournoi">Choix du tournoi : </label></dt> <dd><select name="tournoi"> <optgroup label="Tournoi saison 1"> <option value="saison1poule1">Poule 1</option> <option value="saison1poule2">Poule 2</option> </optgroup> <optgroup label="Tournoi saison 2"> <option value="saison2poule1">Poule 1</option> <option value="saison2poule2">Poule 2</option> </select></dd> </dl> <br /> <dl> <dt><label for="dispo">Disponibilités : </label></dt> <dd><input type="checkbox" name="dispo" value="lundi" /> Lundi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="mardi" /> Mardi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="mercredi" /> Mercredi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="jeudi" /> Jeudi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="vendredi" /> Vendredi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="samedi" /> Samedi</dd> </dl> <dl> <dd><input type="checkbox" name="dispo" value="dimanche" /> Dimanche</dd> </dl> <br /> <dl> <dt><label for="email">Adresse email : </label></dt> <dd><input type="text" name="email" size="25" class="inputbox autowidth"/></dd> </dl> </fieldset> <span class="corners-bottom"><span></span></span></div> </div> <div class="panel"> <div class="inner"><span class="corners-top"><span></span></span> <fieldset class="submit-buttons"> <input type="submit" name="Valider" value="Valider" class="button1" /> </fieldset> <span class="corners-bottom"><span></span></span></div> </div> </form> </div>
Ensuite voici mon fichier PHP nommé traitement_formulaire.php :
<?php
mysql_connect("localhost", "login", "motdepasse")  OR die('Erreur de connexion à la base');
mysql_select_db("nomdelabase");

if (isset($POST['Valider']) )
{
$prenom = isset($_POST['prenom']) ? $_POST['prenom'] : "pas de prénom";
$pseudo = isset($_POST['pseudo']) ? $_POST['pseudo'] : "pas de pseudo";
$tournoi = isset($_POST['tournoi']) ? $_POST['tournoi'] : "pas de tournoi";
$dispo = isset($_POST['dispo']) ? $_POST['dispo'] : "pas de dispo";
$email = isset($_POST['email']) ? $_POST['email'] :  "pas de email";

// On ajoute une entrée avec mysql_query
$req = ("INSERT INTO inscriptions (ins_prenom,ins_pseudo,ins_tournoi,ins_dispo,ins_email)
VALUES ('".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')");
echo $req;
$res = mysql_query($req) or die ("Requête échouée");

}

mysql_close();
?>
Voici la structure de ma table :

Code : Tout sélectionner

Structure de la table `inscriptions` CREATE TABLE `inscriptions` ( `id` mediumint(9) NOT NULL auto_increment, `ins_prenom` text collate latin1_german2_ci NOT NULL, `ins_pseudo` text collate latin1_german2_ci NOT NULL, `ins_tournoi` text collate latin1_german2_ci NOT NULL, `ins_dispo` text collate latin1_german2_ci NOT NULL, `ins_email` text collate latin1_german2_ci NOT NULL, KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=1 ;

par dunbar » 28 juin 2009, 14:50

oups :D je viens de modifier cette ligne.

Alors résultat : page blanche et toujours la base vide :( Alors là je ne comprends vraiment pas !
Montre les deux fichiers stp

par omezine » 28 juin 2009, 14:42

oups :D je viens de modifier cette ligne.

Alors résultat : page blanche et toujours la base vide :( Alors là je ne comprends vraiment pas !

par dunbar » 28 juin 2009, 14:36

Merci, j'ai bien ajouté

Code : Tout sélectionner

name="Valider"
Ainsi que tout le code d'Albat mais malheureusement j'ai toujours l'erreur ligne 15
VALUES ('""','".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')");
:afraid: :afraid: NOn

9a c'est la ligne de ALBAT
VALUES ('".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')"; 
Elle ne correspond pas du tout a la tienne.

par omezine » 28 juin 2009, 14:34

Merci, j'ai bien ajouté

Code : Tout sélectionner

name="Valider"
Ainsi que tout le code d'Albat mais malheureusement j'ai toujours l'erreur ligne 15
VALUES ('""','".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')");

par dunbar » 28 juin 2009, 14:29

Non rajoute simplement ceci
Ta ligne
<input type="submit"  value="Valider" class="button1" />
Correction :
<input type="submit" name="Valider" value="Valider" class="button1" />
Et ça devrais fonctionner, ceci dis suivre également les conseils de ALBAT ne serais pas du luxe :wink:
MAJ :

Parce que quand je regarde ta ligne :
VALUES ('""','".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')"); 
Et celle de ALBAT
VALUES ('".$prenom."','".$pseudo."','".$tournoi."','".$dispo."','".$email."')";

Il y a comme une certaine différence :-k