Problème liste déroulante et BDD
Résolu
lecjoh59
Messages postés
84
Statut
Membre
-
jordane45 Messages postés 30427 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 30427 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, j'ai un petit soucis avec un code PHP et HTML. Le problème est : je n'arrive pas à enregistrer les données de la liste déroulante dans la BDD.
PS : Je suis débutant.
Voici mes codes html et php
Merci d'avance
PS : Je suis débutant.
Voici mes codes html et php
<head>
<meta charset="utf-8" />
<title>Inscription enfant</title>
</head>
<body>
<form method="POST" action="inscription_enfant.php">
<p>
<label for="nom">Nom :</label>
<input type="text" name="nom" id="nom" />
<br></br>
<label for="prenom">Prenom :</label>
<input type="text" name="prenom" id="prenom" />
<br></br>
<label for="nom_ecole">Ecole :</label>
<select id='nom_ecole' onChange='nom_ecole();'>
<option value=0>Charles Perrault</option>
<option value=1>Charles Robert</option>
<option value=2>Groupe Champ Fleuri</option>
</select>
<br></br>
<FORM>
<INPUT TYPE="submit" NAME="submit" VALUE=" Envoyer ">
</FORM>
</body>
error_reporting(E_ALL);
if(isset($_POST['submit']))
{
$bdd = new PDO('mysql:host=localhost;dbname=projet;charset=utf8', 'root', '');
try
{
$bdd = new PDO('mysql:host=localhost;dbname=projet;charset=utf8', 'root', '');
$req = "INSERT INTO inscription_enfant (nom, prenom, nom_ecole)";
$req .= " VALUES ";
$req .= "(:nom, :prenom, :nom_ecole)";
$stmt = $bdd->prepare($req);
$stmt>bindValue('nom',htmlentities(trim($_POST['nom'])),PDO::PARAM_STR);
$stmt>bindValue('prenom',htmlentities(trim($_POST['prenom'])),PDO::PARAM_STR);
$stmt>bindValue('nom_ecole',htmlentities(trim($_POST['nom_ecole'])),PDO::PARAM_STR);
if (!$stmt->execute()) {
throw new PDOException('insertion impossible');
}
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
}
Merci d'avance
9 réponses
Résumé de la discussion
Problème d'enregistrement des données d'une liste déroulante dans la base de données via PHP et HTML, lorsque les valeurs sélectionnées ne sont pas correctement stockées. Plusieurs éléments de réponse privilégient l'utilisation d'un champ id_ecole dans la table inscription_enfant et l'alimentation du SELECT via une liste des écoles issue d'une table ecoles, afin d'utiliser des jointures pour afficher le nom. D'autres remarquent que les valeurs des options doivent correspondre aux IDs et que l'insertion doit passer par des requêtes préparées pour éviter les erreurs et les injections.
-
Bonjour,
Il faut, en PHP, lorsque tu utilises un SUBMIT .. mettre un attribut NAME à tes éléments html.<select id='nom_ecole' onChange='nom_ecole();'>
A changer par :<select id='nom_ecole' name='nom_ecole' onChange='nom_ecole();'>
De plus... prend l'habitude de récupérer PROPREMENT tes variables AVANT de les utiliser :
et de séparer la connexion de ta BDD dans un fichier à part (pour ne pas avoir à le modifier partout le jour où tu installes ton script sur un autre serveur.... )
Comme ceci :<?php // Fichier cnxBDD.php de connexion à la BDD // qu'il suffit d'inclure lorsque tu en as besoin dans tes pages try{ $bdd = new PDO('mysql:host=localhost;dbname=projet;charset=utf8', 'root', ''); } catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?>
<?php //Affichage des erreurs PHP error_reporting(E_ALL); // connexion à la bdd require_once "cnxBDD.php"; // Récupération "propre" des variables $nom = isset($_POST['nom']) ? htmlentities(trim($_POST['nom'])) : ''; $nom = isset($_POST['prenom']) ? htmlentities(trim($_POST['prenom'])) : ''; $nom = isset($_POST['nom_ecole']) ? htmlentities(trim($_POST['nom_ecole'])) : ''; if(isset($_POST['submit'])) { try { $req = "INSERT INTO inscription_enfant (nom, prenom, nom_ecole) VALUES(:nom, :prenom, :nom_ecole)"; $stmt = $bdd->prepare($req); $stmt>bindValue('nom',$nom),PDO::PARAM_STR); $stmt>bindValue('prenom',$prenom,PDO::PARAM_STR); $stmt>bindValue('nom_ecole',$nom_ecole,PDO::PARAM_STR); if (!$stmt->execute()) { throw new PDOException('insertion impossible'); } }catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } }
Cordialement,
Jordane-
-
Cela vient du fait que les attributs value de ton select sont des nombres et pas le nom de l'école :
<select id='nom_ecole' name='nom_ecole' onChange='nom_ecole();'> <option value="Charles Perrault">Charles Perrault</option> <option value="Charles Robert">Charles Robert</option> <option value="Groupe Champ Fleuri">Groupe Champ Fleuri</option> </select>
Bonne journée -
-
Cela vient des "value" dans tes balises OPTIONS
<option value=0>Charles Perrault</option> <option value=1>Charles Robert</option> <option value=2>Groupe Champ Fleuri</option>
....
Mais dans l'idéal tu ne stockes pas en toutes lettre le nom des écoles dans ta table "inscription_enfant" mais bien leurs ID.
Pour cela.. .. tu créés une table "ecoles" (avec les champs : id, nom, adresse.....etc... ) dans laquelle tu listes les différentes écoles
puis, tu alimentes ta balises SELECT via une requête sur cette Table.
et ainsi.. dans les VALUE tu stocke les ID correspondant aux écoles
Par la suite, lorsque tu auras besoin d'afficher les informations de ta table inscription_enfant et savoir le "nom" de l'école.. il te suffira de faire un JOINTURE entre ces deux tables.
Un truc du genre :SELECT * FROM inscription_enfant I LEFT JOIN ecoles E ON E.id = I.id_ecole
Bien entendu, tu auras, au préalable, modifié ta table inscription_enfant en retirant le champ : nom_ecole et en y créant à la place, un champ id_ecole (de type INTEGER )
Dis toi que quand tu conçois une Base de données .. il faut essayer au maximum de représenter chaque "objet" dans une table à part.
Un Eleve est un objet
L'inscription d'un Eleve est un objet
L'école est un objet
Le Pays est un objet
La ville est un objet ..
Etc.....
Ensuite, tu ne travailles qu'avec les ID de ces différents objets et quelques jointures pour récupérer les informations correspondantes lorsque tu en as besoin.
Cela permet de gagner en performance dans les requêtes, te permet d'être plus souple dans le contenu à afficher (par exemple... pour ajouter une nouvelle école dans ta liste... pas besoin de modifier ton code... tu n'as qu'à juste l'ajouter dans ta table )
VOilou.
Bonne continuation. -
-
-
1 - Je t'ai indiqué qu'il fallait séparer la connexion de ta BDD en le plaçant dans une page à part que tu n'auras qu'à inclure lorsque tu en auras besoin (comme je l'ai fait )
2 - Je t'ai écrit un code en utilisant un ARRAY pour passer les variables... pourquoi as tu remis du BINDPARAM ?
3 - Que vient faire ta boucle sur les écoles dans ce code ?????
4 - Je t'ai écris du code .... il te suffit de le copier/coller TEL QUEL !!!!!!
Donc... dans ta page PHP de traitement tu mets :<?php //Affichage des erreurs PHP error_reporting(E_ALL); // connexion à la bdd require_once "cnxBDD.php"; // Récupération "propre" des variables $nom = isset($_POST['nom']) ? htmlentities(trim($_POST['nom'])) : ''; $prenom = isset($_POST['prenom']) ? htmlentities(trim($_POST['prenom'])) : ''; $id_ecole = isset($_POST['ecole']) ? htmlentities(trim($_POST['ecole'])) : ''; if(isset($_POST['submit'])) { try { $a_datas = array(":nom"=>$nom,":prenom"=>$prenom,":id_ecole"=>$id_ecole); $req = "INSERT INTO inscription_enfant (nom, prenom, id_ecole) VALUES(:nom, :prenom, :id_ecole)"; $stmt = $bdd->prepare($req); $stmt->execute($a_datas); }catch (Exception $e){ echo "<br>Erreur : " . $e->getMessage(); echo "<br> <b>Requete :<b><br> ".$req; echo "<br> params :<br><pre>"; print_r($a_datas); echo "</pre>"; exit(); } }
La page de ton formulaire html contient :<?php //Affichage des erreurs PHP error_reporting(E_ALL); // connexion à la bdd require_once "cnxBDD.php"; //Récupération des écoles dans la BDD try{ $sql = "SELECT * FROM ecole "; $stmt = $bdd->prepare($req); $res = $stmt->execute(); //on stocke le résultat dans un array $arr_ecoles = $res->fetchall(); }catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?> <html> <head> <meta charset="utf-8" /> <title>Inscription enfant</title> </head> <body> <form method="POST" action="inscription_enfant.php"> <p> <label for="nom">Nom :</label> <input type="text" name="nom" id="nom" /> <br></br> <label for="prenom">Prenom :</label> <input type="text" name="prenom" id="prenom" /> <br></br> <label for="nom_ecole">Ecole :</label> <select id='ecole' name='ecole' onChange='nom_ecole();'> <?php if($arr_ecoles){ foreach($arr_ecoles as $ECOLE){ echo "<option value='".$ECOLE['id']."'>".$ECOLE['nom']."</option>"; } } ?> </select> <br></br> <input type="submit" name="submit" value=" Envoyer "> </form> </body> </html>
=> Bien entendu .. le nom de cette page se termine également par .php
Et pour finir .. si tu ne l'as pas encore fait ... tu créés un fichier PHP avec le nom : cnxBDD.php
dans lequel tu places :<?php // Fichier cnxBDD.php de connexion à la BDD // qu'il suffit d'inclure lorsque tu en as besoin dans tes pages try{ $bdd = new PDO('mysql:host=localhost;dbname=projet;charset=utf8', 'root', ''); } catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?>-
-
-
inscription_enfant.php ... c'est le nom de la page contenant ton formulaire HTML ?
Je ne pense pas...
vu que cette page... c'est celle utilisée dans ton FORM<form method="POST" action="inscription_enfant.php">
.... donc normal que ça n'affiche rien vu que tu n'aies pas passé par le formulaire......!!!!!!! -
-
-
-
<?php error_reporting(E_ALL); require_once "cnxBDD.php"; try{ $sql = "SELECT * FROM ecole "; $stmt = $bdd->prepare($req); $res = $stmt->execute(); $arr_ecoles = $res->fetchall(); }catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?> <html> <head> <meta charset="utf-8" /> <title>Inscription enfant</title> </head> <body> <form method="POST" action="traitement_enfant.php"> <p> <label for="nom">Nom :</label> <input type="text" name="nom" id="nom" /> <br></br> <label for="prenom">Prenom :</label> <input type="text" name="prenom" id="prenom" /> <br></br> <label for="nom_ecole">Ecole :</label> <select id='ecole' name='ecole' onChange='nom_ecole();'> <option value =1>Charles Perrault</option> <option value=2>Charles Robert</option> <option value=3>Groupe Champ Fleuri</option> <?php if($arr_ecoles){ foreach($arr_ecoles as $ECOLE){ echo "<option value='".$ECOLE['id']."'>".$ECOLE['nom']."</option>"; } } ?> </select> <br></br> <input type="submit" name="submit" value=" Envoyer "> </form> </body>error_reporting(E_ALL); require_once "cnxBDD.php"; $nom = isset($_POST['nom']) ? htmlentities(trim($_POST['nom'])) : ''; $prenom = isset($_POST['prenom']) ? htmlentities(trim($_POST['prenom'])) : ''; $id_ecole = isset($_POST['ecole']) ? htmlentities(trim($_POST['ecole'])) : ''; if(isset($_POST['submit'])) { try { $a_datas = array(":nom"=>$nom,":prenom"=>$prenom,":id_ecole"=>$id_ecole); $req = "INSERT INTO inscription_enfant (nom, prenom, id_ecole) VALUES(:nom, :prenom, :id_ecole)"; $stmt = $bdd->prepare($req); $stmt->execute($a_datas); }catch (Exception $e){ echo "<br>Erreur : " . $e->getMessage(); echo "<br> <b>Requete :<b><br> ".$req; echo "<br> params :<br><pre>"; print_r($a_datas); echo "</pre>"; exit(); } }-
-
-
Le fichier qui contient ton formulaire html ... il se nomme comment ? Il finit bien par ".php" ??
Que donne ce code :<?php error_reporting(E_ALL); //connexion à la BDD require_once "cnxBDD.php"; try{ $sql = "SELECT * FROM ecole "; $stmt = $bdd->prepare($req); $res = $stmt->execute(); $arr_ecoles = $stmt->fetchAll(); //le temps des tests : echo "<pre>"; print_r($arr_ecoles); echo "</pre>"; }catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?> <html> <head> <meta charset="utf-8" /> <title>Inscription enfant</title> </head> <body> <form method="POST" action="traitement_enfant.php"> <p> <label for="nom">Nom :</label> <input type="text" name="nom" id="nom" /> <br></br> <label for="prenom">Prenom :</label> <input type="text" name="prenom" id="prenom" /> <br></br> <label for="ecole">Ecole :</label> <select id='ecole' name='ecole'> <?php if($arr_ecoles){ foreach($arr_ecoles as $ECOLE){ echo "<option value='".$ECOLE['id']."'>".$ECOLE['nom']."</option>"; } } ?> </select> <br></br> <input type="submit" name="submit" value=" Envoyer "> </form> </body> </html> -
En le nommant en .php, il y a ça en erreurs :
Notice: Undefined variable: req in C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\projet\inscription_enfant.php on line 9
Fatal error: Call to a member function fetchall() on a non-object in C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\projet\inscription_enfant.php on line 11 -
-
-
-
Pour la structure de ta table :
Le champ ID : OK
Mais ensuite.... Je t'ai dit de mettre un champ NOM ... où est-il ????
A la place... toi ... tu as créé autant de "champs" ... que d'ecoles.... ce n'est pas comme ça que fonctionne une BDD !!!!!!!!!
Au niveau de la structure de ta table , tu devrais avoir simplement comme champs :
ID (auto incrémenté / clé Primaire )
NOM varchar(256)
Puis ... DANS la table .... les données :
1 Charles Perrault
2 Charles Robert
3 Groupe Champ Fleuri -
-
- NONNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Prenons un autre exemple ..... tu connais EXCEL ???
Dans Excel .. tu as des colonnes ... ( les colonnes.... c'est tes "champs" de ta BDD )
Par exemple... dans la colonne "A" .. tu mets l' ID ( 1 , 2 , 3 .....)
Dans la colonne "B" tu places les noms des écoles ....
===>> sur une ligne tu as donc : un ID ... puis un nom d'école
puis à la ligne suivante... un autre ID ... puis une autre ecole....
etc....
Si tu ne comprends pas ça ... il va sérieusement falloir que tu commences par reprendre les BASES ( le BaBa ) de ce que sont les Bases de données.... et leur utilisation !!!!!!
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
-
....heu..... tu as vu que là ... tu essayes de saisie un texte dans la zone "Taille/Valeur" ???
Cette zone sert à DEFINIR la"taille" du champ .... pas y mettre des données !
Dans cette zone là .. tu dois mettre 256 par exemple....
Ensuite ... pour remplir ta TABLE tu vas devoir aller dans l'onglet "INSERER" !!!!
-
-
-
-
-
-
-
Non..
Le principe ( question de performances....) c''est de ne mettre que l' ID.....
Ensuite... si tu veux récupérer le contenu de la table... tout en ayant le nom de l'école correspondnat à l' ID .. il suffit de faire une JOINTURE.
Testes la requete suivante tu comprendras (j'espère... )SELECT * FROM inscription_enfant I LEFT JOIN ecole E ON E.id = I.id_ecole
-
-
-






