Enregistrer des données dans une table

Résolu
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   -  
MARTEGAL 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

Table


Windows / Edge 103.0.1264.62

A voir également:

9 réponses

MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

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

1
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour

Commence par modifier le nom de tes variables en remplaçant les tirets par des underecores.


0
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

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 

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Tu peux montrer ton code modifié ?

0
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

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();

0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 

Quelle est la nouvelle erreur ?

Il faut remplacer les tirets pour les marqueurs PDO (:activite_1), il n'est pas nécessaire de les remplacer pour les noms des colonnes (Activite-1). Si tu modifies les noms des colonnes dans ta requête, il faut également les modifier sur ta bdd via phpmyadmin.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

Salut Pitet et merci,

J'ai fait les modifs demandées et j'ai mis des underscores partout y compris dans la bdd.

L'erreur est toujours la même sur le sth->execute()

Je te joins la fenêtre d'erreur

erreur

Bonne soirée

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour,

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:
}
?>

0
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

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).
0
Pitet
 

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)";
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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 )

0
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

J'ai rajouté les backticks mais hélas, j'ai toujours la même erreur.

bien à vous

0
MARTEGAL Messages postés 34 Date d'inscription   Statut Membre Dernière intervention   2
 

Merci Jordane pour tes conseil. Pour ce qui est de mon bug, je vais tout reprendre en tenant compte des divers conseils que vous m'avez donnés, aussi bien au niveau de ma Bdd que de mon script.  Là, je vais m'absenter quelques jours. Je vous recontacterai plus tard.

Bien à vous

0