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

使用PHP将CSV文件数据导入MySQL数据库及脚本实现咨询

PHP实现CSV数据导入MySQL数据库(含动态轮次字段处理)

嘿,我来帮你梳理下完整的实现方案,尤其是你提到的动态生成的rownd1、rownd2这类轮次字段的处理~

一、核心需求回顾

你已经搭建了HTML上传页面,现在要完善PHP脚本,把CSV文件数据+用户选择的动态轮次字段,一起插入到eligilist数据库的placements表中。

二、分步实现及代码示例

1. 完善HTML上传页面(支持动态轮次添加)

确保表单支持文件上传,同时保留JS动态生成轮次选择框的逻辑:

<form method="post" enctype="multipart/form-data">
    <label>企业名称:</label>
    <input type="text" name="placename" required><br>
    
    <label>学历要求:</label>
    <input type="text" name="elig" required><br>
    
    <label>允许挂科数:</label>
    <input type="number" name="backlogs" required><br>
    
    <!-- 动态轮次选择框容器 -->
    <div id="rounds-container">
        <!-- JS会在这里动态添加<select name="rownd1">这类元素 -->
    </div>
    <button type="button" onclick="addNewRound()">添加轮次</button><br>
    
    <label>上传CSV文件:</label>
    <input type="file" name="csv_file" accept=".csv" required><br>
    
    <input type="submit" name="submit" value="导入数据">
</form>

<script>
let roundIndex = 1;
function addNewRound() {
    const container = document.getElementById('rounds-container');
    const select = document.createElement('select');
    select.name = `rownd${roundIndex}`;
    // 可根据实际需求自定义轮次选项
    select.innerHTML = `
        <option value="written">笔试</option>
        <option value="tech">技术面试</option>
        <option value="hr">HR面试</option>
    `;
    container.appendChild(select);
    roundIndex++;
}
</script>

2. PHP核心处理脚本(含动态字段收集+CSV解析)

这个脚本会处理文件上传、收集动态轮次数据、解析CSV并批量插入数据库:

<?php
require_once('dbconfig/config.php');

if(isset($_POST['submit'])) {
    // 1. 收集静态表单字段
    $name = mysqli_real_escape_string($conn, $_POST['placename']);
    $eligibility = mysqli_real_escape_string($conn, $_POST['elig']);
    $backlogs = mysqli_real_escape_string($conn, $_POST['backlogs']);

    // 2. 收集动态轮次字段(rownd1、rownd2...)
    $rounds = [];
    foreach($_POST as $key => $value) {
        // 匹配所有以rownd开头的字段
        if(substr($key, 0, 5) === 'rownd') {
            $rounds[] = mysqli_real_escape_string($conn, $value);
        }
    }
    // 把轮次转为逗号分隔的字符串(适配数据库VARCHAR字段,若需单独存储可改用关联表)
    $roundsStr = implode(',', $rounds);

    // 3. 处理CSV文件上传与解析
    if(isset($_FILES['csv_file']) && $_FILES['csv_file']['error'] === UPLOAD_ERR_OK) {
        $csvTmpPath = $_FILES['csv_file']['tmp_name'];
        $csvHandle = fopen($csvTmpPath, 'r');

        // 跳过CSV表头(如果你的CSV文件第一行是表头的话)
        fgetcsv($csvHandle);

        // 准备批量插入SQL
        $insertSql = "INSERT INTO placements (placename, elig, backlogs, rounds, csv_col1, csv_col2) VALUES ";
        $valueGroups = [];

        // 逐行解析CSV
        while(($csvRow = fgetcsv($csvHandle)) !== FALSE) {
            // 替换为你的CSV列对应数据库字段,比如csvRow[0]是CSV第一列数据
            $csvCol1 = mysqli_real_escape_string($conn, $csvRow[0]);
            $csvCol2 = mysqli_real_escape_string($conn, $csvRow[1]);
            
            // 组装单条插入值
            $valueGroups[] = "('$name', '$eligibility', '$backlogs', '$roundsStr', '$csvCol1', '$csvCol2')";
        }

        fclose($csvHandle);

        // 执行批量插入
        if(!empty($valueGroups)) {
            $insertSql .= implode(', ', $valueGroups);
            if(mysqli_query($conn, $insertSql)) {
                echo "数据导入成功!共插入 " . count($valueGroups) . " 条记录";
            } else {
                echo "导入失败:" . mysqli_error($conn);
            }
        } else {
            echo "CSV文件中没有有效数据";
        }
    } else {
        echo "文件上传失败,请检查文件是否合法";
    }
}
?>

3. 关键注意事项

  • 数据库表适配:确保placements表包含placename、elig、backlogs、rounds以及对应CSV数据的字段,rounds建议设为VARCHAR(255)类型;
  • 安全防护:用mysqli_real_escape_string转义所有用户输入,避免SQL注入;限制上传文件类型为.csv,并验证文件内容格式;
  • 编码兼容:如果CSV是GBK编码,可添加$csvRow = array_map('utf8_encode', $csvRow);转成UTF-8,避免数据库乱码;
  • CSV分隔符:如果你的CSV用分号或其他分隔符,需在fgetcsv中指定:fgetcsv($csvHandle, 0, ';')。

三、常见问题排查

  • 动态轮次字段未被获取:检查JS生成的select元素name属性是否正确,确保提交时这些字段在$_POST数组中;
  • CSV解析异常:确认CSV文件没有损坏,分隔符与代码中设置的一致;
  • 插入失败:查看MySQL错误信息,检查字段类型是否匹配(比如数字字段不能插入字符串值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:24:48