我有一个名为products的数据库表,我试图在表中插入一个产品a,并在插入到表中后返回产品a的id。我的php代码如下:
public function save(Product $product) : int
{
$stmt = $this->conn->prepare(
"INSERT INTO products VALUES(null, ?, ?, ?, ?)"
);
$error = ! $stmt->execute([
$product->name,
$product->description,
$product->picturePath,
$product->userId,
]);
return $error ? -1 : $this->conn->lastInsertId('products.id');
}
我在考虑这个代码可能存在的问题,我想到的第一个问题是:如果客户请求在表中插入产品a,并且在我获得产品a的id之前,又请求插入产品b,我会获得产品b的id吗?对?如果没有,为什么不呢?
第二个问题是:如果我使用事务插入产品a并检索它的id,那么我会得到产品a的id吗?
3条答案
按热度按时间mf98qq941#
这个
lastInsertId()
值是每个连接维护的,因此如果有其他连接将数据插入到同一个表中,则不必担心这些问题;你的价值就是你的关系。如果使用成功的事务,然后回滚,则
lastInsertId()
仍将保留其价值。回滚不影响的当前值lastInsertId()
.utugiqy62#
你可以用一个
try
以及catch
并使用pdo begintransaction、commit和rollback函数。示例可以在php上详细介绍pdo:lastinsertid在我看来,应用良好的编码实践比一时兴起并希望得到最好的结果要好。:)
xtupzzrd3#
我认为您应该没事,因为在mysql中,它绑定到连接,请求应该使用相同的连接。其他请求可能同时递增表中的最高id,但它不应返回这些值。
它在mysql文档中解释得很好
对于最后一个\u insert \u id(),最近生成的id将按每个连接在服务器中进行维护。它不会被其他客户端更改。