多用户向数据库存储待办/待购项报SQLSTATE[HY093错误如何解决
错误原因
- 你的INSERT预处理语句里定义了3个参数占位符
:items、:amount、:id,但你传入execute的$data1数组仅包含items和amount两个键,缺少:id对应的赋值,参数数量不匹配就触发了这个报错。 - 后续你调用
$data1['id']时也没有提前给这个字段赋值,这行代码还会报未定义数组键的警告,后续的SELECT查询也拿不到正确结果。
修复方案
方案1(推荐,id设为自增主键)
绝大多数待办表的id字段都会设置为自增主键,不需要手动插入,直接修改INSERT语句即可:
// 去掉SQL里的id字段和对应占位符 $STH = $DBH->prepare("INSERT INTO todoORtobuy (items, amount) VALUES (:items, :amount);"); $STH->execute($data1); // 插入完成后直接用lastInsertId拿刚生成的自增id,不需要额外写SELECT查询 $newId = $DBH->lastInsertId(); $_SESSION["startDate"] = $newId;
你可以直接删掉后面$data4到$tulos2的整段查询逻辑,没必要多执行一次查询。
方案2(需要手动传id的场景)
如果你确实需要手动指定id的值,就给$data1补上id的赋值:
$data1['items'] = $_POST['givenItems']; $data1['amount'] = $_POST['givenAmount']; $data1['id'] = "你要设置的id值"; // 补上这行即可
额外优化建议
建议给表单提交加判断,只有用户点了提交按钮再执行数据库写入逻辑,否则页面首次加载时$_POST为空,会报未定义数组键的警告:
if (isset($_POST['submitUser'])) { // 把你现有的try-catch代码放到这个判断里 }
内容的提问来源于stack exchange,提问作者Noorja
相关产品推荐
相关产品推荐

