Bonjour.
Pour rappel, la méthode lastinsertId, est à utiliser juste après avoir inséré un enregistrement dans la table dans laquelle on veut récupérer l'id de cet enregistrement.
Par conséquent, il te faut faire quelque chose comme :
Bonjour à tous et à toutes,
Voila je rencontre un petit problème avec mon code.
Je développe actuellement une partie forums via la base du tuto MVC. L'architecture des forums est la suivante :
Model
ForumTable.php (Liste les forums)
TopicTable.php (Liste les sujets)
PostTable.php (Liste les messages)
Les requètes comportent bien évidément des jointures, mais là n'est pas le problème.
Un seul controller est utilisé pour le front, il se nomme bêtement ForumController.php
Ci dessous la partie pour ajouter un nouveau post dans un forum
La function lastInsertId() se trouve dans la classe MysqlDatabase (comme le tuto MVC)
Ce que je veux
Je souhaite récupérer le dernier ID entré en data
Ce que j'obtiens
Malheureusement et après plusieurs tentative (même bourrine, hein), la function me retourne toujours 0 mais toutes les autres données sont bien ajoutées.
Merci :)
13 réponses
Bonjour,
Juste comme ça en passant, ton champ id de la table topic est-il autoincrémental ? Dès fois on y pense, mais ne le met pas.
Merci pour vos réponses :)
Afin de facilité le debug, j'ai supprimé les deux autres requêtes et fait un var_dump de $lastTopicId.
@Ze Nerzhul : "topic_id" est bien en AI oui.
@Lartak : j'ai testé ta solution, mais ça me retourne Call to a member function lastInsertId() on boolean mais malgré cette fatal error, les données sont tout de même postées excepté les entrées avec lastInsertId(). Donc à priori, la requête est bonne.
Tu peux nous donner ta classe MysqlDatabase ( au moins les variables, le constructeur et la méthode "query"). Merci
Bonjour Carouge.
C'est celle du tuto MVC (ici-même), je ne l'ai pas touchée depuis sa création.
J'ai pas tout mis car elle est quand même assez longue.
il serait intéressant de voir l'objet Databse, parce que, c'est dans cette objet que ça se passe ;)
@plus
Pierre
Bonjour Pierre,
getPDO , ça vient d'ou ?
@plus
Pierre
la variable $this->Topic est initié comment ? Pourrais-tu nous fournir la class où se trouve la méthode "create()" ?
Pour moi, il y a un soucis d'instance, comme elle n'est pas identique, il n'arrive pas à récupérer la dernière insertion. Et par conséquent, la logique voudrait qu'il faille récupérer l'instance de "MysqlDatabase" utilisait par la méthode "create" dont je parle au dessus. Et à partir de là, faire ton lastInsertId().
Autre bizarrie new MysqlDatabase(App::getInstance()->getDb());Tu envois une instance à MysqlDatabase, là ou le constructeur semble demander un nom de base "$db_name".
Sans connaitre tout, un truc du genre App::getInstance()->getDb()->lastInsertId(); a une chance de fonctionner si l'instance est bien la même (et en considérant que getDb() renvoi une instance PDO).
Encore merci pour vos réponses :)
@Pierre : getPDO() est la connexion PDO dans MysqlDatabase (un oublie dans l'envoi du code).
@Kenor : $this->Topics renvoie vers le model/table forum_topics
L'instance était un test à l'arrache mais sans succés ^^
La classe "Table"
J'ai testé avec $lastTopicId = $this->db->lastInsertId(); mais ça me retourne Call to a member function lastInsertId() on null. Je comprend vraiment pas :(
Vu comme c'est organiser, il faudrait ajouter une méthode "lastInsertId" dans ta classe Table, qui se contenterai de faire return $this->db->lastInsertId(); (ou une méthode getDb() avec return $this->db;)
Et donc ensuite, pouvoir faire, $this->Topic->lastInsertId();
Après, tu devrais revoir un peu l'organisation de ton code et de tes héritages je pense.
Bonjour,
Un énorme merci Kenor, tu m'a sauvé sur ce coup. Je vais revisionner le cour sur les héritages est réorganiser tout ça :)