Insertion données formulaire [Résolu]

Messages postés
4
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
19 août 2009
- - Dernière réponse : adomaths
Messages postés
4
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
19 août 2009
- 19 août 2009 à 22:26
Bonjour,

Je débute en PHP/MySQL et je m'arrache les cheveux depuis 24h, là j'ai vraiment besoin d'un coup de pouce SVP.
Dans mon script j'ai trois requêtes pour insérer des données issues d'un formulaire dans trois tables (qui sont reliées au passage, avec InnoDB).
problème : il n'y a que la première table (la seule sans clé étrangère) qui est remplie. Les deux autres requêtes ne marchent pas pourtant je ne pense pas avoir fait de faute dans la syntaxe :
$id_client="\N";
$id_comm="\N";
$id_cours="\N";
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$classe=$_POST['classe'];
$adresse=$_POST['adresse'];
$cp=$_POST['cp'];
$ville=$_POST['ville'];
$email=$_POST['email'];
$date_cours=$_POST['date_cours'];
$deb_cours=$_POST['deb_cours'];
$fin_cours=$_POST['fin_cours'];
$date=date("l d F Y H:i:s ");
//requête SQL
$idcom=connex('adomaths','param');
$requete1="INSERT INTO client VALUES('$id_client','$nom','$prenom','$classe','$adresse','$cp',
'$ville','$email')";
$result1=mysql_query($requete1,$idcom);
$requete2="INSERT INTO commande VALUES('$id_comm','$id_client','$date')";
$result2=mysql_query($requete2,$idcom);
$requete3="INSERT INTO cours VALUES('$id_cours','$id_comm','$date_cours','$deb_cours','$fin_cours')";
$result3=mysql_query($requete3,$idcom);
mysql_close($idcom);

Tout éclairage est le bienvenu, merci pour votre aide :)
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
24
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
11 septembre 2009
3
Merci
J'ai essayé ce code chez moi sur PHP Version 5.3.0, Apache/2.2.11, MySQL 5.0.5 (EasyPHP 3.1)
Avec un petit formulaire. Ce code insère normalement dans les trois tables.
Il y avait une coquille dans la requête d'insertion de cours (une quote qui trainait).
J'ai rajouté un petit tips sur la création dynamique de variables.

// On ouvre la connexion avant pour pouvoir utiliser la fonction mysql_real_escape_string
$idcom=connex('adomaths','param');

/*
* Pour chaque valeur du tableau $_POST
* Array ( [nom] => MOTAIS [prenom] => Bemale [classe] => Seconde [adresse] => chez moi [cp] => 62000 [ville] => ARRAS...
* On crée la variable de la clé du tableau avec sa valeur respective
*/
foreach ($_POST as $nom_var => $valeur)
{
$$nom_var = mysql_real_escape_string($valeur);
}
$date=date("l d F Y H:i:s ");


//requête SQL
$requete1="INSERT INTO client (nom,prenom,classe,adresse,cp,ville,email) VALUES('$nom','$prenom','$classe','$adresse','$cp',
'$ville','$email')";
$result1=mysql_query($requete1,$idcom);
//On récupére le id_client inséré dans la table
$id_client=mysql_insert_id($idcom);

$requete2="INSERT INTO commande (id_client,date) VALUES('$id_client','$date')";
$result2=mysql_query($requete2,$idcom);
//On récupére le id_comm inséré dans la table
$id_comm=mysql_insert_id($idcom);


$requete3="INSERT INTO cours (id_comm,date_cours,deb_cours,fin_cours) VALUES('$id_comm','$date_cours','$deb_cours','$fin_cours')";
$result3=mysql_query($requete3,$idcom);
//On récupére le id_cours inséré dans la table
$id_cours=mysql_insert_id($idcom);

mysql_close($idcom);

Si ça ne fonctionne pas il va falloir faire un traçage. un echo des requête et une tentative d'execution sur PHPMYADMIN par exemple et voir si il ne renvoi pas une erreur.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Bemale
Messages postés
24
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
11 septembre 2009
0
Merci
J'ai une question quand à la provenance de $id_client,$id_comm et $id_cours.

Quelle est la structure de ta base (clés primaires), parce que les clés étrangères sur commande et cours sont visibles.
Sont elles en auto-incremente, sinon comment fais tu pour gérer leur unicité ?
Commenter la réponse de Bemale
Messages postés
4
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
19 août 2009
0
Merci
Salut, tout d'abord merci d'avoir répondu à mon message. J'ai fait un débuggage et il en ressort effectivement que le problème serait plus lié à la structure de la base.
La base en question est composée de trois tables : client, commande et cours, qui ont chacune pour clé primaire respectivement id_client, id_comm et id_cours. Chacune de ces clés est en auto-increment.
A mon avis le problème doit être lié à deux erreurs de débutant :
- le MLD peut être à revoir ;
- je ne sais pas comment utiliser les clés étrangères avec MySQL.
J'espère avoir apporté les éclairages dont tu avais besoin.
Commenter la réponse de adomaths
Messages postés
24
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
11 septembre 2009
0
Merci
Si les clés sont en auto increment, il vaut mieux laisser MySQL faire sa sauce avec les clés et on obtient

$requete1="INSERT INTO client (nom,prenom,classe,adresse,cp,ville,email) VALUES('$nom','$prenom','$classe','$adresse','$cp',
'$ville','$email')";
$result1=mysql_query($requete1,$idcom);
//On récupére le id_client inséré dans la table
$id_client=mysql_insert_id($idcom);

$requete2="INSERT INTO commande (id_client,$date) VALUES('$id_client','$date')";
$result2=mysql_query($requete2,$idcom);
//On récupére le id_comm inséré dans la table
$id_comm=mysql_insert_id($idcom);

$requete3="INSERT INTO cours (id_comm',date_cours,deb_cours,fin_cours) VALUES('$id_comm','$date_cours','$deb_cours','$fin_cours')";
$result3=mysql_query($requete3,$idcom);
//On récupére le id_cours inséré dans la table
$id_cours=mysql_insert_id($idcom);

J'ai utilisé ce type d'insert : INSERT INTO tbl_name (col1,col2) VALUES(15,2); afin que mysql sache ou ranger les données la 1°valeur dans le 1° champ, etc...

Pour être plus propre pour les chaines de caractères que tu reçois il faut les echapper, tu peux utiliser mysql_real_escape_string($_POST['nom'])
cette fonction va mettre les caractères d'échappement devant les simple cote par ex D'ABOVILLE en brut donnerait dans une requête non échappée INSERT INTO nom (nom) VALUES ('D'ABOVILLE') et là plantage.
Bon j'espère ne pas avoir été trop long, mais surtout de t'avoir été d'une petite aide.
PS : effectivement si le but de ces trois table est "un client fait une commande de x cours", sachant que le cours est unique le MLD n'est pas forcément judicieux, il faudrait dans ce cas une table de jointure (relation) COMMANDE_COURS -> id_comm,id_cours.
Commenter la réponse de Bemale
Messages postés
4
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
19 août 2009
0
Merci
salut,
j'ai bien repris le code que tu m'as suggéré malheureusement le résultat est le même, à savoir que seule la première requête est exécutée. J'ai l'impression que c'est lié aux champs id_client et id_comm (respectivement dans les tables commande et cours) que j'ai indexés et paramétrés en tant que FOREIGN KEY. Peut-être que les tables ne sont pas correctement reliées. Quelque soit le problème, voilà la structure de la base :

CREATE TABLE IF NOT EXISTS `client` (
`id_client` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`nom` varchar(25) NOT NULL,
`prenom` varchar(25) NOT NULL,
`classe` varchar(10) NOT NULL,
`adresse` varchar(100) NOT NULL,
`cp` mediumint(5) NOT NULL,
`ville` varchar(50) NOT NULL,
`email` varchar(70) NOT NULL,
PRIMARY KEY (`id_client`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `commande` (
`id_comm` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id_client` mediumint(8) unsigned NOT NULL,
`date` varchar(50) NOT NULL,
PRIMARY KEY (`id_comm`),
KEY `id_client` (`id_client`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE IF NOT EXISTS `cours` (
`id_cours` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id_comm` mediumint(8) unsigned NOT NULL,
`date_cours` varchar(8) NOT NULL,
`deb_cours` varchar(5) NOT NULL,
`fin_cours` varchar(5) NOT NULL,
PRIMARY KEY (`id_cours`),
KEY `id_comm` (`id_comm`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

ALTER TABLE `commande`
ADD CONSTRAINT `commande_ibfk_1` FOREIGN KEY (`id_client`) REFERENCES `client` (`id_client`) ON DELETE CASCADE;

ALTER TABLE `cours`
ADD CONSTRAINT `cours_ibfk_1` FOREIGN KEY (`id_comm`) REFERENCES `commande` (`id_comm`) ON DELETE CASCADE;

Ca rend ce message un peu long du coup, mais j'ai quelques remarques à ajouter :
- pourquoi l'auto-increment des tables cours et commande n'est pas égal à 1 ?
- j'ai pas compris "il faudrait dans ce cas une table de jointure (relation) COMMANDE_COURS -> id_comm,id_cours. "
- pour être plus propre avec les chaînes de caractères je dois faire $nom=mysql_real_escape_string($_POST['nom']); ?
- enfin, MERCI pour tes explications bien formulées :) , tu serais pas prof des fois ?
Commenter la réponse de adomaths
Messages postés
4
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
19 août 2009
0
Merci
Ca marche !!!
Tu es génial! J'ai pas bien compris ton code mais il fonctionne. J'ai encore beaucoup de choses à apprendre apparamment.
Merci, maître Yoda !
Commenter la réponse de adomaths