创建数据库表
首先我们需要创建存储用户数据的数据库表:
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中设置)
- 对数据进行严格的验证和过滤
- 处理可能的重复数据
- 使用事务确保数据一致性