Problème liste déroulante et BDD
Résolu
lecjoh59
Messages postés
82
Date d'inscription
Statut
Membre
Dernière intervention
-
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 38486 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
A voir également:
- Problème liste déroulante et BDD
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste déroulante google sheet - Accueil - Guide bureautique
- Liste code ascii - Guide
- Site dangereux liste - Guide
9 réponses
Bonjour,
Il faut, en PHP, lorsque tu utilises un SUBMIT .. mettre un attribut NAME à tes éléments html.
A changer par :
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 :
Cordialement,
Jordane
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
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 :
La page de ton formulaire html contient :
=> 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 :
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
.... donc normal que ça n'affiche rien vu que tu n'aies pas passé par le formulaire......!!!!!!!
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 :
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
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
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 !!!!!!
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" !!!!
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... )
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
Merci d'avance
Bonne journée
....
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 :
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.
Merci d'avance