Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 29/06/2007, 14h02   #1
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
Par défaut [PostGreSQL] Insertion et récupération d'identifiant

Bonjour,

Je suis dans un cas, qui me parrait assez courrant mais sur lequel ma solution me parait pas trés jolie...

Prenons une table toute bête avec 2 champs, par exemple une table "Projets" :
- un entier auto-incrémenté, indentifiant unique et clé primaire du projet
- une chaine, représentant le nom d'un projet

Je dois faire une fonction qui renvoi l'identifiant en prenant en parametre le nom, et qui dois inserer le tupple si jamais il n'existe pas



Ma premiere solution a consisté a faire directement la requete d'insertion, et si elle renvoyait une erreur autre que "duplicate key", j'affichais l'erreur sinon je faisais mon select et revoyais l'identifiant...mais...


Ma configuration est la suivante : PHP4 et postgresSQL 8.1

PHP4 n'ayant pas de try/catch, si j'ai une erreur sur ma requete d'insertion, elle est affichée..(naturelement, il n'est pas question d'inhiber les message sd'erreurs/warnings du serveur)



Ma solution pas trés jolie consiste, dans le pire des cas et malheureusement le plus courrant, à effectuer 3 requetes :

requete 1) Un premier select qui test l'existance du projet
requete 2) Le projet n'existe pas, je l'insere
requete 3) Je refais un select pour récupérer l'identifiant fraichement créé

Je trouve ça pas trés jolie et avoir autant de requete augmente les chances d'erreurs...n'y a-t-il pas un moyen d'en diminuer le nombre?

merci à tous
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 14h17   #2
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
Salut,

Si je comprends bien ton problème, ce que tu cherches est une fonction qui retournerais l'ID du dernier INSERT effectué.
Je sais que ça existe sur MySQL (mysql_insert_id()). J'imagine que pour postgres une fonction équivalente existe également, tu as regardé dans les docs ? Tu peux peut-être également regarder/poser la question dans le forum spécifique a postgres
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 14h41   #3
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
j'ai regardé la doc, mais j'ai rien trop vu qui ressemblerai à ça...

je vais poster dans le forum postgres...desfois que j'aurais loupé quelques choses

merci pour ta réponse
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 14h58   #4
Rédacteur/Modérateur
 
Avatar de Deepin
 
Homme Deepin
Ingénieur - Chef de projet Modélisation/Simulation
Inscription : avril 2004
Messages : 1 341
Détails du profil
Informations personnelles :
Nom : Homme Deepin
Localisation : Ile Maurice

Informations professionnelles :
Activité : Ingénieur - Chef de projet Modélisation/Simulation
Secteur : Industrie

Informations forums :
Inscription : avril 2004
Messages : 1 341
Points : 7 056
Points : 7 056
Envoyer un message via Skype™ à Deepin
Hello,
As tu vraiment besoin de l'etape n°3 ? Car à l'etape n°1 il me semble que si ton projet existe tu le recupere directement.
Tu peux aussi imaginer de faire une fonction getOrCreateProject() par exemple.
A++
Deepin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 17h36   #5
Nouveau Membre du Club
 
Avatar de bambou
 
Inscription : mars 2004
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 192
Points : 36
Points : 36
Envoyer un message via AIM à bambou Envoyer un message via MSN à bambou Envoyer un message via Skype™ à bambou
Citation:
Envoyé par buns
Tu peux aussi imaginer de faire une fonction getOrCreateProject() par exemple.
A++
c'est exactement ce que je fait...dans tout les cas la fonction renvoi un ID, mais si le projet existe pas, elle le crée

Citation:
Envoyé par buns
Hello,
As tu vraiment besoin de l'etape n°3 ? Car à l'etape n°1 il me semble que si ton projet existe tu le recupere directement.
Si le projet n'existe pas, l'étape 1 ne me renvoi rien, je passe donc à l'etape 2, puis à l'étape 3 pour récuperer l'identifiant du projet crée à l'étape 2

Effectivement si le projet existe, je ne passe pas par les etapes 2 et 3, je renvoi direct l'ID renvoyé par la requete de l'étape 1
bambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h46.


 
 
 
 
Partenaires

Hébergement Web