PHP插入含AUTO_INCREMENT字段的表失败问题及解决
解决MySQL自增字段插入失败的问题
嘿,作为过来人,我一眼就看出你遇到的问题啦——问题出在那个AUTO_INCREMENT的ScanID字段上!
问题根源
当字段设置为AUTO_INCREMENT时,数据库会自动为每一条新插入的记录生成唯一的递增ID。而你在原代码里显式地把ScanID加入了插入字段列表,还绑定了NULL值,这就干扰了数据库的自增逻辑,导致插入操作没有按预期执行。虽然理论上MySQL允许给自增字段传NULL来触发自增,但有时候配置或者写法细节会导致这个操作失效,更稳妥的方式是完全交给数据库处理。
原代码问题示例
<?php $xml=simplexml_load_file("someFile.xml"); $con =new PDO("mysql:host=localhost;dbname=testDB",'root',''); $ScanType="someType"; $start_date=$xml ->start_datetime; $end_date=$xml ->finish_datetime; $TargetTargetID="1"; $stmt=$con->prepare('insert into Scan(ScanID, ScanType, start_date, end_date, TargetTargetID) values (:ScanID, :ScanType, :start_date, :end_date, :TargetTargetID)'); $stmt->bindValue('ScanID',NULL); $stmt->bindValue('ScanType',$ScanType); $stmt->bindValue('start_date',$start_date); $stmt->bindValue('end_date',$end_date); $stmt->bindValue('TargetTargetID',$TargetTargetID); $stmt->execute(); $ScanID=$con->lastInsertId(); echo $ScanID; ?>
修复后的可行代码
你修改后的写法完全正确,就是在插入语句中去掉ScanID字段,让数据库自动生成这个值:
$stmt=$con->prepare('insert into Scan(ScanType, start_date, end_date, TargetTargetID) values (:ScanType, :start_date, :end_date, :TargetTargetID)'); $stmt->bindValue('ScanType',$ScanType); $stmt->bindValue('start_date',$start_date); $stmt->bindValue('end_date',$end_date); $stmt->bindValue('TargetTargetID',$TargetTargetID); $stmt->execute();
额外提示
如果你之后需要获取刚插入记录的自增ID,原代码里的$con->lastInsertId()是可以正常使用的,只要执行完execute()后调用它就行,不需要额外操作。
内容的提问来源于stack exchange,提问作者AzianGuy4inchD
相关产品推荐
相关产品推荐

