php实现班级通信录怎么导入csv文件_php导入csv到班级通信录方法【步骤】
技术百科
雪夜
发布时间:2026-01-27
浏览: 次 PHP读取CSV中文乱码需先确认编码(Excel导出常用GBK),再用mb_convert_encoding转UTF-8;fgetcsv解析时设行结束符为"\n"、长度为0,校验表头字段映射与别名,批量插入用事务+ON DUPLICATE KEY并建唯一索引。
PHP读取CSV文件时中文乱码怎么处理
直接用 fgetcsv() 读取 UTF-8 编码的 CSV(尤其 Excel 导出的),中文字段常变问号或方块。根本原因是 Windows 下 Excel 默认用 GBK/GB2312 保存 CSV,而 PHP 脚本通常按 UTF-8 解析。
- 先用
mb_detect_encoding()检查原始内容编码,但不可靠;更稳妥的是统一转码:读取后对每行字段用mb_convert_encoding($str, 'UTF-8', 'GBK') - 若 CSV 来自 Excel,导出时选「CSV UTF-8(逗号分隔)」格式,避免手动转码
- 用
file_get_contents()+str_getcsv()替代fgetcsv()可绕过 BOM 识别问题,再手动处理换行和引号
用fgetcsv()解析班级通信录CSV要注意哪些字段边界
fgetcsv() 对含换行符、逗号、双引号的字段容易切错行或截断,比如学生地址栏写了「北京市朝阳区,建国

- 必须传入第四个参数
"\n"明确行结束符,否则在 Mac/Linux 下可能读不全 - 第二参数设为
0(不限长度),避免长字段被截断 - 首行是表头时,用
fgetcsv($handle)先读一次跳过,再进循环 - 字段值含双引号必须成对出现且被包裹,如
"张三",""北京市朝阳区,建国路88号""—— 注意内部双引号要写两个
导入前如何校验CSV结构是否匹配班级通信录字段
不能假设用户上传的 CSV 一定有「姓名、学号、电话、班级」四列,顺序也可能错。硬编码索引(如 $row[0] 是姓名)会崩。
- 先读第一行,用
array_map('trim', $header)清理空格,再建立映射:$map = array_flip($header) - 检查关键字段是否存在:
isset($map['姓名']) && isset($map['学号']),缺失则中止并提示 - 允许别名:把
['姓名','名字','学生姓名']都映射到name字段,提升容错 - 学号建议用正则校验是否全数字或带字母前缀(如
/^[A-Za-z]{0,2}\d{6,10}$/),电话用preg_match('/^1[3-9]\d{9}$/', $phone)
批量插入数据库时如何避免超时和重复数据
一次导入 500 名学生,逐条 INSERT 不仅慢,还可能触发 PHP 的 max_execution_time 限制,且没做去重的话会把同个学号插多遍。
- 用事务包住整个导入:
$pdo->beginTransaction()→ 批量INSERT ... ON DUPLICATE KEY UPDATE→$pdo->commit() - 学号字段必须建唯一索引(
UNIQUE KEY `uk_student_id` (`student_id`)),否则ON DUPLICATE KEY不生效 - 单次
INSERT最多塞 500 行,太多会超 MySQL 的max_allowed_packet - 每处理 100 行调用一次
gc_collect_cycles(),防内存溢出
fgetcsv() 会返回 false 或空数组,不判空直接取字段就报 Undefined offset。加一句 if (empty($row)) continue; 能省掉大半调试时间。
# 的是
# 就会
# 太多
# excel
# 最多
# windows
# 北京市
# 朝阳区
# 要注意
# 一句
# 设为
# mac
# win
# linux
# 循环
# if
# 编码
# 中文乱码
# 数据库
# bom
# map
# php
# csv
# mysql
# undefined
# pdo
# continue
# csv文件
# 双引号
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python函数参数高级用法_默认值与可变参数解析
- Win11如何卸载OneDrive_Win11卸载
- 如何在Golang中理解指针比较_Golang地址
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- c++中的Tag Dispatching是什么_c
- GML (Geography Markup Lan
- Python函数接口稳定性_版本演进解析【指导】
- Mac版Final Cut Pro入门_Mac视频
- 如何使用Golang实现容器健康检查_监控和自动重
- Drupal 中渲染节点时出现 HTML 标签嵌套
- 如何使用Golang构建简易投票统计功能_Gola
- 如何在 Go 中比较自定义的数组类型(如 [20]
- php和redis连接超时怎么办_phpredis
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- 静态属性修改会影响所有实例吗_php作用域操作符下
- php485读数据时阻塞怎么办_php485非阻塞
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Win11怎么更改任务栏位置_修改注册表将Win1
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- php串口通信波特率怎么选_根据硬件手册设置正确波
- php能控制zigbee模块吗_php通过串口与c
- LINUX如何查看文件类型_Linux中file命
- Mac如何查看电池健康百分比_Mac系统信息电源检
- How to Properly Use NumPy
- Win11如何关闭游戏模式 Win11禁用Xbox
- Win11怎么查看wifi信号强度_检测Windo
- Win11怎么设置开机自动连接宽带_Windows
- Win11怎么设置快速访问主页_Windows11
- Win11怎么设置任务栏大小_Windows11注
- php接口返回数据乱码怎么办_php接口调试编码问
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11怎么更改任务栏颜色_Windows11个
- Win11视频默认播放器怎么改_Win11关联第三
- Win11怎么关闭系统推荐内容_Windows11
- Win11麦克风没声音怎么设置_Win11麦克风权
- 如何关闭Win10自动更新更新_Win10系统自动
- c++ try_emplace用法_c++ map
- VSC怎么配置PHP的Xdebug_远程调试设置步
- Go语言中正确反序列化多个同级XML元素为结构体切
- php485能和物联网模块通信吗_php485对接
- Win11输入法切换快捷键怎么改_Windows
- Windows10怎么用“讲述人”读屏辅助 Win
- Windows 11如何开启文件夹加密(EFS)_
- Win11怎么关闭通知消息_屏蔽Windows 1
- Win10怎样安装PPT模板_Win10安装PPT
- php中$this和::能混用吗_对象与静态作用域
- php订单日志怎么按金额排序_php按订单金额排序
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- c++ reinterpret_cast怎么用 c

QQ客服