Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
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 18/07/2011, 12h28   #1
Invité régulier
 
Inscription : juillet 2011
Messages : 31
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 31
Points : 6
Points : 6
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!))
eprevot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 14h52   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 019
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 019
Points : 18 304
Points : 18 304
Envoyer un message via MSN à CinePhil
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/07/2011, 15h31   #3
Invité régulier
 
Inscription : juillet 2011
Messages : 31
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 31
Points : 6
Points : 6
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 ?
eprevot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 17h10   #4
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

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

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour,

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

exemple avec mysql
Code :
1
2
 
SELECT id FROM table ORDER BY id DESC LIMIT 1
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 18/07/2011, 21h20   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 019
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 019
Points : 18 304
Points : 18 304
Envoyer un message via MSN à CinePhil
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 :
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 :
1
2
SELECT MAX(id) 
FROM pays
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 23h37   #6
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

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

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
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).

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 10h39   #7
Invité régulier
 
Inscription : juillet 2011
Messages : 31
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 31
Points : 6
Points : 6
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.
eprevot 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 13h09.


 
 
 
 
Partenaires

Hébergement Web