Php Insert ID [Résolu]

Signaler
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009
-
 cs_fanti -
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

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
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);
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
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...
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
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());
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
Exact malalam à raison c'est dans la conception de la base de données le problème. Rajoute cet id et ça marchera !
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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!!)
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
"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.
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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 ;)
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
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...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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...
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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...
Messages postés
142
Date d'inscription
mardi 17 janvier 2006
Statut
Membre
Dernière intervention
29 août 2009
1
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.
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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

                        
                
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Tu récupères l'id après ton premier insert, tu t'en sers dans ton deuxième... Comment il pourrait confondre ?
Messages postés
85
Date d'inscription
samedi 30 juillet 2005
Statut
Membre
Dernière intervention
7 mai 2009

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