PHP数据库插入后主键获取失败:关联表外键赋值出错求助
问题分析与解决方案
原代码的核心问题
query()方法误用:$last_id->query()是错误操作,prepare()返回的PDOStatement对象需用execute()执行,不能直接调用query()。- 并发不安全的ID获取逻辑:用
SELECT MAX(id)取最新ID,多用户同时插入时会拿到其他用户的ID,导致数据关联错误。 lastInsertId()调用错误:注释里的$plant_check_id->lastInsertId()对象使用错误,lastInsertId()是PDO连接对象(或PDOStatement对象)的方法,需在插入语句执行后直接调用。
修正后的代码
// 创建新的plant_readings记录 $new_plant_reading = $connection->prepare(" INSERT INTO plant_readings (time_of_day) VALUES (:time_of_day) "); // 执行插入操作 $new_plant_reading->execute([ ':time_of_day' => $_POST["time_of_day"] ]); // 直接通过PDO连接获取刚插入的自增ID(并发安全) $plant_reading_id = $connection->lastInsertId(); // 插入compressor_readings记录,使用获取到的外键ID $statement = $connection->prepare(" INSERT INTO compressor_readings (suction, discharge, oil_pressure, oil_temperature, water_temperature, compressor_id, plant_readings_id) VALUES (:s, :d, :op, :ot, :wt, :cid, :pid) "); $result = $statement->execute([ ':s' => $_POST["suction1"], ':d' => $_POST["discharge1"], ':op' => $_POST["oil_pressure1"], ':ot' => $_POST["oil_temperature1"], ':wt' => $_POST["water_temperature1"], ':cid' => 1, ':pid' => $plant_reading_id ]);
关键注意事项
- 确保
plant_readings表的id字段是自增主键:MySQL中设置为AUTO_INCREMENT,PostgreSQL中需对应主键序列。 lastInsertId()必须在插入语句execute()之后立即调用,它基于当前PDO连接,不会受其他连接的插入操作影响,是并发安全的。- 若使用PostgreSQL,可能需要指定序列名,例如
$connection->lastInsertId('plant_readings_id_seq'),序列名需与表的主键序列一致。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

