我正在尝试为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
我在这里想念的是什么?我该如何解决这个问题?
答案 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
,而不是准备好的语句。