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 :

Insertion d'un tuple et récupération immédiate de son id [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut Insertion d'un tuple et récupération immédiate de son id
    Bonjour,

    Je suis en train d'essayer un truc que je pensais évident :

    J'insère un nouvel enregistrement.
    Immédiatement après je récupère l'id (auto-incrémenté) de ce nouvel enregistrement, ce à l'aide d'un WHERE date=$date.

    A priori c'est banal.

    Pourtant j'obtiens l' erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_free_result(): 7 is not a valid MySQL result resource in...
    Donc ma question est la suivante :
    Peut-on faire ce que je fais, à savoir insérer un nouvel enregistrement et immédiatement après dans le code en récupérer l'id ? Ou cela pose t'il un problème en terme de temps d'exécution, par exemple ?
    Ou bien cela vient-il d'une erreur dans mon code ?

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    mysql_insert_id()

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Merci cela a l'air de fonctionner.

    Mais je suis assez dérouté :

    1) Tu vas me dire que c'est impossible pour des raisons de timing, mais vu qu'il n'y a pas de clause WHERE, n'y a t-il pas un risque avec cette fonction que l'id retourné soit celui d'un autre tuple que celui qui vient d'être inséré par le script (si il y a plusieurs utilisateur par exemple) ?
    D'autant plus que j'ai des id dans plusieurs tables.

    2) J'ai simplement écrit
    idCom = mysql_insert_id() c'est comme cela que cette fonction s'utilise ?

  4. #4
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Les points que tu soulèves ne sont pas dénués de sens.
    C'est une juste gestion optimiste
    C'est aussi pour cela que dans php.net on te dit d'executer le mysql_insert_id() juste après le query d'insert.

  5. #5
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Bonjour,

    mysql_insert_id() (comme la fonction SQL LAST_INSERT_ID()) est spécifique à la connexion en cours donc il n'y a aucun risque qu'une requête d'un autre utilisateur interfère

    http://dev.mysql.com/doc/refman/5.0/en/information-functions.html

  6. #6
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    autant pour moi


  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    mysql_insert_id() (comme la fonction SQL LAST_INSERT_ID()) est spécifique à la connexion en cours donc il n'y a aucun risque qu'une requête d'un autre utilisateur interfère
    Sur le manuel php ils disent
    Si link_identifier est omis, la dernière connexion ouverte est utilisée
    Donc ce pourrait être l'id d'un autre enregistrement qui se serait intercalé pile entre les deux, en théorie ? non ?

    Ils disent aussi :
    mysql_insert_id() juste après l'exécution de la requête, pour obtenir cette valeur non parasitée.
    Donc si je comprend bien, dans ce que j'avais essayé au début, il y avait un "parasite" :
    Quelqu'un peut-il m'expliquer la nature de ce parasitage ?

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Le parasitage, c'est si tu as effectué avec le même script (et donc la même connection) une nouvelle requête avant d'utiliser mysql_insert_id().
    Exemple :
    Tu fais un INSERT. mysql_insert_id() renvoie 12456 (l'id inséré).
    Tu fais ensuite un SELECT. mysql_insert_id() renvoie 0 (= aucun id inséré dans la dernière requête).
    C'est ce SELECT (ou UPDATE, DELETE...) qui a parasité le résultat de ton mysql_insert_id().
    Si tu as fait une nouvelle requête, la seule solution pour obtenir l'id précédent est de passer par une requête SQL avec LAST_INSERT_ID().

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Oui mais je n'ai toujours pas compris pourquoi ma requête select ne peut récupérer elle même le tuple de l'insert.

    Parce que c'est dans la même connexion, c'est cela? Mais alors, quand une connexion se ferme-t'elle ? juste après une requête ? Donc elle est fermée après le premier insert !

    Je sais que non, mais j'ai un truc à piger là je crois.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Une connection non persistante se ferme soit quand tu utilises mysql_close(), soit quand le script est terminé.
    Citation Envoyé par le manuel php
    mysql_close() ferme la connexion au serveur MySQL associée à l'identifiant link_identifier. Si cet identifiant n'est pas spécifié, cette commande s'applique à la dernière connexion ouverte.

    Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

    Note : Notez que cette commande n'est pas nécessaire, car toutes les connexions non persistantes seront automatiquement fermées à la fin du script.

    mysql_close() ne ferme pas les connexions persistantes générées par mysql_pconnect().

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Citation Envoyé par psychoBob
    Oui mais je n'ai toujours pas compris pourquoi ma requête select ne peut récupérer elle même le tuple de l'insert.
    Lis le manuel :

    Citation Envoyé par le manuel php
    int mysql_insert_id ( [resource link_identifier])


    mysql_insert_id() retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT, sur la connexion MySQL courante, ou bien sûr la connexion spécifiée par link_identifier. Si link_identifier est omis, la dernière connexion ouverte est utilisée.

    mysql_insert_id() retourne 0 si la dernière requête SQL n'a pas généré de valeur AUTO_INCREMENT. Si vous devez lire cette valeur pour la conserver et l'utiliser ultérieurement, appelez la fonction mysql_insert_id() juste après l'exécution de la requête, pour obtenir cette valeur non parasitée.

    Note : La fonction MySQL LAST_INSERT_ID() contient toujours la valeur AUTO_INCREMENT la plus récente, et n'est pas remis à zéro entre deux requêtes.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Ok donc, quand vous dites "connexion ouverte" c'est juste l'espace de temps d'exécution de la requête en fait. C'est cela que j'avais du mal à comprendre. Ai-je seulement bien compris ?

  13. #13
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    non la connexion reste ouverte pendant toute l'exécution de ton script

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

Discussions similaires

  1. TSQLQuery insertion d'une ligne et récupération de l'id créé
    Par beletot dans le forum Composants VCL
    Réponses: 18
    Dernier message: 19/06/2015, 18h47
  2. [MySQL] Insertion d'un tuple dans une table (PHPMYADMIN)
    Par gillariel dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 19/04/2015, 16h12
  3. Réponses: 1
    Dernier message: 20/12/2014, 10h14
  4. Insertion d'un tuple
    Par sheridan08 dans le forum SQL
    Réponses: 1
    Dernier message: 24/10/2011, 10h00
  5. Problème Insertion d'un tuple
    Par maserati dans le forum Oracle
    Réponses: 1
    Dernier message: 30/03/2009, 14h44

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