Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
voilà mon petit souci...
J'ai une table "doc" (id_doc, titre, auteur), clé primaire id_doc de type serial,
et une table "moclé" (id_doc, moclé), clé primaire id_doc (integer) + moclé.
Pour remplir la table moclé, j'ai besoin de récupérer l'id_doc du dernier objet enregistré.
J'ai essayé les 3 méthodes que j'ai trouvé sur le net :
$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ('$titre', '$auteur') RETURNING id_doc");
$insert = pg_query("INSERT INTO moclé (id_doc, moclé) VALUES ($sql, $moclé)");
> La requête $sql échoue.
pg_query("INSERT INTO moclé (id_doc, moclé) VALUES (currval(doc_id_doc_seq), $moclé)");
> Pareil, la requête échoue.
$sql = pg_query("SELECT * FROM doc ORDER BY 'id_doc' DESC 1");
$insert = pg_query("INSERT INTO moclé (id_doc, moclé) VALUES (", $sql['id_doc'], "$moclé)");
> Rien ne se passe, la requête est acceptée mais ne renvoie rien.
Si je trie par titre, par contre (ORDER BY 'titre_doc'), ça marche, et je peux récupérer l'ID du document correspondant.
Sauf que le dernier titre ne correspond pas forcément au dernier enregistrement...
Je précise que j'ai essayé en restant connectée à la BD, et en déconnectant et reconnectant entre les 2 étapes (sauf pour le RETURNING).
Est-ce que quelqu'un aurait une correction ou une autre requête à proposer ?
amélie
Hors ligne
c'est titre, ou titre_doc, le nom de la colonne?
Sinon, quelle sont les erreurs que vous obtenez? (je ne comprends pas ce que veut dire "la requête échoue")
Hors ligne
C'est normal que les pg_query avec RETURNING échouent: cette méthode n'est pas capable de récupérer des enregistrements. Il faut effectuer un pg_fetch_row derrière le pg_query, pour récupérer l'enregistrement retourné.
Marc.
Hors ligne
Le nom de la colonne c'est titre_doc, j'ai voulu simplifier pour l'exemple...
Et quand je dis que la requête échoue, c'est en vérifiant avec
if (!$sql) { echo "erreur"; }
Hors ligne
J'ai essayé le pg_fetch_row après le returning.
Mais...
$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING titre_doc");
if (!sql) { echo "erreur"; }
$lire = pg_fetch_row($sql);
echo "Titre = $lire[0]";
Ca affiche bien le titre du doc enregistré, par contre
$sql = pg_query("INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING id_doc");
if (!sql) { echo "erreur"; }
$lire = pg_fetch_row($sql);
echo "Id = $lire[0]";
Ca m'affiche "erreur".
Y a-t-il une méthode pour avoir un message d'erreur détaillé ?
Hors ligne
Pouvez-vous essayer d'exécuter l'INSERT RETURNING id_doc dans une session psql ?
Marc.
Hors ligne
Dans une session psql, j'obtiens
"ERREUR : la colonne "id_doc" n'existe pas".
Hors ligne
Êtes-vous vraiment sûre d'avoir une colonne id_doc dans la table doc ?
Pouvez-vous, toujours dans psql, exécuter:
\d doc
?
Marc.
Hors ligne
Oui oui, \d doc me liste bien toutes les colonnes :
Table « public.doc »
Colonne | Type | Modificateurs
--------------+-----------------------------+------------------------------------------------------------------
Id_doc | integer | non NULL Par défaut, nextval('"documents_Id_doc_seq"'::regclass)
auteur | text | non NULL
titre_doc | character varying(200) | non NULL
Index :
"documents_pkey" PRIMARY KEY, btree ("Id_doc")
Hors ligne
Vous avez un I majuscule au nom de la colonne. PostgreSQL passe tout en minuscule, sauf si, explicitement, vous mettez les nom des objets entre " ".
INSERT INTO doc (titre_doc, auteur) VALUES ($titre, $auteur) RETURNING "Id_doc" devrait marcher. Mais je vous recommande plutôt de changer le nom de la colonne et de vous débarrasser de ce I majuscule.
Dernière modification par Marc Cousin (08/06/2011 14:17:14)
Marc.
Hors ligne
En effet,
dans ma table la colonne s'appelait "Id_doc", et pour l'exemple je l'avais remplacé par "id_doc"... sans penser que ça pouvait avoir une influence, puisque je faisais attention à bien mettre la majuscule partout dans mon script ! Encore une erreur bête de débutante...
Bon, du coup j'ai enlevé toutes les majuscules de mes noms de champs, et maintenant le RETURNING + pg_fetch_row ça marche !
Merci beaucoup,
amélie
Hors ligne
Pages : 1