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 :

Connaitre l'id créé sans utiliser lastInsertedId [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 40
    Points
    40
    Par défaut Connaitre l'id créé sans utiliser lastInsertedId
    Je veux récupérer l'id de la ligne que je viens de créer, pour crée une autre ligne dans une autre table associée.
    J'utilise PDO pour faire mes requêtes à partir de PHP sur MySQL.

    Par exemple j'insère un pays, l'id créé est 10 (auto-incrément).
    Je veux récupérer l'id du pays pour pouvoir créer juste après une ville avec pays_id = 10.
    Si j'utilise PDO::lastInsertId, je risque de récupérer la mauvaise id, si quelqu'un a créé un autre pays entre temps (et ma ville sera alors associée au mauvais pays).

    Comment faire alors ? (je débute en sql, je ne connais que select, update, delete, insert et c'est tout!))

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par eprevot Voir le message
    Par exemple j'insère un pays, l'id créé est 10 (auto-incrément).
    Je veux récupérer l'id du pays pour pouvoir créer juste après une ville avec pays_id = 10.
    Si j'utilise PDO::lastInsertId, je risque de récupérer la mauvaise id,
    Justement non !
    Le lastinsertid récupère le dernier auto-incrément créé par la connexion MySQL en cours. Si un autre utilisateur arrive et crée un pays, il aura une autre connexion donc un autre lastinsertid.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    ah bon je ne savais pas ! Je ne vois rien qui mentionne ça dans la doc de PDO.
    Et à quel moment la connexion MySQL s'arrete ?

  4. #4
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Bonjour,

    Avant de créer la ville, faire une requête recupérant le dernier id :

    exemple avec mysql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id FROM table ORDER BY id DESC LIMIT 1

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par ska_root Voir le message
    Bonjour,

    Avant de créer la ville, faire une requête recupérant le dernier id :

    exemple avec mysql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id FROM table ORDER BY id DESC LIMIT 1
    Ça c'est justement ce qu'il ne faut pas faire car si un autre utilisateur crée un pays entre temps, l'id récupéré sera celui de ce dernier pays et pas celui nécessaire à l'ajout de la première ville.

    De plus, ta requête n'est pas terrible ! Celle-ci serait beaucoup mieux :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT MAX(id) 
    FROM pays

  6. #6
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    oui, en relisant, je me suis précipité... mea culpa

    pour me rattraper :
    A moins qu'elle ne soit persistante (PDO::ATTR_PERSISTENT) la connexion sera close automatiquement par PHP une fois le script terminé.
    Tu peux la clore toi-même en faisant un unset sur l'objet PDO (ou en lui attribuant la valeur null).


  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Petit conseil sur l'utilisation de lastInsertId, parce que j'ai fait l'erreur :
    Quand on utilise les transactions, si on appelle lastInsertId après le commit, il renvoie 0... Il faut le récupérer avant le commit pour avoir la bonne valeur.

    Je pensais que l'id n'était pas créé tant que la transaction n'était pas commitée
    mais c'est l'inverse.

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

Discussions similaires

  1. [CR8.5] Image dynamique sans utiliser RDC ou Blob
    Par lrp dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/12/2005, 14h43
  2. [CR8.5]lancer plusieurs impressions sans utiliser l'ocx
    Par sboober dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/05/2005, 10h08
  3. Réponses: 6
    Dernier message: 27/05/2004, 10h41
  4. [][Timer] Créer un Timer sans utiliser le composant
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2003, 11h04
  5. Tore en OpenGL sans utiliser glut
    Par lefort dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 20/11/2002, 16h32

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