我知道在运行直接查询时返回最后插入的ID很简单:
$query = $db->query("INSERT INTO site_stats (PageView) VALUES('1')");
if ($query) {
$id = $db->insert_id;
echo 'The ID is: '.$id;
}
但是,我正在通过一个类运行我的所有查询,这有助于我跟踪我正在执行的查询数量以及执行的时间。该课程简单明了:
class dbLog {
public $queries = array();
public function query($sql) {
global $db;
$start = microtime(true);
$query = $db->query($sql);
$this->queries[] = microtime(true) - $start;
return $query;
}
public function getCount() {
return sizeof($this->queries);
}
public function getTime() {
return number_format(array_sum($this->queries), 5);
}
} // end dbLog class
$dbLog = new dbLog;
问题是,当我通过这个类运行查询时,我无法弄清楚如何返回最后插入的ID:
$query = $dbLog->query("INSERT INTO site_stats (PageView) VALUES('1')");
if ($query) {
$id = $dbLog->insert_id;
echo 'The ID is: '.$id; // Returns error
}
我收到的错误是Undefined property: dbLog::$insert_id
如何获取最后插入的行的ID?
答案 0 :(得分:3)
由于您的班级仅使用全球范围内的$db
,因此您可以像原先一样使用$db->insert_id
。
要以正确的方式执行此操作,您需要实际将$db
对象包装在您自己的类/对象中,方法是从原始类扩展(继承)然后实例化您自己的类,或者通过实现您希望通过自己的类公开的方法,并将$db
提供给构造函数并在内部保留引用。
答案 1 :(得分:1)
您将mysqli
课程包装在另一个课程中(您还使用了global
,这并不理想)
您需要的是从实际的mysqli实例中获取ID的方法
public function getId() {
global $db;
return $db->insert_id;
}
如果我是你,我会使用依赖注入并使你的mysqli实例成为类本身的一部分
class dbLog {
/** @var \mysqli */
protected $db;
public function __construct(\mysqli $db) {
$this->db = $db;
}
public function query($sql) {
$start = microtime(true);
$query = $this->db->query($sql);
$this->queries[] = microtime(true) - $start;
return $query;
}
public function getId() {
return $this->db->insert_id;
}
}