无法让 PHP lastInsertId() 使用此设置

Posted

技术标签:

【中文标题】无法让 PHP lastInsertId() 使用此设置【英文标题】:Can't get PHP lastInsertId() to work with this setup 【发布时间】:2018-12-23 09:05:16 【问题描述】:

我一直在使用以下方法连接到 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”的吗?

【问题讨论】:

尝试用$link = $sql->lastInsertId(); 代替= 而不是-> 似乎不起作用 实际上 $id = $this->dbConnection->lastInsertId(); 是正确的方法,复制 ***.com/questions/10680943/… ,编程是谷歌搜索而不是猜测的艺术!!! 我收到此错误:未捕获的错误:不在对象上下文中使用 $this 谢谢,帮助我得到它,这个: public function execute() $ret = $this->sql->execute(); $this->lastInsertID = $this->dbConnection->lastInsertId();返回 $ret; 【参考方案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。

【讨论】:

我收到“调用未定义的方法 DBLink::lastInsertId()”堆栈跟踪:#0 /public_html/cms/cms/pages/create-page.php(21): DBLink->执行()。我以前经常遇到同样的错误。 也许我说错了。我会说: $lastid = $link->getLastID(); ? 知道了,谢谢!公共函数执行() $ret = $this->sql->execute(); $this->lastInsertID = $this->dbConnection->lastInsertId();返回 $ret; 正如你所指出的 - insertid 必须在连接上完成,我会更新答案。 非常感谢,我从来没有想过把它放在执行函数中。这令人沮丧!

以上是关于无法让 PHP lastInsertId() 使用此设置的主要内容,如果未能解决你的问题,请参考以下文章

使用左填充 PHP MYSQL 获取 lastInsertId

PDO LastInsertId 不返回任何内容

PHP OOP - 从两个函数返回 lastInsertId

PDO:lastInsertId 返回啥值? [复制]

LastInsertId PHP [关闭]

PDO lastinsertId 在事务中返回 0,php - 5.6