无法让 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