Insertion données formulaire

Résolu
adomaths Messages postés 4 Date d'inscription mardi 28 juillet 2009 Statut Membre Dernière intervention 19 août 2009 - 16 août 2009 à 15:51
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 :)

6 réponses

Bemale Messages postés 24 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 11 septembre 2009
19 août 2009 à 21:40
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.
3
Bemale Messages postés 24 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 11 septembre 2009
17 août 2009 à 21:20
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é ?
0
adomaths Messages postés 4 Date d'inscription mardi 28 juillet 2009 Statut Membre Dernière intervention 19 août 2009
17 août 2009 à 22:34
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.
0
Bemale Messages postés 24 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 11 septembre 2009
17 août 2009 à 23:48
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.
0

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

Posez votre question
adomaths Messages postés 4 Date d'inscription mardi 28 juillet 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 15:09
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 ?
0
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
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 !
0
Rejoignez-nous