You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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赋值时,两种情况会导致后续插入失败:
  1. 不存在对应用户名的客户,@cod_cli为null,若TRABALHO表的cod_cliente字段设置为非空,插入直接报错
  2. 存在多个重名的客户,子查询返回多个值,赋值直接报错
    同理查询cod_serv1的语句也有相同问题。
    临时排查方法:可以把你拼接好的完整SQL复制到数据库管理工具(比如phpMyAdmin)中手动执行,就能直接看到具体的错误提示,快速定位问题。
  • 额外建议:PHP层开启错误显示,避免漏看代码层面的报错,在代码最开头加入两行:
error_reporting(E_ALL);
ini_set('display_errors', 1);

另外你当前直接拼接用户输入到SQL的写法存在SQL注入风险,后续优化建议改用mysqli预处理语句绑定参数,避免安全问题。

内容的提问来源于stack exchange,提问作者Joel Junior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:45:07