PHP lastInsertId()在Database类中返回0

时间:2018-04-10 20:16:07

标签: php mysql oop

我正在尝试为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);
    }

我在数据库类中的保存方法

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 

我在这里想念的是什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

每次调用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,而不是准备好的语句。