PHP-如何从类中的mysqli查询中获取最后一个插入的ID

时间:2015-08-13 19:04:36

标签: php

我知道在运行直接查询时返回最后插入的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?

2 个答案:

答案 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;
   }
}