php lastinsertid()在数据库类中返回0

nhaq1z21  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(271)

我正在尝试为sql查询创建数据库类。
我可以把基本的积垢东西,但当我添加一些数据库 lastInsertId() 返回0
mysql类中的db连接

public function connect() {
        return new PDO("mysql:host=$this->db_host;dbname=$this->db_name",
            $this->db_username,$this->db_password);
    }

数据库类中的save方法

public function save()
    {
        $values = [];
        $keys = [];
        $marks = [];

        foreach ($this->data as $key => $value) {
            array_push($keys, $key);
            array_push($marks, '?');
            array_push($values, $value);
            $this->__unset($key);
        }
        $keys = implode(',', $keys);
        $marks = implode(',', $marks);
        try {
            $query = $this->connect()->prepare("INSERT INTO $this->table ($keys) VALUES ($marks)");
            $query->execute($values);

            return $this->connect()->lastInsertId();
        } catch (PDOException $e) {
            return $e->getMessage();
        }
}

我正在使用这个类,它成功地将数据保存到数据库,但仍然返回0

$query = new Database('table');
$query->foo = "bar";
$data = $query->save();

echo $data;
// 0

我在这里错过了什么?我该怎么修?

tzxcd3kk

tzxcd3kk1#

每次调用时都会创建一个新的连接对象 connect ,因此需要将原始调用存储在变量中以便以后重用。见下表:

$query = $this->connect()->prepare("INSERT INTO $this->table ($keys) VALUES ($marks)");
$query->execute($values);
return $query->lastInsertId(); // Here, reuse the var, rather than create new

编辑-我错过了方法的链接。在这种情况下,将它们分开比较有利。见下表:

$query = 'SELECT....';
$db = $this->connect();
$stmt = $db->prepare($query);
// bind params here
$stmt->execute();
$lastId = $db->lastInsertId();

你得跑了 lastInsertId 而不是事先准备好的声明。

相关问题