PHP开发FCM推送时数据库register_id字段存入{符号异常
FCM推送功能register_id字段仅存储
{符号问题排查 核心错误原因
问题来自对json_encode()返回值的错误使用,逻辑链路如下:
- 代码中
$register = json_encode($data['registrationId']);执行后,$register是JSON格式的字符串类型,不是可按键访问的PHP关联数组 - 后续赋值时写的
$register['token']属于对字符串类型使用非数字键访问,PHP会自动将字符串键名token隐式转换为整数0,最终取到字符串索引为0的第一个字符,也就是JSON串开头的{,这就是数据库中仅存入单个{的直接原因。
可以用最小代码复现这个现象:
// 复现逻辑 $jsonStr = '{"token":"test_fcm_token"}'; var_dump($jsonStr['token']); // 输出结果为 string(1) "{",和你遇到的存储异常完全一致
修复方案
二选一即可,核心是不要对JSON字符串直接用数组键取值:
- 方案1(推荐,逻辑最简):去掉多余的encode步骤,直接从原始POST数组取值
// 删除无意义的提前json_encode逻辑,直接读取原始请求数组字段 $fcm = array( 'register_id' => $data['registrationId']['token'], 'platform' => $data['device']['platform'], 'version' => $data['device']['version'], 'uuid' => $data['device']['uuid'], 'model' => $data['device']['model'], 'manufacturer' => $data['device']['manufacturer'], 'app_version' => $data['app_version'], 'added_at' => date('Y-m-d H:i:s'), );
- 方案2:如果确实需要提前把
registrationId转成JSON字符串做其他处理,取值前先把JSON解码为PHP数组
$register = json_encode($data['registrationId']); // 解码为关联数组后再访问内部字段 $registerArr = json_decode($register, true); $fcm = array( 'register_id' => $registerArr['token'], // 其余字段和原有逻辑一致 );
额外优化提示
从你打印的请求参数看,当前POST payload中没有device层级的字段,代码中直接访问$data['device']['platform']等字段会触发Undefined array key警告,建议后续增加字段存在性校验,避免产生其他非预期运行异常。
内容的提问来源于stack exchange,提问作者Pella Post
相关产品推荐
相关产品推荐

