[mysql_insert_id] Plusieurs INSERT

Mammouth du PHP | 965 Messages

04 mars 2008, 11:39

Bonjour,

Je suis en train de rédiger un script qui permet l'ajout sur plusieurs tables a savoir

ma_table = la table comportant des donnes
ma_table_id = comporte tout les id pour les table de relations
ma_table_relation1 = premiere table de relation
ma_table_relation2 = deuxieme table de relation

Lorsque j'ajoute les données je fais un INSERT.

Ensuite je récupere le mysql_insert_id() pour l'ajouter a la table d'id.

Ensuite j'enregistre les 2 tables de relations.

Mais la je bloque a savoir comment recuperer l'identifiant qui a été enregistrer dans la table d'id, donc le mysql_insert_id() et l'ajouter de nouveau a la table d'identifiant avec le dernier id enregistre pour la relation1 et le dernier id pour la relation2.

Je sais pas si vous avez bien suivi la demarche mais en gros ca donne :
	//insertion des données	
	$insert = "INSERT INTO `cat_prod` 
	( Code, Prix,  Facade,  Shon, Surface, Infos_supp  ) 
	VALUES ('".$Code."','".$Prix ."','".$Facade."','".$Shon."','".$Surface."','".$Infos."')";
		if(	@mysql_query($insert) )
		{
			// Identifiant du lot 
			$Id_Lot = mysql_insert_id();
			
			// Mise a jour des identifiant du lot
			$insert2 = "INSERT INTO cat_prod_id (Id_cat_prod, Id_cat, Id_user, Id_cat_prod_etat )
			VALUES
			('".$Id_Lot."','".$_GET['id']."','".$_SESSION['Id_utilisateur']."','3') ";
			
			
			
			// Données du notaire pour le lot
			@mysql_query("INSERT INTO cat_prod_notaire ( Etude, Clerc, Adresse, Cp, Ville, Tél )
			VALUES
			('".$Notaire_etude."','".$Notaire_clerc."','".$Notaire_adresse."','".$Notaire_cp."','".$Notaire_ville."','".$Notaire_tel."')");
			
			// Mise a jour du lot pour le notaire
			@mysql_query("UPDATE cat_prod_id SET Id_cat_prod_notaire = '".mysql_insert_id()."' WHERE Id_cat_prod = '".$Id_Lot."' ");
			
			// Données du géometre pour le lot
			@mysql_query("INSERT INTO cat_prod_geometre ( Societe, Nom, Adresse, Cp, Ville ) 
			VALUES 
			('".$Geometre_societe."','".$Geometre_nom."','".$Geometre_adresse."','".$Geometre_cp."','".$Geometre_ville."')");
			
			// Mise a jour du lot pour le geometre
			@mysql_query("UPDATE cat_prod_id SET Id_cat_prod_geometre = '".mysql_insert_id()."' WHERE Id_cat_prod = '".$Id_Lot."' ");
			
			if( @mysql_query($insert2) )
			{
			echo "<tr><td><b>Lot enregistré avec succès.</b></td></tr>";
			echo "<tr><td><a href='a_lot.php?id=".$_GET['id']."'><img src='".$_SESSION['Base_img']."_medias/img/admin/a_retour.gif' />&nbsp;Retour a la liste des lots</a></td></tr>";
			}	
		}		

d0m
Mammouth du PHP | 1141 Messages

04 mars 2008, 11:50

Salut,

avant d'aller plus loin, si j'ai bien compris tu as une table ma_table_id contenant tous les identifiants de la table ma_table.

Pourquoi faire cette deuxième table ma_table_id puisqu'ils sont déjà tous dans ma_table?

Mammouth du PHP | 965 Messages

04 mars 2008, 11:54

Salut,

avant d'aller plus loin, si j'ai bien compris tu as une table ma_table_id contenant tous les identifiants de la table ma_table.

Pourquoi faire cette deuxième table ma_table_id puisqu'ils sont déjà tous dans ma_table?
Justement non ma_table n'est composée que d'entrée texte type Nom, Adresse etc ...

Et la table d'identifiant gère les identifiants des table de relations en entrant : ma_table_id_secteur1, ma_table_id_secteur2

Ensuite j'ai des tables de relation type :

Id, Libellé et d'autres informations.

J'espère être clair :)

d0m
Mammouth du PHP | 1141 Messages

04 mars 2008, 12:22

Sache qu'une table sans identifiant numérique n'est pas une très bonne idée.
Pourquoi ne pas mettre un identifiant dans la table ma_table?

Mammouth du PHP | 965 Messages

04 mars 2008, 12:26

Sache qu'une table sans identifiant numérique n'est pas une très bonne idée.
Pourquoi ne pas mettre un identifiant dans la table ma_table?
Je vais te montrer les tables, peut être que tu verra mieux comme ca :

La table principale :

Code : Tout sélectionner

CREATE TABLE `cat_prod` ( `Id` int(11) NOT NULL auto_increment, `Code` varchar(10) collate utf8_unicode_ci NOT NULL, `Infos_supp` text collate utf8_unicode_ci NOT NULL, `Date_chgmt_etat` datetime default NULL, `Client` varchar(255) collate utf8_unicode_ci default NULL, `Surface` float default NULL, `Facade` float default NULL, `Shon` float default NULL, `Prix` float default NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;
La table des identifiants :

Code : Tout sélectionner

CREATE TABLE `cat_prod_id` ( `Id_cat_prod` int(11) NOT NULL, `Id_cat` int(11) NOT NULL, `Id_cat_prod_etat` text collate utf8_unicode_ci NOT NULL, `Id_cat_prod_geometre` int(11) NOT NULL, `Id_cat_prod_notaire` int(11) NOT NULL, `Id_user` int(11) NOT NULL, `Id_online` int(1) NOT NULL default '0', PRIMARY KEY (`Id_cat_prod`), KEY `id_programme` (`Id_cat`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Et les tables de relations :

Table pour le notaire

Code : Tout sélectionner

CREATE TABLE `cat_prod_notaire` ( `Id` int(11) NOT NULL auto_increment, `Etude` varchar(50) NOT NULL, `Clerc` varchar(50) NOT NULL, `Adresse` varchar(50) NOT NULL, `Cp` varchar(50) NOT NULL, `Ville` varchar(50) NOT NULL, `Tél` varchar(14) NOT NULL, UNIQUE KEY `Id` (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Table pour le geometre

Code : Tout sélectionner

CREATE TABLE `cat_prod_geometre` ( `Id` int(11) NOT NULL auto_increment, `Societe` varchar(50) NOT NULL, `Nom` varchar(50) NOT NULL, `Adresse` varchar(50) NOT NULL, `Cp` varchar(50) NOT NULL, `Ville` varchar(50) NOT NULL, UNIQUE KEY `Id` (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Et la table de l'état :


Code : Tout sélectionner

CREATE TABLE `cat_prod_etat` ( `Id` int(5) NOT NULL, `Libelle` varchar(30) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
C'est peut être plus clair comme ca.

d0m
Mammouth du PHP | 1141 Messages

04 mars 2008, 12:34

D'accord, en fait ce que tu appelles table des identifiants est en fait la table des relations, celle qui fait le liens entre tous les éléments représentés chacun par une table.

Maintenant il y a l'air d'avoir une relation 1-1 entre les tables cat_prod et cat_prod_id c'est à dire qu'il y a un et un seul cat_prod pour un cat_prod_id et vice versa.
Si c'est le cas, tu peux tout simplement fusionner les 2 tables :

Code : Tout sélectionner

CREATE TABLE `cat_prod` ( `Id` int(11) NOT NULL auto_increment, `Code` varchar(10) collate utf8_unicode_ci NOT NULL, `Infos_supp` text collate utf8_unicode_ci NOT NULL, `Date_chgmt_etat` datetime default NULL, `Client` varchar(255) collate utf8_unicode_ci default NULL, `Surface` float default NULL, `Facade` float default NULL, `Shon` float default NULL, `Prix` float default NULL, `Id_cat` int(11) NOT NULL, `Id_cat_prod_etat` text collate utf8_unicode_ci NOT NULL, `Id_cat_prod_geometre` int(11) NOT NULL, `Id_cat_prod_notaire` int(11) NOT NULL, `Id_user` int(11) NOT NULL, `Id_online` int(1) NOT NULL default '0', PRIMARY KEY (`Id`)
Ensuite, il faut d'abord insérer les autres éléments c'est à dire le notaire, le géomètre, la cat, l'état, le user et le online en prenant soin de ranger (dans un tableau par exemple) les identifiants récupérées par mysql_insert_id() après chaque insertion.

A la fin tu insères cat_prod avec tous les identifiés préalablement enregistré dans ton tableau.
Modifié en dernier par d0m le 04 mars 2008, 12:39, modifié 1 fois.

Mammouth du PHP | 965 Messages

04 mars 2008, 12:39

Justement j'ai mis ca en place pour avoir 2 tables séparées, pour garder les identifants d'un côté et les données de l'autre, car sur certaines autres tables il ya beaucoup de données textes, et ensuite une table de relation c'est plus clair pour moi.

Par contre ca ne resoud pas mon problème de mysql_insert_id(), je ne vois pas comment stocker un identifiant generer par auto increment et le retrouver après plusieurs insert, mis a pars ta solution de fusionner les 2 tables.

d0m
Mammouth du PHP | 1141 Messages

04 mars 2008, 12:46

A toi de voir,
la méthode ensuite est la même :

insérer d'abord tous les éléments un par un en rangeant dans une structure ou des variables les identifiants récupérées par mysql_insert_id après chaque insertion.
$identifiants_insere = array();
// Données du notaire pour le lot
            @mysql_query("INSERT INTO cat_prod_notaire ( Etude, Clerc, Adresse, Cp, Ville, Tél )
            VALUES           ('".$Notaire_etude."','".$Notaire_clerc."','".$Notaire_adresse."','".$Notaire_cp."','".$Notaire_ville."','".$Notaire_tel."')");
$identifiants_insere['notaire'] = mysql_insert_id();

// Données du géometre pour le lot
            @mysql_query("INSERT INTO cat_prod_geometre ( Societe, Nom, Adresse, Cp, Ville ) 
            VALUES             ('".$Geometre_societe."','".$Geometre_nom."','".$Geometre_adresse."','".$Geometre_cp."','".$Geometre_ville."')");
             $identifiants_insere['geometre'] = mysql_insert_id();
.... 

//tables avec tous les identifiants
@mysql_query("INSERT INTO cat_prod_id (Id_cat_prod_notaire,id_cat_prod_geometre,... )
            VALUES
            (".$identifiants_insere['notaire']",".$identifiants_insere['geometre']."...");
             


Mammouth du PHP | 965 Messages

04 mars 2008, 12:53

A toi de voir,
la méthode ensuite est la même :

insérer d'abord tous les éléments un par un en rangeant dans une structure ou des variables les identifiants récupérées par mysql_insert_id après chaque insertion.
$identifiants_insere = array();
// Données du notaire pour le lot
            @mysql_query("INSERT INTO cat_prod_notaire ( Etude, Clerc, Adresse, Cp, Ville, Tél )
            VALUES           ('".$Notaire_etude."','".$Notaire_clerc."','".$Notaire_adresse."','".$Notaire_cp."','".$Notaire_ville."','".$Notaire_tel."')");
$identifiants_insere['notaire'] = mysql_insert_id();

// Données du géometre pour le lot
            @mysql_query("INSERT INTO cat_prod_geometre ( Societe, Nom, Adresse, Cp, Ville ) 
            VALUES             ('".$Geometre_societe."','".$Geometre_nom."','".$Geometre_adresse."','".$Geometre_cp."','".$Geometre_ville."')");
             $identifiants_insere['geometre'] = mysql_insert_id();
.... 

//tables avec tous les identifiants
@mysql_query("INSERT INTO cat_prod_id (Id_cat_prod_notaire,id_cat_prod_geometre,... )
            VALUES
            (".$identifiants_insere['notaire']",".$identifiants_insere['geometre']."...");
             

Merci beaucoup je ne pensais pas qu'on pouvait les stocker de cette manière, je met la balise [Résolu].

d0m
Mammouth du PHP | 1141 Messages

04 mars 2008, 14:38

je ne pensais pas qu'on pouvait les stocker de cette manière.
mysql_insert_id retourne un entier, on peut donc le stocker dans une variable comme n'importe quel entier.

Mammouth du PHP | 965 Messages

04 mars 2008, 14:49

je ne pensais pas qu'on pouvait les stocker de cette manière.
mysql_insert_id retourne un entier, on peut donc le stocker dans une variable comme n'importe quel entier.
Oui mais etant donné que c'est une valeur relative a un dernier en registrement en base de donnée je ne pensais pas qu'il était possible de le stocker apres d'autres INSERT.