无法使PHP lastInsertId()与此设置一起使用

时间:2018-12-23 09:05:17

标签: php mysql pdo last-insert-id

我一直在使用下面的方法连接到MySQL数据库以及现在如何查询它。与我在网上看到的许多示例相比,似乎设置有所不同。我似乎无法弄清楚如何使lastInsertId()与该设置一起使用:

define("DB_HOST", "localhost");
define("DB_NAME", "mydatabase");

$link = new DBLink("username", "password");

class DBLink {

  private $host = DB_HOST;
  private $dbname = DB_NAME;
  private $user;
  private $pass;

  private $dbConnection;
  private $error;

  private $sql;

  public function __construct($user, $pass) {

  $this->user = $user;
  $this->pass = $pass;

  $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
  $options = array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
      PDO::ATTR_EMULATE_PREPARES => false,
      PDO::ATTR_ERRMODE  => PDO::ERRMODE_EXCEPTION
    );

   try {
      $this->dbConnection = new PDO($dsn, $this->user, $this->pass, $options);
    }

    catch(PDOException $e){
      $this->error = $e->getMessage();
      echo $this->error;
    }
  }

public function query($query) {
  $this->sql = $this->dbConnection->prepare($query);
}

public function bind($param, $value) {
  $this->sql->bindParam($param, $value);
}

public function execute() {
  return $this->sql->execute();
}

然后我将像下面这样向数据库添加新行:

 $link->query("INSERT INTO users (username, phone, email)
 VALUES (:username, :phone, :email)");

 $link->bind(':username', $username);
 $link->bind(':phone', $phone);
 $link->bind(':email', $email);
 $link->execute();

添加一行后,我想获取插入到数据库中的行的ID。我尝试过:

$link->lastInsertId();

$link->$sql->lastInsertId();

编写一个单独的函数,然后在DBLink类中包含该函数:

$link->getLastID();

public function getLastID() {
   return $this->sql->lastInsertId();
}

其他疯狂的猜测,例如

 $this->dbConnection->lastInsertId();

我还使用insert_id而不是lastInsertId()尝试了上述所有变体,因为我在一些地方看到了推荐的结果。

还有其他一些事情,我已经浪费了大约3个小时。返回上次插入的ID似乎没有任何作用。我在网上看了很多示例,但是它们对数据库的查询都与我的查询有所不同。我相信lastInsertId()应该在PDO对象上,但我不确定该如何调用我的查询和数据库链接设置方法。有人可以帮忙吗?

编辑:可能是我没有正确设置MySQL数据库吗?该表的主键是id。相对于其他任何列,lastInsertId()是如何知道从哪个列获取“ id”的?

1 个答案:

答案 0 :(得分:1)

我认为我使用了类似的方法。在execute()中使用

public function execute() {
  $this->lastInsertID = null;
  $ret = $this->sql->execute();
  $this->lastInsertID = $this->dbConnection->lastInsertId();
  return $ret;
}

在类中定义一个变量

private $lastInsertID;

然后

public function getLastID() {
   return $this->lastInsertID;
}

这可确保在执行SQL之后立即检索到最后一个插入ID。