在开发班级通信录系统时,我们常常需要将Excel或者CSV格式存储的通信录数据批量导入到mysql数据库中,方便后续进行数据的查询、修改和删除操作。php作为常用的后端开发语言,提供了多种方式实现数据导入mysql的功能,下面我们就一步步介绍具体的实现方法。

一、准备工作
1. 数据库与数据表创建
首先需要在mysql中创建一个用于存储班级通信录的数据库和数据表,假设我们创建的数据库名为class_directory,数据表student_contact的结构如下:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS class_directory DEFAULT CHARSET utf8mb4;
USE class_directory;
-- 创建通信录数据表
CREATE TABLE IF NOT EXISTS student_contact (
id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50) NOT NULL COMMENT '学生姓名',
student_id VARCHAR(20) NOT NULL UNIQUE COMMENT '学号',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱',
class_name VARCHAR(50) COMMENT '班级名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 准备待导入的数据文件
这里我们以CSV格式的数据文件为例,CSV文件相比Excel文件更容易被php解析,不需要依赖额外的扩展。假设我们的CSV文件名为contact_list.csv,内容格式如下:
学生姓名,学号,联系电话,邮箱,班级名称 张三,20230101,13800138000,zhangsan@ipipp.com,高三一班 李四,20230102,13900139000,lisi@ipipp.com,高三一班 王五,20230103,13700137000,wangwu@ipipp.com,高三二班
二、php连接mysql数据库
使用php的mysqli扩展连接mysql数据库,确保数据库的连接参数正确,避免连接失败的问题。
<?php
// 数据库配置参数
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = 'root';
$db_name = 'class_directory';
// 创建数据库连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
// 检查连接是否成功
if ($conn->connect_error) {
die('数据库连接失败:' . $conn->connect_error);
}
// 设置字符集为utf8mb4,避免中文乱码
$conn->set_charset('utf8mb4');
?>
三、解析CSV文件并导入数据
1. 读取并解析CSV文件
使用php的fopen和fgetcsv函数读取CSV文件内容,逐行解析数据,同时跳过表头行。
<?php
// 引入数据库连接文件
require_once 'db_connect.php';
$csv_file = 'contact_list.csv';
// 打开CSV文件
$handle = fopen($csv_file, 'r');
if (!$handle) {
die('无法打开CSV文件');
}
// 跳过第一行表头
fgetcsv($handle);
// 存储解析后的数据
$contact_data = [];
// 逐行读取CSV内容
while (($row = fgetcsv($handle)) !== false) {
// 过滤空行
if (empty($row[0])) {
continue;
}
$contact_data[] = [
'student_name' => $row[0],
'student_id' => $row[1],
'phone' => $row[2],
'email' => $row[3],
'class_name' => $row[4]
];
}
// 关闭文件句柄
fclose($handle);
?>
2. 批量插入数据到mysql
为了提高入库效率,我们采用批量插入的方式,而不是逐条插入,同时添加事务处理,避免部分数据插入失败导致的数据不一致问题。
<?php
// 开启事务
$conn->begin_transaction();
try {
// 构造批量插入的SQL语句
$sql = 'INSERT INTO student_contact (student_name, student_id, phone, email, class_name) VALUES ';
$value_parts = [];
$params = [];
$types = '';
foreach ($contact_data as $item) {
$value_parts[] = '(?, ?, ?, ?, ?)';
$params[] = $item['student_name'];
$params[] = $item['student_id'];
$params[] = $item['phone'];
$params[] = $item['email'];
$params[] = $item['class_name'];
$types .= 'sssss';
}
$sql .= implode(',', $value_parts);
// 准备预处理语句
$stmt = $conn->prepare($sql);
if (!$stmt) {
throw new Exception('SQL语句准备失败:' . $conn->error);
}
// 绑定参数
$stmt->bind_param($types, ...$params);
// 执行插入操作
if ($stmt->execute()) {
// 提交事务
$conn->commit();
echo '数据导入成功,共导入' . count($contact_data) . '条数据';
} else {
throw new Exception('数据插入失败:' . $stmt->error);
}
// 关闭预处理语句
$stmt->close();
} catch (Exception $e) {
// 回滚事务
$conn->rollback();
echo '数据导入失败:' . $e->getMessage();
}
// 关闭数据库连接
$conn->close();
?>
四、常见问题与解决方法
- 中文乱码问题:确保数据库、数据表、php连接数据库时的字符集都设置为utf8mb4,同时CSV文件保存时也选择utf8编码。
- 数据重复问题:可以在插入前先查询学号是否已经存在,或者给学号字段添加唯一索引,插入时忽略重复数据,使用
INSERT IGNORE语句即可。 - 大文件导入超时问题:如果CSV文件数据量很大,可以分批次读取文件并插入,避免php执行超时,也可以修改php.ini中的
max_execution_time参数延长执行时间。
五、总结
以上就是php实现班级通信录数据导入mysql的完整步骤,核心流程包括准备数据库和数据文件、连接数据库、解析数据文件、批量插入数据,同时需要注意字符集设置、事务处理等细节,避免常见的导入错误。开发者可以根据自己的实际需求调整数据表结构和数据解析逻辑,快速实现对应的导入功能。