8721 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un problème avec PDO que je n'arrive malheureusement pas à résoudre...
Je souhaite récupérer le dernier ID d'une insertion en base de données mais voilà mon erreur :
Fatal error: Call to undefined method PDOStatement::lastInsertId() in C:\wamp\www\commande\panier.php on line 31

Voici la ligne 31 :
$commande_id = $requete->lastInsertId();

Et voici le code complet :

/On ajoute la commande dans la table commandes
                                $requete = $DB->insert('INSERT INTO commandes (date_commande, date_livraison, clients_id_clients) VALUES(NOW(), :date_livraison, :id_client)', array(
                                'date_livraison' => $date_livraison,
                                'id_client' => $_SESSION['id']));
                               
                       
                                //recuperation de l'id de la commande insérée
                                $commande_id = $requete->lastInsertId();


Voici également le contenu de ma classe DB :

class DB {
       
        private $host = 'localhost';
        private $username = 'root';
        private $password = '';
        private $database = 'schwoob';
        private $db;
       
        public function __construct($host = null, $username = null, $password = null, $database = null) {
                if($host != null) {
                        $this->host = $host;
                        $this->username = $username;
                        $this->password = $password;
                        $this->database = $database;
                }
               
                //Connexion à la BDD
                try {
                        $this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
                } catch(PDOException $e) {
                        die('<h1>Impossible de se connecter à la base de données</h1>');
                }
        }
       
        //Fonction query permettant d'executer facilement des requêtes préparées en fonction de paramètres
        public function query($sql, $data = array()) {
                $requete = $this->db->prepare($sql);
                $requete->execute($data);
                return $requete->fetchAll(PDO::FETCH_OBJ);
        }
        public function insert($sql, $data = array()) {
                $requete = $this->db->prepare($sql);
                $requete->execute($data);
                return $requete;
        }
}


J'ai essayé en mettant
$commande_id = $DB->lastInsertId();
mais ça ne change rien.
D'après ton code, à première vue, ça devrait plutôt être $this->db->lastInsertId();

Dans tous les cas lastInsertId est une méthode de la classe PDO, pas PDOStatement. Ca peut paraître illogique, mais c'est parce que sous couvert de cette fonction il y a une requête spéciale à part entière qui est envoyée à la base, un truc du style "select last_insert_id()". Au cas où tu n'aurais pas accès à la méthode, il te reste la possibilité d'exécuter ce select directement (tu peux rechercher le nom et la syntaxe exacte sur le manuel de ton SGBD; par contre évidemment tu perds l'interopérabilité de PDO)