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

PHP处理表单数组生成的MySQL入库数据格式不符问题排查

问题原因
  • 前端表单提交的字段名统一带_行号后缀,最初处理$_POST时把每个键值对单独封装为独立数组,再用硬编码的固定值7做除数分块,完全不兼容1-10个动态项目的场景,项目数量变化时直接出现分块错位。
  • 后续解析字段时靠数组下标位置取值,没有按字段名匹配内容,只要项目列数变动,holiday、ill等固定字段的下标对应关系就会失效,还会把字段名后的行号后缀带到project字段值里。
  • 生成入库记录的逻辑没有做字段过滤:既没有去掉project字段名的行号后缀,也没有跳过空工时的无效项目记录,更没有区分项目工时、假期、病假三类不同记录的写入规则,最终输出的数据和表结构不匹配。
修复方案

直接替换原有表单处理和入库逻辑即可,全程按字段名做匹配,不依赖固定数组下标,兼容1-10个动态项目的场景:

// 第一步:按行号归组所有表单字段,替代原有的硬编码分块逻辑
$groupedRows = [];
foreach ($_POST as $field => $value) {
    // 匹配字段名和行号,格式统一为「字段名_行号」
    preg_match('/^(.+)_(\d+)$/', $field, $matchRes);
    if (!$matchRes) continue;
    $fieldName = $matchRes[1];
    $rowNum = (int)$matchRes[2];
    $groupedRows[$rowNum][$fieldName] = trim($value);
}

// 第二步:遍历每行数据,生成符合MySQL表结构的入库记录
$insertData = [];
foreach ($groupedRows as $row) {
    // 提取固定公共字段
    $currentDate = $row['day'] ?? '';
    $holidayVal = $row['holiday'] ?? '';
    $illVal = $row['ill'] ?? '';

    // 过滤出所有动态项目列,排除固定字段
    $projectList = array_filter(
        array_keys($row),
        fn($key) => !in_array($key, ['day', 'holiday', 'ill'])
    );

    // 遍历项目列,生成非空工时的入库记录
    foreach ($projectList as $projectName) {
        $workHours = $row[$projectName];
        if ($workHours === '') continue;
        $insertData[] = [
            'Date' => $currentDate,
            'project' => $projectName,
            'hours' => $workHours,
            'holiday' => '',
            'ill' => ''
        ];
    }

    // 单独处理假期、病假记录,值非空才生成对应入库行
    if ($holidayVal !== '') {
        $insertData[] = [
            'Date' => $currentDate,
            'project' => '',
            'hours' => '',
            'holiday' => $holidayVal,
            'ill' => ''
        ];
    }
    if ($illVal !== '') {
        $insertData[] = [
            'Date' => $currentDate,
            'project' => '',
            'hours' => '',
            'holiday' => '',
            'ill' => $illVal
        ];
    }
}

// 直接将结构化好的$insertData传入后续入库逻辑即可
$entryHandler = new Test\Hours\HoursEntry();
$entryHandler->hoursentry($insertData);

注意:如果业务要求同一日期下不管有多少个项目工时、假期/病假记录都合并为单行,可以根据实际需求调整记录合并规则,上述逻辑按「每条非空的项目工时、假期、病假记录单独占一行」的规则生成,和给出的目标入库样例完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:39:38