PDO无法插入记录排查:incidents表数据无法写入数据库
先揪出最显眼的字段名不匹配问题:
你的表单里,事件描述的输入框name是descInput,但PHP代码里却用$_POST['incDesc']来接收——这俩名字完全对不上!PDO绑定的:incDesc对应这个不存在的$_POST['incDesc'],要么导致description字段插入空值(如果字段允许为空),要么直接触发插入失败。你需要把PHP里的$incDesc = $_POST['incDesc'];改成$incDesc = $_POST['descInput'];,或者把表单里textarea的name改成incDesc,两边保持一致。
接下来,你说没收到PDO错误提示,这大概率是因为PDO没开启错误异常模式。默认情况下PDO只会返回错误码但不抛出异常,所以哪怕插入失败你也看不到具体原因。建议在数据库连接完成后加上这段代码:
$dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
开启后一旦执行出错就会抛出异常,你就能立刻看到问题所在——比如日期格式不对、字段为空违反约束等等。
然后检查日期格式兼容性:数据库里的date字段是date类型,要求格式为YYYY-MM-DD,但你的表单用的是普通text输入框,用户输入的格式(比如DD/MM/YYYY)很可能不符合MySQL的要求,导致日期解析失败插入出错。你可以要么在前端验证日期格式,要么在PHP里转换格式:
// 假设用户输入是DD/MM/YYYY格式,转成MySQL支持的格式 $incDate = DateTime::createFromFormat('d/m/Y', $_POST['incDate'])->format('Y-m-d');
更简单的办法是把表单的input类型改成date,浏览器会自动生成符合格式的日期输入控件:
<input type="date" id="incDate" name="incDate">
另外,确认会话变量是否正常生效:虽然你说var_dump参数正常,但还是要检查$_SESSION['loggedStudent']['studentID']、$_SESSION['loggedStudent']['schoolID']、$_SESSION['loggedIn']['userID']这些变量是否真的存在且有有效值——比如PHP开头有没有加session_start();?如果会话没启动,这些变量会是空值,可能因字段非空约束导致插入失败。
最后提一句,你代码里有段完全多余且逻辑错误的代码:
$sqlfetch = 'SELECT * FROM students WHERE studentID = (SELECT MAX(studentID) from students)'; $sqlfetchexec = $dbconn -> prepare($sqlfetch); $sqlfetchexec -> execute(); $row = $sqlfetchexec->fetch(); $_SESSION['loggedStudent'] = $row;
你插入的是incidents表,这段代码却去查students表的最大studentID,和当前事件提交完全无关,还会覆盖原来的loggedStudent会话变量,建议直接删掉。
总结一下:先修复字段名不匹配的问题,再开启PDO异常模式,这样就能看到具体错误信息,剩下的问题就能快速解决了。
内容的提问来源于stack exchange,提问作者TerryHaggerty

