使用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
相关产品推荐
相关产品推荐

