如何在PHP和MySQL的foreach循环中正确使用lastInsertId插入数据?
问题分析与解决方案
你的问题出在**lastInsertId()的调用位置**以及几处代码笔误上,我来帮你拆解和修正:
核心问题原因
PDO的lastInsertId()方法返回的是最近一次执行INSERT操作生成的自增ID,不管操作的是哪个表。你把它放在foreach循环内部,第一次插入table_b之后,这个方法返回的就不再是table_a的p_id(333),而是table_b的自增b_id(也就是1),所以第二条记录的p_id变成了1。
另外,你的代码里还有几处明显的变量名笔误:
- 准备
stmt_2时用了未定义的$query,应该是$query_2 - 绑定参数时写错了语句对象名:
$stm_2、$stm_2t、$stmr_2都是错误的,应该统一用$stmt_2
修正后的代码
把获取p_id的逻辑移到foreach循环外面,确保只获取一次table_a的插入ID,同时修正所有笔误:
$query_1 = "some_mysql_code_that_will_insert_data_to_table_a"; $stmt_1 = $this->conn->prepare($query_1); if($stmt_1->execute()){ // 关键:在循环外获取table_a的lastInsertId,只执行一次 $p_id = $this->conn->lastInsertId(); foreach($p_name AS $key => $value) { $query_2 = "INSERT INTO table_b SET p_id=:p_id, b_title = :b_title, b_genre = :b_genre"; // 修正:使用$query_2而非未定义的$query $stmt_2 = $this->conn->prepare($query_2); $b_title = $value; $b_genre = $b_genre[$key]; // 修正:统一使用正确的语句对象$stmt_2 $stmt_2->bindParam(':p_id', $p_id); $stmt_2->bindParam(':b_title', $b_title); $stmt_2->bindParam(':b_genre', $b_genre); $stmt_2->execute(); } }
这样修改后,两次插入table_b都会使用同一个p_id(333),就能得到你期望的结果了。
内容的提问来源于stack exchange,提问作者aaa28
相关产品推荐
相关产品推荐

