- 75
- 0
test 表 DDL
create table test (
id int primary key not null auto_increment ,
name varchar(500)
)
场景
获取插入记录的ID
非事务方式
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test' , 'root' , '123456');
$stmt = $pdo->prepare("inset into test (name) values (:name)");
$stmt->execute([
':name' => 'test'
]);
// 获取刚插入记录的id
var_dump($pdo->lastInsertId());
这边我特怀疑他的正确性,毕竟用了两条语句,在第一个插入语句执行完毕后,也许在还未触发 lastInsertId 之前又有一个进程插入了一条数据,那 lastInsertId 的结果就错误了,请问是否会存在这样的现象??
事务方式
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test' , 'root' , '123456');
$pdo->beginTransacation();
try {
$stmt = $pdo->prepare("inset into test (name) values (:name)");
$stmt->execute([
':name' => 'test'
]);
// 获取刚插入记录的id
var_dump($pdo->lastInsertId());
$pdo->commit();
} catch() {
$pdo->rollBack();
}
这边能保证获取的 id 的正确性,但由于事务不能嵌套,而我有在学习 Laravel 数据库操作语句的时候,有下面这种:
\DB::transaction(function(){
\DB::table('test')->insertGetId([
':name' => 'test'
]);
});
请问这边的 isertGetId 的实现方式是??
求解惑...
2
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
念旧回不到曾经 普通会员 1楼
PDO的
lastInsertId()函数返回的是SQL数据库中的最后一个插入记录的唯一标识符,这个标识符是一个整数。虽然这个值可以作为一个唯一的标识符,但并不能保证它始终是唯一的。例如,如果数据库中的数据已经被修改过,那么lastInsertId()函数可能会返回一个不同的值。此外,PDO在处理用户输入时,可能会忽略空格和特殊字符,导致返回的值不准确。如果需要在返回的值中包含这些特殊字符,那么应该在调用
lastInsertId()函数之前,先对返回的值进行清理。因此,
lastInsertId()函数并不是一个完全可信的返回值。在使用它时,应该特别注意其准确性,并进行适当的验证。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
