IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Double enregistrement lié [Oracle]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de riesseg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 415
    Points : 251
    Points
    251
    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

  2. #2
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)");

  3. #3
    Membre actif Avatar de riesseg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 415
    Points : 251
    Points
    251
    Par défaut
    Mais si y'a deux enregistrement en même temps (rare, mais possible), ça marche aussi ??
    n'oubliez pas la balise

  4. #4
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...);

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query('SHOW TABLE STATUS LIKE objet');
    ensuite
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre actif Avatar de riesseg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 415
    Points : 251
    Points
    251
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Double Enregistrement !
    Par JinenSoftware dans le forum C#
    Réponses: 14
    Dernier message: 31/12/2008, 16h34
  2. Réponses: 8
    Dernier message: 13/04/2006, 15h22
  3. formulaire: enregistrement en double/date now pb
    Par debdev dans le forum Access
    Réponses: 18
    Dernier message: 02/01/2006, 12h54
  4. [Forms] : enregistrement en double
    Par Aminos dans le forum Forms
    Réponses: 5
    Dernier message: 27/01/2005, 17h36
  5. Réponses: 9
    Dernier message: 01/10/2003, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo