创建数据库表
首先我们需要创建存储用户数据的数据库表:
CREATE TABLE users (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
age INT(3),
registration_date DATE
);
文件上传表单
创建一个简单的HTML表单用于上传CSV文件:
PHP处理逻辑
下面是完整的CSV导入处理代码:
<?php
// 数据库配置
$host = 'localhost';
$dbname = 'testdb';
$username = 'root';
$password = '';
// 连接数据库
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
if(isset($_POST['submit'])) {
// 文件上传检查
if(isset($_FILES['csvFile']) && $_FILES['csvFile']['error'] == UPLOAD_ERR_OK) {
$fileType = pathinfo($_FILES['csvFile']['name'], PATHINFO_EXTENSION);
// 验证文件类型
if(strtolower($fileType) != 'csv') {
$error = "请上传CSV格式的文件";
} else {
// 打开上传的文件
$file = fopen($_FILES['csvFile']['tmp_name'], 'r');
// 跳过标题行
fgetcsv($file);
// 准备SQL语句
$stmt = $pdo->prepare("INSERT INTO users (name, email, age, registration_date) VALUES (?, ?, ?, ?)");
$successCount = 0;
$errorCount = 0;
$errors = [];
// 逐行处理数据
while(($row = fgetcsv($file)) !== false) {
// 验证数据完整性
if(count($row) execute([$name, $email, $age, $date]);
$successCount++;
} catch(PDOException $e) {
$errors[] = "数据库错误: " . $e->getMessage() . " - 数据: " . implode(',', $row);
$errorCount++;
}
}
fclose($file);
// 显示导入结果
echo "<div class='result'>";
echo "<h3>导入完成!</h3>";
echo "<p>成功导入: <strong>$successCount</strong> 条记录</p>";
echo "<p>失败: <strong>$errorCount</strong> 条记录</p>";
if(!empty($errors)) {
echo "<h4>错误详情:</h4>";
echo "<ul>";
foreach($errors as $error) {
echo "<li>$error</li>";
}
echo "</ul>";
}
echo "</div>";
}
} else {
$error = "请选择要上传的文件";
}
if(isset($error)) {
echo "<div class='error'>$error</div>";
}
}
?>
CSV文件示例
以下是一个符合要求的CSV文件格式:
| 姓名 | 邮箱 | 年龄 | 注册日期 |
|---|---|---|---|
| 张三 | zhangsan@example.com | 28 | 2023-01-15 |
| 李四 | lisi@example.com | 32 | 2023-02-20 |
| 王五 | wangwu@example.com | 25 | 2023-03-10 |
最佳实践与安全建议
- 始终验证文件类型和内容
- 使用预处理语句防止SQL注入
- 限制上传文件大小(php.ini中设置)
- 对数据进行严格的验证和过滤
- 处理可能的重复数据
- 使用事务确保数据一致性

