PHP读取JSON文件填充班级通信录需用file_get_contents()配合json_decode($json, true)转关联数组,校验UTF-8编码、字段名一致性、空值处理及SQL安全绑定。

PHP 读取 JSON 文件并填充班级通信录数组
直接用 file_get_contents() 读取 JSON 文件,再用 json_decode() 转成 PHP 数组即可。注意默认返回对象,加第二个参数 true 才得关联数组,更适合后续遍历填表单或渲染列表。
- 确保 JSON 文件编码是 UTF-8(无 BOM),否则
json_last_error()可能返回JSON_ERROR_UTF8 - 路径写相对路径时,以当前执行脚本为基准,不是以 web 根目录为准,建议用
__DIR__ . '/data/contacts.json' - 必须检查
json_decode()返回值是否为null,再调用json_last_error()判断具体错误类型
JSON 数据结构要匹配通信录字段
如果通信录需要显示 name、student_id、phone、email,那 JSON 里对应字段名必须一致,且每条记录是关联数组(非索引数组嵌套)。常见翻车点:JSON 里写成 "stu_id" 或 "tel",PHP 侧却硬按 student_id 和 phone 取值,结果全为 null。
- 推荐在解析后做字段校验:
isset($item['name']) && isset($item['student_id']) - 允许空值但不允许缺失字段,可用
array_key_exists()区分null和未定义 - 手机号字段若含中文括号或短横线(如
"138-1234-5678"),需提前用preg_replace('/[^0-9]/', '', $phone)清洗
导入到 MySQL 前先过滤和转义
不能把原始 JSON 数据直接拼进 SQL。即使用了 PDO,也要对每个字段单独绑定参数,尤其 name 含中文或单引号时,不处理会报错或被注入。
- 姓名字段用
trim(htmlspecialchars($name, ENT_QUOTES, 'UTF-8'))防 XSS,入库前再用 PDO 绑定 - 学号建议设为字符串类型(不是 int),避免开头 0 被截断(如
"0023"→23) - 批量插入用
INSERT INTO ... VALUES (),(),()比循环单条INSERT快 5–10 倍,但要注意 MySQL 的max_allowed_packet限制
遇到 json_decode 返回 null 却没报错?检查换行和不可见字符
有些编辑器保存 JSON 时会在末尾加空行或零宽空格(U+200B),json_decode() 无法容忍,但 json_last_error() 可能返回 JSON_ERROR_SYNTAX 而非更具体的提示。
立即学习“PHP免费学习笔记(深入)”;
- 调试时先
echo htmlspecialchars(file_get_contents($path))看源码有没有异常符号 - 用
mb_detect_encoding($json, ['UTF-8', 'GB2312'], true)确认编码,再mb_convert_encoding()强制转 UTF-8 - 简单粗暴法:用
preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $json)清掉控制字符
class_name,而数据库表字段是 grade,这种映射关系必须显式声明,不能靠命名猜测。











