Bonjour,

J'ai un petit probléme avec mon code quand jutilise $topic_id = $this->db->lastInsertId(); sela me donne cette erreur la faireFatal error: Call to undefined method Database::lastInsertId()

    class auth {

        private $db;

        public function __construct($db) {

            $this->db = $db;

        }

        public function register($username, $email, $password) {

            $password = password_hash($password, PASSWORD_BCRYPT);
            $this->db->query('INSERT INTO users SET username = ?, email = ?, password = ?, date_time = NOW()', [$username, $email, $password]);
            $id = $this->db->lastInsertId();
        }

6 réponses


SLK
Réponse acceptée

Salut,

normalement, lastInsertId() est une méthode de PDO :
PDO::lastInsertId()
or dans ton message d'erreur, on voit :
Database::lastInsertId()
Donc $this->db à été initialisé depuis ta classe Database, au lieu de la classe d'origine PDO.
Et apparemment (vu le message d'erreur) ta classe Database n'a pas de fonction lastInsertId()

C'est un peu étrange de voir un attribut "pdo" dans une classe "Auth".
Tu devrais mettre cet attribut dans ta classe "Database".
Et dans cette classe "Database", tu met une fonction getPDO(), dans ce genre :

// classe Database

...

private $pdo;

...

public function getPDO()
{
    if ($this->pdo === NULL)
    {
        // modifie la ligne ci-dessous pour correspondre à ton code
        $pdo = new PDO($this->db_type . ':dbname=' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass);
        $pdo->exec("SET CHARACTER SET utf8");
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $this->pdo = $pdo;
    }

    return $this->pdo;
}

Et tu t'en sert quand tu as besoin d'envoyer ton $pdo à une autre fonction.

kwik
Réponse acceptée

Il te manques la fonction lastInsertId()

public function lastInsertId() {
        return $this->pdo->lastInsertId();
    }

je crois que tu a une erreur dans ta query ya pas le password = ?

    public function register($username, $email, $password) {
            $password = password_hash($password, PASSWORD_BCRYPT);
            $this->db->query('INSERT INTO topic SET name = ?, messages = ?, password = ?, date_time = NOW()', [$username, $email, $password,]);
            $id = $this->db->lastInsertId();
        }
Motel
Auteur

Salut skank,

voici le bon code le précédent n'était pas bon et dans le query() il y à bien le password = ?

public function register($username, $email, $password) {

            $password = password_hash($password, PASSWORD_BCRYPT);
            $this->db->query('INSERT INTO users SET username = ?, email = ?, password = ?, date_time = NOW()', [$username, $email, $password]);
            $id = $this->db->lastInsertId();
        }

mais j'ai toujours le code d'erreurFatal error: Call to undefined method Database::lastInsertId()

Motel
Auteur

Salut,

Voilà le code de la class Database

class Database {

        private $pdo;

        public function __construct($type, $login, $password, $database, $host) {

            $this->pdo = new PDO("$type:dbname=$database;host=$host;charset=utf8", $login, $password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

        }

    }
Motel
Auteur

Merci beaucoup, j'ai réussi à régler mon probléme :)