Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/07/2006, 00h27   #1
Membre confirmé
 
Avatar de riesseg
 
Inscription : mars 2006
Messages : 415
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 415
Points : 201
Points : 201
Envoyer un message via MSN à riesseg
Par défaut Double enregistrement lié

Le titre qui veut rien dire...

Je developpe ici.

la table personne:
id
nom
id_objet

la table objet
id_objet
num
prix

J'ai le nom du client, l'id_objet.
j'ai l'id_objet, son num et son prix.

Je dois entré dans ma table la personne et l'objet en même temps.
les id etant auto-increment pour les deux tables, comment faire ?

je peux pas definir l'objet avant, car si y'a 2 enregistrements simultanés, je ne pourrai pas récup les infos.
et je peux pas enregistré la personne, puisque je n'ai pas l'id_objet...

Comment faire ?

je pense qu'il doit y'a voir possibilite d'utiliser comme id le temps Unix...
Mais si je peux faire ça avec des ptits nombre, ça m'arrange...
__________________
n'oubliez pas la balise
riesseg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2006, 04h22   #2
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Tu insères d'abord les infos de ton objet dans la table objet.

tu récupères id_objet de la table objet via la fonction mysql_insert_id()

ensuite tu insères les infos de ta personne et tu remplis le champ id_objet de la table personne avec la valeur récupurée précedemment via mysql_insert_id()

Exemple
Code :
1
2
3
4
5
6
 
mysql_query("INSERT INTO objet (num,prix) VALUES (1,5.0)");
 
$last_id_objet = mysql_insert_id();
 
myqle_query("INSERT INTO personne(nom,id_objet) VALUES ('Charles',$last_id_objet)");
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2006, 09h34   #3
Membre confirmé
 
Avatar de riesseg
 
Inscription : mars 2006
Messages : 415
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 415
Points : 201
Points : 201
Envoyer un message via MSN à riesseg
Mais si y'a deux enregistrement en même temps (rare, mais possible), ça marche aussi ??
__________________
n'oubliez pas la balise
riesseg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2006, 15h46   #4
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Bah pour deux enregistrements -> tu reproduis 2 fois la séquence de code mentionnée plus haut.

Pour X enregistrement -> tu reproduis x fois la séquence de code.

Code :
1
2
3
4
5
6
7
8
9
10
 
//enreg 1 
mysql_query(INSERT INTO objet....);
mysql_insert_id();
mysql_query(INSERT INTO personne...);
 
//enreg2
mysql_query(INSERT INTO objet....);
mysql_insert_id();
mysql_query(INSERT INTO personne...);
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 14h08   #5
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 424
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 424
Points : 2 811
Points : 2 811
c'est une des limitation de MySQL

avec un moteur SQL conforme tu utiliserais une séquence et tu ferais un Next sur ta séquence ensuite tu ouvrirais une transaction pour faire tes insert

avec MySQL tu ne peux pas
tu peux faire un truc qui y resemble mais jamais tu auras la garantie absolue par le moteur de l'intégrité de tes données
(le risque est rare mais il existe)

pour obtenir l'id tu fais
Code :
mysql_query('SHOW TABLE STATUS LIKE objet');
ensuite
tu fais
Code :
1
2
3
4
mysql_query('START TRANSACTION;');
mysql_query('INSERT INTO objet....');
mysql_query('INSERT INTO personne...');
mysql_query('COMMIT');
1) par rapport à une séquence le show table te retourne un enregistrement don le champs Auto_increment contient la prochaine valeur mais il ne l'incrémente pas
ce qui fais que si un autre script s'exécute en même temps tu auras un conflit d'id.

2) la transaction fonctionnera avec MySQL que si tu utilise InnoDB dans le cas contraire si pour une raison ou une autre ton script ton serveur ta liaison avec la base quoi que ce soit plante entre les insert ta base est incohérente.

en fait MySQL ne sait pas résoudre ce pb de façon éficasse. pour la version 5 je ne sais pas j'ai pas pu tester pour les autres aucune garantie, aucuns moyen de gérer les accès concurant sur le serveur. aucun moyen de garantir l'intégrité.

en général MySQL se montre performant quand on a une appli qui fait beaucoup de Select et peu de Insert ou Update.
dans ce cas on mise sur le fait que les écritures étant rares elles ont extremement peu de chance d'arriver en même temps.

si ton appli fait de l'écriture intenssive et que dois garantir l'intégrité soit tu écrit un frontal qui vas cenraliser les accès en écriture et les ordonner pour offir cette garantie (en clair refaire une partite de MySQL) soiit tu prends un moteur SQL sérieux genre PosgreSQL pour rester dans l'open source ou Oracle Sybase et même SQLServeur.

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 15h19   #6
Membre confirmé
 
Avatar de riesseg
 
Inscription : mars 2006
Messages : 415
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 415
Points : 201
Points : 201
Envoyer un message via MSN à riesseg
j'ai utilisé $last_id_objet = mysql_insert_id();

Mais si j'ai un probleme par la suite, je tiendrai compte des autresrques.

merci
__________________
n'oubliez pas la balise
riesseg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h26.


 
 
 
 
Partenaires

Hébergement Web