Refait :
ps : je ne peux pas le faire à ta place !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // test echo 'requete : <br />'.$user_site_SQL.'<br /><br />'; echo 'user_site_array : <br />'; echo '<pre>'; print_r($user_site_array); echo '<pre>';
Alors, prends-en l'initiative, ok ?
- Vérifie les requetes (c'est bien les bons noms de champs ?)
- vérifie dans la base de données,
- fait des echo des données : $id_formulaire, ............
- ...
Alors ? Tu abandonnes ??
Non, non je me galère toujours autant...
A partir du moment où $user_site_nbre est tout le temps égal à zéro aucune condition n'est prise en compte, donc le problème se situe à ce niveau, j'ai bien vérifié toutes les variables et les requêtes et ça m'a l'air correct. Mais je ne sais pas d'où peut venir l'erreur, à part de la requête $user_site_SQL comme les cases cochées par l'utilisateur ne sont pas prises en compte.
Je ne peux rien faire si tu ne donnes ni code, ni résultats d'affichage, ni tests des echo, ...
En fait $id_formulaire n'affiche rien car il n'est disponible que dans l'état envoi.
Si les données ne sont pas envoyées à la bdd le code ne passe pas dans cet état et donc ne récupère pas $id_formulaire. Je me suis donc placé qu'à l'état envoi même si à cet état le formulaire ne doit pas réapparaître mais $user_site_nbre est toujours égale à 0 même si $id_formulaire est égale à 5 par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 // si etat : envoi if($etat=='envoi'){ //requêtes pour insertion des données dans la bdd étant donné que toutes les données ont été validées $sql = "INSERT INTO formulaire(id, nom, prenom, adresse, code_postal, ville, telephone, fax, email, devis, contact) VALUES('','$nom','$prenom','$adresse','$code_postal','$ville','$telephone','$fax','$email', '$devis', '$contact')"; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); $id_formulaire = mysql_insert_id();// on récupère l'id_formulaire qui vient d'être généré // table : siteformulaire if(isset($aSite)){// array $aSite foreach($aSite as $n_site){ $sql = "INSERT INTO siteformulaire(id_formulaire, id_site) VALUES ('$id_formulaire','$n_site')"; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); } } // table : demandeformulaire if(isset($aDemande)){ // array $aDemande foreach($aDemande as $n_demande){ $sql = "INSERT INTO demandeformulaire(id_formulaire, id_demande) VALUES ('$id_formulaire','$n_demande')"; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); } } } // fin si etat : envoi // ----------------------------------------
Je ne comprend pas, depuis que j'ai changé avec ce code que tu m'as donné...
... les expressions régulières que j'ai inséré pour vérifier le format de chaque champs (ici avec l'exemple du nom) ne sont plus pris en compte pour les accents.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $nom = (isset($_POST['nom']))? htmlentities($_POST['nom'], ENT_QUOTES) : '';
Par exemple si j'entre le nom "josé", ce champ sera considéré comme nom valide alors que ma fonction de vérification acceptait ce champs comme valide avec le code ci dessous que tu m'as demandé de changer.
Ma fonction de vérification du champ nom étant sous la forme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $nom=$_POST['nom']; if(isset($nom)){htmlentities($nom, ENT_QUOTES);}
Pour mes histoires de checkbox je verrais demain mais je ne saisi vraiment pas l'ordre dans lequel sont traitées les données. Du moins je n'arrive pas à me représenter sous forme de tableau comment les données sont gérées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function VerifierNom($nom) { $SyntaxeNom='`^[a-zA-ZàâÂéèêÊîôÔûùÛç-\s]{2,}$`'; //"-\s" autorise le tiret et l'espace etc... if(preg_match($SyntaxeNom,$nom)) return true; else return false; }
Bonne nuit
1/ Tu as raison, il faudrait revoir la logique de l'enchainement des évènements.
En cas de bug :Dans le principe :
a- initialisation des données
$etat = 'initialisation';
-- au départ, toutes les données sont vides '' (et id_formulaire = 0)
b- si formulaire transmis :
$etat = 'récupération';
b1-- récupération des données depuis le formulaire ($_POST)
b2-- gestion d'erreur
$etat = 'gestion d\'erreur';
------ vérification des données en fonction des conditions imposées
------ champs obligatoires
------ email valide
------ ...
b3-- si pas d'erreur :
$etat = 'enregistrement en cours';
------ protection des données avant enregistrement en bdd
------ enregistrement en bdd
------ récupération id_formulaire (last_insert_id)
------ si tout s'est bien passé
$etat = 'enregistrement ok';
b4-- si erreur :
$etat = 'erreur';
------ message + ré-affichage du formulaire
c- affichage du formulaire
SI ($etat != 'enregistrement ok') :
-- ...
-- checkbox : on affiche la liste.
-- si ($id_formulaire>0) -> formulaire transmis : doit récupérer la liste enregistrée pour pouvoir ré-afficher les cases cochées
-- ...
en mettant des echo $etat; un peu partout, tu peux aussi vérifier "par où ca passe" et "où ca coince" ...
2/ Récupération des données : on va suivre ces conseils, et virer les htmlentities
Par contre, à l'affichage, il faudra utiliser htmlspecialchars($nom)
Code : Sélectionner tout - Visualiser dans une fenêtre à part $nom = (isset($_POST['nom']))? $_POST['nom'] : ''; // ca suffit.
3/ tes fonctions de vérification ne servent pas à grand'chose, surtout si tu ne fais que vérifier si la chaine à plus de 2 caractères !
- Intéresse-toi à : filter_input(), Validate filters (exemples), Sanitize filters, ...
- et pour vérifier la longueur des chaines : strlen()
4/ Pour les checkbox : là aussi, il faudrait que tu comprennes bien comment tout fonctionne :
- affichage de la liste,
- récupération des cases cochées pour enregistrement en bdd,
- puis récupération des cases cochées pour ré-affichage dans la liste.
Bref : il faut en effet revoir tout ca.
Dernière modification par Invité ; 20/08/2011 à 09h42.
Pour la CONCEPTION des tables, on va simplifier :
on peut se débarasser des tables intermédiaires "demandeformulaire" et "siteformulaire" :
Au moment de récupérer les checkbox cochées par l'utilisateur :Table "formulaire" (=> infos sur l'utilisateur. 1 utilisateur = 1 formulaire)
- id_formulaire (clé, auto-increment)
- nom
- prenom
- adresse
- code_postal
- ville
- list_id_site (de la forme : 1,3,7,8,...)
- list_id_demande (de la forme : 1,2,5,9,...)
Table "siteformulaire" (table intermédiaire): supprimée
Table "demandeformulaire" (table intermédiaire): supprimée
Table "site" (=> liste pour les checkbox "site")
- id_site (clé, auto-increment)
- n_site
Table "demande" (=> liste pour les checkbox "demande")
- id_demande (clé, auto-increment)
- n_demande
Pour ré-afficher les checbox cochées :- on récupère donc un array $aSite et un array $aDemande
- on les transforme en liste (de la forme : 1,2,5,9,...) :
---- $liste_idSite = implode(',',$aSite);
---- $liste_idDemande = implode(',',$aDemande);
- on enregistre ces 2 listes dans la table "formulaire", dans list_id_site et list_id_demande
- recuperation de ces listes de checkbox cochées par l'utilisateur :
---- "SELECT list_id_site, list_id_demande FROM formulaire WHERE id_formulaire = '".$id_formulaire.";"
---- $list_id_site = ...; // (de la forme : 1,3,7,8,...)
---- $list_id_demande = ...; // (de la forme : 1,2,5,9,...)
---- on reforme des array :
---- $array_id_site = explode(',', $list_id_site);
---- $array_id_demande = explode(',', $list_id_demande);
A/ "site" :
- on liste TOUTES les checkbox
---- "SELECT id_site, n_site FROM site ORDER BY n_site;"
- pour chaque checkbox :
---- while {...}
---- ---- SI le formulaire a été transmis :
---- ---- if( $id_formulaire>0)
---- ---- ---- on teste si l'id_site est ou non dans la liste des id_site de l'utilisateur
---- ---- ---- if(in_array($site_row['id_site'], $array_id_demande)) -> la case est cochée
---- ---- ---- ---- $is_site_checked = ' checked="checked"';
---- ---- ---- sinon -> la case n'est pas cochée
---- ---- ---- ---- $is_site_checked = '';
B/ "demande" : (idem que pour "site")
Dernière modification par Invité ; 20/08/2011 à 09h18.
Salut
J'ai déjà commencé par corriger les déclarations de variable et je me demandais si cela est utile de mettre des htmlspecialchars ou des array_map("htmlentities",...) pour les champs de type radioboutons et checkbox puisqu'on n'y affiche jamais de texte ?
Les variables concernées étant celles ci.
Sinon pour ce qui est de la requête des checkbox site, je me suis mis toujours dans le cas envoi. Je remettrai de l'ordre après par rapport aux états. Pour l'instant je souhaiterais comprendre pourquoi cette requête ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $client = (isset($_POST['client']))? $_POST['client'] : ''; $aSite = (isset($_POST['site']))? $_POST['site'] : ''; $aDemande = (isset($_POST['demande']))? $_POST['demande'] : ''; $devis = (isset($_POST['devis']))? $_POST['devis'] : ''; $contact = (isset($_POST['contact']))? $_POST['contact'] : '';
La voici pour rappel
Dedans l'$id_formulaire est bien récupéré. Comme je te disais "$user_site_nbre" reste à zéro et ce quelque soit la saisie de l'utilisateur. Le but de cette requête est bien de sélectionner tous les "id_site" en lien avec le $id_formulaire créé et de compter leur nombre. Je suis donc reparti sur cette requête qui insère chaque $id_formulaire et $id_site.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $user_site_SQL = "SELECT site.id AS id_site FROM site INNER JOIN siteformulaire ON site.id = siteformulaire.id_site INNER JOIN formulaire ON siteformulaire.id_formulaire = formulaire.id WHERE formulaire.id = '".$id_formulaire."' ORDER BY n_site"; $user_site_resu = mysql_query($user_site_SQL); $user_site_nbre = mysql_num_rows($user_site_resu);
J'ai analysé donc $id_site mais seul le dernier id_site est sélectionné. Si on clique par exemple sur deux cases on obtiendra l'$id_site ="2" et non $id_site="1" et et "2" pour $id_formulaire = "5". De plus il n'y a pas de lien entre "$user_site_nbre" et $id_site donc il ne peut pas récupérer le nombre d'id_site enregistrés. Et je ne vois pas comment faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // table : siteformulaire if(isset($aSite)){// array $aSite foreach($aSite as $id_site){ $sql = "INSERT INTO siteformulaire(id_formulaire, id_site) VALUES ('$id_formulaire','$id_site')"; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); } }
Si possible j'aimerais garder ces tables intermédiaires que sont "siteformulaire" et "demandeformulaire".
Avant de parler de $user_site_nbre qui affiche tout le temps 0, j'aurai du te parler de $user_site_resu qui affiche le résultat suivant
requete :
SELECT s.id FROM site s INNER JOIN siteformulaire sf ON s.id = sf.id_site INNER JOIN formulaire f ON f.id = sf.id_formulaire WHERE f.id = '42' ORDER BY s.n_site
$user_site_resu :
Resource id #11
Je t'ai expliqué ici comment et pourqoui te débarasser de tes tables intermédiaires ...
Commence par là.
Ca simplifiera toutes les requêtes.
Si tu veux vraiment les garder, ... fait comme tu le sens.
Je crois voir le problème. Essaye :
Et du coup :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $user_site_SQL = "SELECT site.id AS id_site FROM site INNER JOIN siteformulaire ON site.id = siteformulaire.id_site WHERE siteformulaire.id_formulaire = '".$id_formulaire."' ORDER BY n_site";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $user_demande_SQL = "SELECT demande.id AS id_demande FROM demande INNER JOIN demandeformulaire ON demande.id = demandeformulaire.id_demande WHERE demandeformulaire.id_formulaire = '".$id_formulaire."' ORDER BY n_demande";
Dernière modification par Invité ; 20/08/2011 à 15h54.
J'y croyais plusUn changement de nom id_site en id et tout a l'air de fonctionner. Ya juste un bug qui apparait si je coche aucune checkbox "site" mais l'erreur est signalée pour la checkbox "demande" (assez bizarre...) donc si je reprend le modèle de la checkbox site sur celle de demande y devrait plus y avoir de bug
. Par contre j'ai pas compris la différence qu'il y a entre la requête que tu viens de me donner et celle qu'il y avait avant mais je vais tacher de regarder ça de plus près tout à l'heure. Je te redis ça sinon !
Je te l'avais dit dès le départ que ca prêterai à confusion !
60 messages pour en arriver là ...
ps : pour les 2 requêtes, j'ai juste enlevé une jointure inutile (on n'a pas besoin de regarder dans la table formulaire pour ces requêtes).
Tu remettras tout ton code une fois corrigé, ok ?
Oui pas de problème. Sinon il y a encore un problème dans traitement.php par rapport aux éléments dans le foreach
Voici l'erreur au niveau du foreach
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if(isset($aDemande)){ // array $aDemande foreach($aDemande as $id_demande){ $sql = "INSERT INTO demandeformulaire(id_formulaire, id_demande) VALUES ('$id_formulaire','$id_demande')"; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); } }
=> Warning: Invalid argument supplied for foreach() in C:\wamp\www/SI2I\traitement.php on line 136
L'erreur était déjà présente avant que je ne reproduise le code des checkbox "demande".
$user_demande_nbre est de nouveau égal à 0 comme pour la checkbox "site". Il doit donc y avoir un problème avec la requête ci dessous.
Il y a surement une "interférence" avec la checckbox "site" du fait de reprendre $id_formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $user_demande_SQL = "SELECT demande.id FROM demande INNER JOIN demandeformulaire ON demande.id = demandeformulaire.id_formulaire WHERE demandeformulaire.id_formulaire = '".$id_formulaire."' ORDER BY n_demande";
Il faut que tu apprennes l'anglais ! au moins, à comprendre les messages d'errreurs :
foreach demande un array en 1er argument :=> Warning: Invalid argument supplied for foreach() in C:\wamp\www/SI2I\traitement.php on line 136
-> as-tu vérifié que $aDemande existe, et est bien un array ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager