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

PHP获取跨域XML时单条message返回null问题排查

问题原因与修复方案

问题根源

当XML仅包含1个<message>节点时,simplexml_load_file解析后转换为JSON的过程中,单个节点不会被自动包装为数组;而存在多个<message>节点时,会被处理为数组结构。

具体差异:

  • 多条message:$json['message']是元素为属性数组的索引数组,格式为[['@attributes' => ...], ['@attributes' => ...]]
  • 单条message:$json['message']直接是单个属性数组,格式为['@attributes' => ...]

你的代码中直接通过for循环遍历$json['message'],单条场景下count($json['message'])统计的是属性的数量,而$json['message'][$i]的下标访问不存在,最终赋值为null,导致返回异常。

修复方案

在解析JSON后,先判断$json['message']是否为索引数组(即是否存在多个节点),如果是单个节点,手动将其包装为数组,确保后续循环逻辑统一。

修改后的完整代码:

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Access-Control-Allow-Origin: *'); 
ini_set('user_agent','mflscripts');

if($_GET["type"]=="chat") {
    //REQUIRED PARAMETERS
    if(!isset($_GET['server_id'])) { echo json_encode(array()); die(); } else $server_id = $_GET['server_id'];
    if(!isset($_GET['league_id'])) { echo json_encode(array()); die(); } else $league_id = $_GET['league_id'];
    if(!isset($_GET['year'])) { echo json_encode(array()); die(); } else $year = $_GET['year'];
    //OPTIONAL PARAMETERS
    if(!isset($_GET['cookie'])) $cookie = ''; else $cookie = $_GET['cookie'];
    if(!isset($_GET['random'])) $random = ''; else $random = $_GET['random'];

    $url = 'ht'.'tps://www'.$server_id.'.myfantasyleague.com/fflnetdynamic'.$year.'/'.$league_id.'_chat.xml?MFL_USER_ID='.$cookie.'&random='.$random;
    $xml=simplexml_load_file($url) or die("Error: Cannot create object");
          
    $json_xml = json_encode($xml);
    $json = json_decode($json_xml,TRUE);
    $my_json = array();
    $my_json['messages'] = array();
    $my_json['messages']['message'] = array();

    // 关键修复:统一单条/多条message的数组结构
    if (!isset($json['message'][0])) {
        $json['message'] = [$json['message']];
    }

    for($i=0;$i<count($json['message']);$i++){
        $my_json['messages']['message'][$i] = $json['message'][$i]['@attributes'];
    }
    echo json_encode($my_json);
}
?>

验证效果

当读取单条message的XML时,修复后的代码会将单个属性数组包装为数组,循环正常执行,返回结果变为:

{"messages":{"message":[{"message":"asdf","franchise_id":"0000","id":"1661170418wng204","posted":"Mon Aug 22 8:13:38 a.m. ET 2022"}]}}

多条message的场景不受影响,依然正常返回预期的数组结构。


内容的提问来源于stack exchange,提问作者MShack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:36:17