You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:05:39