PHP表单提交数据未存入MySQL数据库无报错问题求助
问题根因&修复方案
硬编码业务主键导致主键冲突
你代码里写死了SET @orc = 4033997;,这个@orc是后续插入SERV_TRAB表的cod_trabalho字段值,作为主键/唯一键,只要你之前成功插入过一次该值的记录,后续插入都会触发唯一键冲突,事务直接回滚,数据自然无法写入。
修复方法:把SET @orc = 4033997;替换为SET @orc = 2951605;,直接获取刚插入TRABALHO表生成的自增主键值,避免重复。mysqli_multi_query的错误判断逻辑完全失效
mysqli_multi_query的返回值仅代表第一条SQL语句是否执行成功,后面的子查询、插入语句哪怕执行出错,只要第一条START TRANSACTION没报错,返回值依然是true,你代码判断返回值为真就直接跳转走了,根本不知道后面语句出错导致事务回滚了。
修复方法:要么放弃使用mysqli_multi_query,拆分单条SQL依次执行配合PHP层的事务控制,要么执行完多语句后遍历检查所有执行结果的错误信息:
// 执行完multi_query后加这段检查错误 do { if ($result = mysqli_store_result($conexao)) { mysqli_free_result($result); } } while (mysqli_next_result($conexao)); if (mysqli_error($conexao)) { echo "SQL错误:" . mysqli_error($conexao); exit; }
- 子查询返回空/多值导致插入失败
你用SELECT cod_cliente FROM CLIENTE WHERE nome_cliente = '$nome_cli'给@cod_cli赋值时,两种情况会导致后续插入失败:
- 不存在对应用户名的客户,@cod_cli为null,若TRABALHO表的cod_cliente字段设置为非空,插入直接报错
- 存在多个重名的客户,子查询返回多个值,赋值直接报错
同理查询cod_serv1的语句也有相同问题。
临时排查方法:可以把你拼接好的完整SQL复制到数据库管理工具(比如phpMyAdmin)中手动执行,就能直接看到具体的错误提示,快速定位问题。
- 额外建议:PHP层开启错误显示,避免漏看代码层面的报错,在代码最开头加入两行:
error_reporting(E_ALL); ini_set('display_errors', 1);
另外你当前直接拼接用户输入到SQL的写法存在SQL注入风险,后续优化建议改用mysqli预处理语句绑定参数,避免安全问题。
内容的提问来源于stack exchange,提问作者Joel Junior
相关产品推荐
相关产品推荐

