Enregistrer des données dans une table
RésoluMARTEGAL Messages postés 34 Date d'inscription Statut Membre Dernière intervention -
Bonjour à toutes et à tous,
Mon but est d'enregistrer les données d'un formulaire dans une table de ma bdd. Voici mon script:
<!DOCTYPE html> <html> <head> <title>Page de traitement</title> <meta charset="utf-8"> </head> <body> <?php //on ouvre la bdd $servername="localhost"; $dbname="capou"; $username="root"; $password=""; $Nom=$_POST["nom"]; $Prenom=$_POST["prenom"]; $Adresse=$_POST["adresse"]; $CP=$_POST["cp"]; $Ville=$_POST["Ville"]; $Sexe=$_POST["sexe"]; $Telfixe=$_POST["Tel_fixe"]; $Telport=$_POST["Tel_port"]; $mail=$_POST["mail"]; $CA=$_POST["CA"]; $date_adhesion = $_POST["Date_adhesion"]; $cotisation=$_POST["cotisation"]; $Activ1=$_POST["activite-1"]; $Activ2=$_POST["activite-2"]; $Activ3=$_POST["activite-3"]; $tarif_activ=$_POST["Tarif-activite"]; //on teste la connexion try{ $conn=new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); //on définit le mode d'erreur de DPO sur Exeption $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "connexion réussie <br>"; //On insère les données dans la bdd $sth = $conn->prepare(" INSERT INTO adherents-2022(Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre-CA, Date_adhesion, Cotisation, Activite-1, Activite-2, Activite-3, tarif_activite) VALUES(:nom, :prenom, :adresse, :cp, :Ville, :sexe, :Tel_fixe, :Tel_port, :mail, :CA, :Date_adhesion, :cotisation, :activite-1, :activite-2, :activite-3, :Tarif-activite)"); $sth->bindParam(':nom',$Nom); $sth->bindParam(':prenom',$Prenom); $sth->bindParam(':adresse',$Adresse); $sth->bindParam(':cp',$CP); $sth->bindParam(':Ville', $Ville); $sth->bindParam(':sexe', $Sexe); $sth->bindParam(':Tel_fixe', $Telfixe); $sth->bindParam(':Tel_port', $Telport); $sth->bindParam(':mail', $mail); $sth->bindParam(':CA', $CA); $sth->bindParam(':Date_adhesion', $date_adhesion); $sth->bindParam(':cotisation', $cotisation); $sth->bindParam(':activite-1', $Activ1); $sth->bindParam(':activite-2', $Activ2); $sth->bindParam(':activite-3', $Activ3); $sth->bindParam(':Tarif-activite', $tarif_activ); $sth->execute(); //Page de remerciements header("Location:form-merci.html"); echo "saisie réussie dans la table"; } /*On capture les exeptions si une exeption est lancée et on affiche les infos relatives à celle-ci*/ catch(PDOExeption $e){echo "Erreur : ".$e->getMessage();} //On ferme la connexion à la bdd $conn=null; ?> </body> </html>
Or voici le message d'erreur qui me retourne : Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp64\www\capou\verif-formulaire.php on line 89
La ligne 89 en question : $sth->execute();
Merci de me venir en aide. Je pense que le bug est énorme, mais je ne le trouve pas.
PS je vous joins le copie de la structure de la table en question
Windows / Edge 103.0.1264.62
- Enregistrer des données dans une table
- Fuite données maif - Guide
- Table des matières word - Guide
- Table ascii - Guide
- Audacity enregistrer son pc - Guide
- Enregistrer une conversation - Guide
9 réponses
Bonjour à tous,
Après avoir relu attentivement vos remarques, voici ce que j'ai fait :
- J'ai rebaptisé ma table dans ma Bdd : au lieu de adherents-2022, j'ai supprimé le tiret. Elle est devenu adherents2022
- J'ai examiné et corrigé certains éléments dont le type ne correspondait pas à celui du formulaire.
Avec ces corrections, mon script permet de remplir la table correctement.
Merci encore à toutes et à tous
Merci Jordane45 de t'intéresser à mon pb. Sur ton conseil, j'ai modifié mes variables.
Malheureusement ça n'a pas permis de supprimer le bug.
Bonne journée
Martegal
Le voici :
$sth = $conn->prepare(" INSERT INTO adherents-2022(Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre_CA, Date_adhesion, Cotisation, Activite_1, Activite_2, Activite_3, tarif_activite) VALUES(:nom, :prenom, :adresse, :cp, :Ville, :sexe, :Tel_fixe, :Tel_port, :mail, :CA, :Date_adhesion, :cotisation, :activite_1, :activite_2, :activite_3, :Tarif_activite)"); $sth->bindParam(':nom',$Nom); $sth->bindParam(':prenom',$Prenom); $sth->bindParam(':adresse',$Adresse); $sth->bindParam(':cp',$CP); $sth->bindParam(':Ville', $Ville); $sth->bindParam(':sexe', $Sexe); $sth->bindParam(':Tel_fixe', $Telfixe); $sth->bindParam(':Tel_port', $Telport); $sth->bindParam(':mail', $mail); $sth->bindParam(':CA', $CA); $sth->bindParam(':Date_adhesion', $date_adhesion); $sth->bindParam(':cotisation', $cotisation); $sth->bindParam(':activite_1', $Activ1); $sth->bindParam(':activite_2', $Activ2); $sth->bindParam(':activite_3', $Activ3); $sth->bindParam(':Tarif_activite', $tarif_activ); $sth->execute();
ça bute toujours sur $sth->execute();
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour,
Déjà, on va placer le code de connexion à la bdd dans un fichier à part ( nommé, par exemple, cnxBdd.php) qu'il suffira d'inclure dans les pages dans lesquelles tu en as besoin
<?php //Fichier cnxBdd.php //on ouvre la bdd $servername="localhost"; $dbname="capou"; $username="root"; $password=""; try{ $conn=new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); //on définit le mode d'erreur de DPO sur Exeption $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die('Erreur : ' . $e->getMessage()); } ?>
Et donc, dans ton fichier de traitement : ( au passage.. ne pas mettre de html .. sinon ta redirection ne marchera pas.. )
<?php error_reporting(E_ALL); // affichage des erreurs PHP //connexion à la bdd require_once "cnxBdd.php"; $Nom=$_POST["nom"]; $Prenom=$_POST["prenom"]; $Adresse=$_POST["adresse"]; $CP=$_POST["cp"]; $Ville=$_POST["Ville"]; $Sexe=$_POST["sexe"]; $Telfixe=$_POST["Tel_fixe"]; $Telport=$_POST["Tel_port"]; $mail=$_POST["mail"]; $CA=$_POST["CA"]; $date_adhesion = $_POST["Date_adhesion"]; $cotisation=$_POST["cotisation"]; $Activ1=$_POST["activite-1"]; $Activ2=$_POST["activite-2"]; $Activ3=$_POST["activite-3"]; $tarif_activ=$_POST["Tarif-activite"]; $sql = " INSERT INTO adherents-2022( Nom ,Prenom ,Adresse ,CP ,Ville ,Sexe ,Tel_fixe ,Tel_port ,Mail ,Membre_CA ,Date_adhesion ,Cotisation ,Activite_1 ,Activite_2 ,Activite_3 ,tarif_activite) VALUES( :nom ,:prenom ,:adresse ,:cp ,:Ville ,:sexe ,:telfixe ,:telport ,:mail ,:ca ,:dateadhesion ,:cotisation ,:activite1 ,:activite2 ,:activite3 ,:tarifactivite )"; $datas = [ ':nom'=>$Nom, ':prenom'=>$Prenom, ':adresse'=>$Adresse, ':cp'=>$CP, ':Ville'=>$Ville, ':sexe'=>$Sexe, ':telfixe'=>$Telfixe, ':telport'=>$Telport, ':mail'=>$mail, ':ca'=>$CA, ':dateadhesion'=>$date_adhesion, ':cotisation'=>$cotisation, ':activite1'=>$Activ1, ':activite2'=>$Activ2, ':activite3'=>$Activ3, ':tarifactivite'=>$tarif_activ }; try{ $sth = $conn->prepare($sql); $sth->execute($datas); //Page de remerciements header("Location:form-merci.html"); exit; }catch(Exception $e){ echo "Erreur : " . $e->getMessage(); echo "<br> SQL : " . $sql . "<br><pre>"; var_dump($datas); echo "</pre>"; exit: } ?>
Un grand merci Jordane pour avoir bossé sur mon script.
Je l'ai donc modifié suivant ton modèle.
d'abord voici mon nouveau script :
<?php error_reporting(E_ALL);//affichage des ereurs PHP //connexion à la Bdd require_once "cnxBdd.php"; $Nom=$_POST["nom"]; $Prenom=$_POST["prenom"]; $Adresse=$_POST["adresse"]; $CP=$_POST["cp"]; $Ville=$_POST["Ville"]; $Sexe=$_POST["sexe"]; $Telfixe=$_POST["Tel_fixe"]; $Telport=$_POST["Tel_port"]; $mail=$_POST["mail"]; $CA=$_POST["CA"]; $date_adhesion = $_POST["Date_adhesion"]; $cotisation=$_POST["cotisation"]; $Activ1=$_POST["activite_1"]; $Activ2=$_POST["activite_2"]; $Activ3=$_POST["activite_3"]; $tarif_activ=$_POST["Tarif_activite"]; //On insère les données dans la bdd $sql= " INSERT INTO adherents-2022(Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre_CA, Date_adhesion, Cotisation, Activite_1, Activite_2, Activite_3, tarif_activite) VALUES(:nom, :prenom, :adresse, :cp, :Ville, :sexe, :Tel_fixe, :Tel_port, :mail, :CA, :Date_adhesion, :cotisation, :activite_1, :activite_2, :activite_3, :Tarif_activite)"; $datas =[ ':nom' => $Nom, ':prenom'=>$Prenom, ':adresse'=>$Adresse, ':cp'=>$CP, ':Ville'=> $Ville, ':sexe'=> $Sexe, ':Tel_fixe'=> $Telfixe, ':Tel_port'=> $Telport, ':mail'=> $mail, ':CA'=> $CA, ':Date_adhesion'=> $date_adhesion, ':cotisation'=> $cotisation, ':activite_1'=> $Activ1, ':activite_2'=> $Activ2, ':activite_3'=> $Activ3, ':Tarif_activite'=> $tarif_activ ]; try{ $sth = $conn->prepare($sql); $sth->execute($datas); //Page de remerciements header("Location:form-merci.html"); exit; } //echo "saisie réussie dans la table"; /*On capture les exeptions si une exeption est lancée et on affiche les infos relatives à celle-ci*/ catch(Exception $e){ echo "Erreur : ".$e->getMessage(); echo "<br> SQL : " . $sql . "<br><pre>"; var_dump($datas); echo "</pre>"; exit; } ?>
Voici maintenant le retour que j'ai après exécution : Je ne trouve pas l'erreur signalée. Pourtant elle doit être énorme...
connexion réussie
Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de '-2022(Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre_CA' � la ligne 1
SQL : INSERT INTO adherents-2022(Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre_CA, Date_adhesion, Cotisation, Activite_1, Activite_2, Activite_3, tarif_activite) VALUES(:nom, :prenom, :adresse, :cp, :Ville, :sexe, :Tel_fixe, :Tel_port, :mail, :CA, :Date_adhesion, :cotisation, :activite_1, :activite_2, :activite_3, :Tarif_activite)
C:\wamp64\www\capou\verif-formulaire.php:73:
array (size=16)
...suit la liste des variables et leur contenu parfaitement exacte (contenu du $datas).
Essaye d'ajouter des backticks autour du nom de la table si celle-ci contient un tiret :
$sql= "INSERT INTO `adherents-2022` (Nom, Prenom, Adresse, CP, Ville, Sexe, Tel_fixe, Tel_port, Mail, Membre_CA, Date_adhesion, Cotisation, Activite_1, Activite_2, Activite_3, tarif_activite) VALUES (:nom, :prenom, :adresse, :cp, :Ville, :sexe, :Tel_fixe, :Tel_port, :mail, :CA, :Date_adhesion, :cotisation, :activite_1, :activite_2, :activite_3, :Tarif_activite)";
Que ça soit pour le nom des variables, le nom des champs en bdd, le nom des tables , le nom des bases de données ..... en gros.. en programmation .. on n'utilise jamais ni de caractères spéciaux, ni d'espaces, ni de tirets, ni d'accents...
Seul l'underscore est autorisé... et on préfèrera, de toutes façons, l'écriture en camelCase ou PascalCase.. Pour ma part, pour les bdd, je mets toujours tout en minuscule et je sépare les mots par des underscore... ça m'évite de devoir aller regarder la structure de ma bdd à chaque fois que j'ai besoin de coder une requête pour savoir comment est écrit un champ oou le nom d'une table... en respectant cette "norme" (que je me suis imposé ainsi qu'à mon équipe), on gagne un temps fou...
Les seuls tirets qu'on autorise sont pour les class CSS et éventuellement les attributs de type "id" des éléments html.
Et lorsque tu n'as pas d'autres choix que de dévier de cette "norme" .. ou parce que tu as utilisé un mot clé "reservé" dans ta bdd ( par exemple tu as nommé une table "order" ou "group" ..) là .. il n'y a pas d'autres choix que d'utiliser des backquotes autour de ces noms spéciaux ( comme te le dit Pitet )