PHP报错:尝试访问null类型值的数组偏移量(index.php第21行)求助
问题排查与解决
报错原因分析
报错指向第21行$xxc= $zx["js"]["cmd"];,说明$zx本身是null,或者$zx["js"]是null,导致无法访问后续数组键"cmd"。而$zx是json_decode($response, true)的返回结果,出现null的核心原因有两个:
- curl请求失败,
$response为false; - 目标接口返回的内容不是有效JSON格式(比如错误页面、空字符串、非JSON文本)。
分步解决方法
1. 增加curl请求错误检测
在curl_exec后添加检查,确认请求是否成功:
$response = curl_exec($curl); // 检查curl请求是否出错 if(curl_errno($curl)) { echo 'Curl错误: ' . curl_error($curl); exit; } curl_close($curl);
2. 验证JSON解码有效性
在使用$zx前,先判断解码是否成功:
$zx = json_decode($response, true); // 检查JSON解码结果 if($zx === null) { // 输出原始响应,排查接口返回内容 echo '无效的JSON响应: ' . htmlspecialchars($response); exit; }
3. 安全访问嵌套数组键
避免直接链式访问数组,先逐层检查字段是否存在:
// 安全获取cmd内容 $xxc = ''; if(isset($zx["js"]) && isset($zx["js"]["cmd"])) { $xxc = $zx["js"]["cmd"]; } else { echo '响应中不存在js->cmd字段'; exit; }
4. 修复请求头的格式问题
注意到请求头里" Host: url.com"前面有多余空格,这可能导致请求异常,建议去掉空格:
"Host: url.com",
完整修改后的代码
<?php $curl = curl_init(); $url = "你的实际接口URL"; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( "Accept: */*", "Accept-Encoding: gzip, deflate, br", "Accept-Language: en-US,en;q=0.9", "Cookie: num=8888888; stb_lang=en; timezone=GMT", "Host: url.com", "User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C) AppleWebKit/533.3 (KHTML, like Gecko) MAG200 stbapp ver: 2 rev: 250 Safari/533.3", "Authorization: Bearer D0CF5357F55F39F7D3A1B907D13C7B16", ), )); $response = curl_exec($curl); // 检查curl请求错误 if(curl_errno($curl)) { die('Curl请求失败: ' . curl_error($curl)); } curl_close($curl); // 检查JSON解码结果 $zx = json_decode($response, true); if($zx === null) { die('接口返回无效JSON,原始响应: ' . htmlspecialchars($response)); } // 安全获取cmd字段 if(!isset($zx["js"]) || !isset($zx["js"]["cmd"])) { die('响应结构不符合预期,缺失js->cmd字段'); } $xxc = $zx["js"]["cmd"]; $regex = '/\b(http?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i'; preg_match_all($regex, $xxc, $matches); $urls = $matches[0]; // 跳转逻辑:原foreach只会生效第一个跳转,直接取第一个匹配URL即可 if(!empty($urls)) { header("Location: " . $urls[0]); exit; } else { echo '未匹配到任何URL'; } ?>
额外说明
- 原代码的
foreach($urls as $url)逻辑存在问题:发送第一个Location头后脚本会立即终止,不会执行后续循环,因此直接跳转第一个匹配的URL更合理。 - 之前能运行现在出错,大概率是目标接口的返回结构、认证令牌(Bearer)或请求规则发生了变化,通过输出
$response可以快速定位具体问题。
内容的提问来源于stack exchange,提问作者Legend Akshay
相关产品推荐
相关产品推荐

