Php Insert ID

Résolu
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009 - 23 déc. 2007 à 11:49
 cs_fanti - 1 avril 2008 à 00:52
Bonjour tout le monde

Voilà je me demandais juste un petit truc, et peut être que vous connaissez la réponse...

J'ai deux tables mysql et un formulaire d'inscription pour mes membres.
Je fait deux insert pour des valeurs différentes de mon formulaire.

Par exemple : L'utilisateurs remplis tout les champs, une partie des valeurs s'insert dans une table et une autre partie dans une autre...

Jusque là pas de soucis, maintenant je désirai faire la jonctions (la connexion) entre les deux tables. Pour qu'une fois que le membre
se connect, je puisse, en variable session, récupérer toutes les infos concernant ce membres. 

J'ai bien lu plein de post concernant, mysql_inserid() ou @@INDENTIFY, mais je ne sais pas trop bien l'idée au moment de l'insert.

Voilà, je pense que c'est tout bête !!
Merci beaucoup

Le petit bout de code, on ne sais jamais 

$ajout_table1 = sprintf("INSERT INTO  table1 (nom, prenom, email) VALUES ('$email',  '$nom', '$prenom')");
 
$ajout_table2 = sprintf("INSERT INTO table2 (email, description) VALUES ('$email', '$description')");

25 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
23 déc. 2007 à 21:27
Hum.

mysql_insert_id() renvoit le dernier ID inséré. C'est une valeur à insérer. Donc, à la place de '$id_user', dans la liste des valeurs. Pas après, ça n'a aucun sens (en plus, c'est une belle erreur de syntaxe).

Il faut D'ABORD exécuter la première requête. Pas simplement l'écrire. L'exécuter, c'est à dire avec mysql_query().
Ce n'est qu'ensuite que mysql_insert_id() te renverra l'id inséré.

mysql_insert_id() n'est pas une requête, mais une fonction PHP, qui utilise l'API C de MySQL pour obtenir des informations du serveur.

Shématiquement :

$add_membre = ......
mysql_query($add_membre);
// A partir de là, mysql_insert_id() peut être exécutée, mais pas avant
$add_annonce = ......
mysql_query($add_annonce);
3
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
23 déc. 2007 à 21:51
Voilà ce qu'il faut que tu change dans ta requete :

$add_annonce = sprintf("INSERT
INTO annonces (email, province, cp, marque, modele, mois, annee, prix,
compte, detail_01, detail_02, detail_03, detail_04, detail_05,
description, id_user)
VALUES ('$email', '$province', '$cp', '$marque', '$modele', '$mois',
'$annee', '$prix', '$compte', '$detail_01', '$detail_02', '$detail_03',
'$detail_04', '$detail_05', '$description',
mysql_insert_id()"));

Voilà à quelques parenthèses ou guillemets prêts...
3
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
24 déc. 2007 à 00:01
Le champs id_user doit être un numéro auto, il ne faut donc pas le mettre dans ta requete !
Ensuite tu fais deux fois la même requete, je pense que tu n'as pas complètement saisi ce qu'on a voulu te dire même si tu es sur la bonne voix.
Essaye de modifier ça pour que ça soit correct parce que là...c'est franchement bizarre que ça marche, par curiosité tu le prend où ton id_user ?

mysql_select_db($database, $connexion);       
$add_membre
= sprintf("INSERT INTO membres ( id_user , civilite, email, pass, nom,
telephone, gsm, province, cp, compte) VALUES ('$id_user', '$civilite',
'$email', '$pass', '$nom', '$telephone', '$gsm','$province', '$cp',
'$compte')");
$id_insert = mysql_query($add_membre)or die(mysql_error());
$id = mysql_insert_id();
$add_annonce
= sprintf("INSERT INTO annonces (email, province, cp, marque, modele,
mois, annee, prix, compte, detail_01, detail_02, detail_03, detail_04,
detail_05, description, id_user) VALUES ('$email', '$province', '$cp',
'$marque', '$modele', '$mois', '$annee', '$prix', '$compte',
'$detail_01', '$detail_02', '$detail_03', '$detail_04', '$detail_05',
'$description', '$id')");   
 $result = mysql_query($add_membre , $connexion)or die(mysql_error());
 $result1 = mysql_query($add_annonce, $connexion)or die(mysql_error());
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
23 déc. 2007 à 12:06
Salut,

Je ne vois pas l'intérêt d'avoir une table séparée pour stocker la description d'un utilisateur. En fait, tu y perds en performances.

On stocke normalement dans une seule table les informations concernant un utilisateur. Si tu devais avoir plusieurs fois le même champ pour chaque utilisateur, alors seulement une deuxième table serait justifiée. Là, franchement, tu te compliques la vie pour rien.

J'en profite pour te conseiller de mettre un index dans ta table (numérique, plutôt que texte, ce qui exclue l'indexation de la table sur le champ email... pour des raisons de performances.

Si chaque utilisateur n'a qu'une seule description (le contraire n'ayant pas réellement de sens commun, à moins que tu n'aies un besoin très spécifique), alors autant tout laisser dans une seule table : multiplier les requêtes multiplie également le temps d'exécution, la charge du processeur, etc.
0

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

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 déc. 2007 à 12:42
Hello,

certes...mais ça se défend dans le cadre de gros, gros applicatifs.
Enfin...je ne vais pas critiquer la façon de faire parce que je le fais actuellement.  Je te donne juste une solution :
Tu as doit avoir une table "primaire".  Par exemple, at table1.
Puis dans ta/tes table(s) secondaire(j'arrête les S c'est saoûlant, vous aurez compris), tu lies tes entrées à l'ID de ta table primaire :

table users
user_id,
user_nom,
user_prenom
...

table users_coord_num
user_id
uesrnum_email
usernum_website

etc...
user_id est ta clé commune.

donc tu fais ton second INSERT avec le @@IDENTITY (désolé, je bosse plus sur mssql en ce moment) de ta première insertion, dans la table users.
Et quand tu récupères le tout :

SELECT user.user_nom,  user.user_prenom...usernum.usernum_email...
FROM users user
INNER JOIN users_coord_num usernum ON usernum.user_id = user.user_id
WHERE user.user_id = $iUserId

C'est valable pour X tables.
0
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
23 déc. 2007 à 12:51
Exact malalam à raison c'est dans la conception de la base de données le problème. Rajoute cet id et ça marchera !
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 12:58
Salut,

Merci neigedhiver pour ta réponse,

Mais c'est obligé pour moi de faire deux tables, car la deuxième table accueil l'annonce du membre.

Je ne t'es pas mis tout les champs pour ne pas surcharger le post mais normalement au complet ca donne ca.

$add_membre = sprintf("INSERT INTO membres (civilite, email, pass, nom, telephone, gsm, province, cp, compte) VALUES ('$civilite', '$email', '$pass', '$nom', '$telephone', '$gsm','$province', '$cp', '$compte')");

$add_annonce = sprintf("INSERT INTO annonces (email, province, cp, marque, modele, mois, annee, prix, compte, detail_01, detail_02, detail_03, detail_04, detail_05, description) VALUES ('$email', '$province', '$cp', '$marque', '$modele', '$mois', '$annee', '$prix', '$compte', '$detail_01', '$detail_02', '$detail_03', '$detail_04', '$detail_05', '$description')");

Et quand tu me dit de mettre un index... J'ai déja un 'userid' autoincrémente sur la table membre, et un 'annid' sur la table annonce.

Mon problème c'est que j'aimerai affiché l'annonce correspondant au membre. Par exemple a sa connexion.
Et au cas ou le membre rajouterai une annonce, il faudrait que sa deuxième annonce soit liée a son compte.

Merci de ton explication, mais si tu peux m'aider dans cette voie la..

A bientot
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 déc. 2007 à 12:58
Malalam a toujours raison, c'est l'admin du site ;-) (je plaisante hein, j'ai parfois tort...des fois...ça arrive quoi...c'est rare mais bon...et puis j'autorise personne à le dire hein, que ce soit clair!!)
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 13:07
Merci malalam,

Je suis juste un peu débutant, et ici je séche un peu...

Car je fait mon insert après l'inscription comme j'ai expliqué au desssus.

Mais toi tu as l'air de dire (je remet pas en cause maitre malalam )  qu'il faudrait que je change mes tables.

Pourtant elle contienne déja chacun un id. I'm lost ^^

Voilà pour info mes tables, si vous sauriez m'indiqué les erreurs...

CREATE TABLE `membres` (
  `id_user` bigint(50) unsigned NOT NULL auto_increment,
  `civilite` varchar(50) NOT NULL default '',
  `nom` varchar(50) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `pass` varchar(50) NOT NULL default '',
  `telephone` varchar(50) NOT NULL default '',
  `gsm` varchar(50) NOT NULL default '',
  `province` varchar(50) NOT NULL default '',
  `cp` varchar(50) NOT NULL default '',
  `compte` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id_user`)
)

CREATE TABLE `annonces` (
  `id_ann` bigint(20) NOT NULL auto_increment,
  `email` varchar(150) NOT NULL default '',
  `province` varchar(150) NOT NULL default '',
  `cp` varchar(150) NOT NULL default '',
  `marque` varchar(150) NOT NULL default '',
  `modele` varchar(150) NOT NULL default '',
  `mois` varchar(150) NOT NULL default '',
  `annee` varchar(150) NOT NULL default '',
  `prix` varchar(150) NOT NULL default '',
  `compte` varchar(150) NOT NULL default '',
  `detail_01` varchar(150) NOT NULL default '',
  `detail_02` varchar(150) NOT NULL default '',
  `detail_03` varchar(150) NOT NULL default '',
  `detail_04` varchar(150) NOT NULL default '',
  `detail_05` varchar(150) NOT NULL default '',
  `description` text NOT NULL,
  PRIMARY KEY  (`id_ann`)
)

Voilou voilou
0
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
23 déc. 2007 à 13:09
"Mon problème c'est que j'aimerai affiché l'annonce correspondant au membre. Par exemple a sa connexion.

Et au cas ou le membre rajouterai une annonce, il faudrait que sa deuxième annonce soit liée a son compte."



Et bien justement c'est en rajoutant l'id dans la seconde table que ça marchera, tu connais par Merise ? ça pourrait t'aider...


Voilà les tables qu'il faudrait :


membres (idmenbre,civilite, email, pass, nom,
telephone, gsm, province, cp, compte)

annonces (id_annonce,email, province, cp, marque, modele,
mois, annee, prix, compte, detail_01, detail_02, detail_03, detail_04,
detail_05, description,idmembre)


Vu qu'une annonce correspond à un seul membre et un membre peut avoir plusieurs annonces cela fonctionnera.
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 13:14
Je test ca desuite,

merci beaucoup

Merise ? Non je connais pas honte à moi
J'ai un peu cherché sur google... mais je m'interesserai a cela plus tard car ca a l'air compliqué non ?

Je vous tient au courant. Mais pour l'idmembres que tu ajoute dans annonce je dois alors recréer un champ...

Je test ;)
0
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
23 déc. 2007 à 13:16
Oui Merise peut parraître un peu compliqué, c'est sûr que si tu as deux tables ça te sert pas à grand chose mais dès que tu as une grosse base de données tu es obligé de t'en servir sinon tu t'en sort pas...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 déc. 2007 à 13:16
bizibiz17 te donne la clef (je renvoie l'ascenceur ;-) ). Merise, malgré son grand âge, reste une référence toujours utile à consulter.
Voilà une url que je consulte régulièrement quand j'ai des doutes :
http://www.sam-mag.com/P53,53,5,43,,,default.aspx
Cet article est vieux, mais il reste totalement d'actualité. Il explique Merise en des termes simples, avec des exemples très à propos. C'est le meilleur article que je connaisse sur le sujet.
Il faut que tu comprennes le concept de "clef étrangère". C'est une clef commune à plusieurs tables. Un peu comme ta famille proche : la clef commune entrre toi, ta mère, ton père, ta grand-mère paternelle etc... c'est ton nom de famille (sous réserve de spécificité familiale du genre ma mère a gardé son nom de jeune fille hein!). Tu veux tous les DURAND, qui appartiennent à diverses tables ? Ta clef commune, c'est "DURAND", dans la table "parents", "grand_parents", "enfants", "petits_enfants" etc...
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 13:27
Voila, je viens de tester...

Résultat.. dans ma base de donnée, le champ id_user de la table annonce affiche 0...

Pourant j'ai rajouté le champ dans la table annonce  :

CREATE TABLE `annonces` (
  `id_ann` bigint(20) NOT NULL auto_increment,
  `id_user` bigint(50) NOT NULL,

Et au niveau de l'insert aussi :
 
$add_membre = sprintf("INSERT INTO membres (id_user, civilite, email, pass, nom, telephone, gsm, province, cp, compte) VALUES ('$id_user', '$civilite', '$email', '$pass', '$nom', '$telephone', '$gsm','$province', '$cp', '$compte')");

$add_annonce = sprintf("INSERT INTO annonces (id_ann, email, province, cp, marque, modele, mois, annee, prix, compte, detail_01, detail_02, detail_03, detail_04, detail_05, description, id_user) VALUES ('$id_ann', '$email', '$province', '$cp', '$marque', '$modele', '$mois', '$annee', '$prix', '$compte', '$detail_01', '$detail_02', '$detail_03', '$detail_04', '$detail_05', '$description', '$id_user')");

bof bof

Ca va aller...
0
bizibiz17 Messages postés 142 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 29 août 2009 1
23 déc. 2007 à 14:27
Il ne faut pas que tu fasse un insert de tes "id" (id_user dans la table membre et id_ann dans annonces) car ils doivent être auto car uniques.
Pour le id_user dans la table annonces il faut que tu fasse une requete qui récupère l'id de l'utilisateur qui a déposé l'annonce et que tu mette cette valeur dans ta table pour que cela corresponde bien. Après tu pourra donc récupérer toutes les annonces d'un membre.
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 16:31
Re,

Ah je commence doucement a y voir plus claire...

Je dois récupérer son id...Le problème c'est que l'inscription du membre et sa première annonce son au même moment...

Alors comment récupérer son id alors qu'il n'est même pas encore enregistré dans la table membre.sql ?

Et par la suite, comment affiché les annonce lié a son compte ? SELECT * FROM membres WHERE id='$id' ?

Merci de votre aide plus que précieuse
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
23 déc. 2007 à 16:36
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 18:29
Oui ce lien je l'es lu et relus !!!

Le problème c'est comme je fait deux insert, le premier dans la table membre et le deuxième dans la table annonces...
Mysql va peu etre confondre, en plus de ca... Il me parle de printf ?? alors que je doit juste inserer l'id... et en plus l'id se nomme id_user...je peu donc pas changé la function php...

printf("Le dernier ID inséré dans est le id %d\n", mysql_insert_id());

J'avoue que là...J'était la péniche dans le pacifique, maintenant je suis le Titanic dans l'antartique...

En claire je ne doit pas faire cela :

$add_membre = sprintf("INSERT INTO membres (civilite, email,
pass, nom, telephone, gsm, province, cp, compte) VALUES ('$civilite', '$email', '$pass', '$nom', '$telephone',
'$gsm','$province', '$cp', '$compte')");

$add_annonce =
sprintf("INSERT INTO annonces (email, province, cp, marque,
modele, mois, annee, prix, compte, detail_01, detail_02, detail_03,
detail_04, detail_05, description, id_user) VALUES ('$email', '$province', '$cp', '$marque', '$modele', '$mois', '$annee',
'$prix', '$compte', '$detail_01', '$detail_02', '$detail_03',
'$detail_04', '$detail_05', '$description','$id_user')")
mysql_insert_id());

Merci ;)


                
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
23 déc. 2007 à 18:31
Tu récupères l'id après ton premier insert, tu t'en sers dans ton deuxième... Comment il pourrait confondre ?
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
23 déc. 2007 à 19:51
Ce code est il correct alors ?

$add_membre = sprintf("INSERT
INTO membres (civilite, email, pass, nom, telephone, gsm, province, cp,
compte) VALUES ('$civilite', '$email', '$pass', '$nom', '$telephone',
'$gsm','$province', '$cp', '$compte')");

$add_annonce = sprintf("INSERT
INTO annonces (email, province, cp, marque, modele, mois, annee, prix,
compte, detail_01, detail_02, detail_03, detail_04, detail_05,
description, id_user)
VALUES ('$email', '$province', '$cp', '$marque', '$modele', '$mois',
'$annee', '$prix', '$compte', '$detail_01', '$detail_02', '$detail_03',
'$detail_04', '$detail_05', '$description','$id_user')")
mysql_insert_id());

Thanks 
0
Rejoignez-nous