注意:undefined offset:1 in webservice/dispatcher.php line 36 in prestashop webservice

Notice: undefined offset:1 in webservice/dispatcher.php line 36 in prestashop webservice

我正在使用 prestashop webservice api 在 flutter 上构建应用程序。但是,当我尝试从 api url 获取数据时,我收到了 PHP 作为 "Notice: Undefined offset: 1 in /webservice/dispatcher.php on line 36" 通知和对象列表的响应。这使我无法将对象解码为 json.

我转到那个文件,错误在这个块内:(第 35、36、37 行)

if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
        list($name, $password) = explode(':', base64_decode($matches[1]));
        $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
}

当我尝试在 postman 或浏览器中获取结果时,根本没有显示通知。

任何人都可以帮助我如何摆脱这个通知或解码对象的任何解决方案?提前致谢

PHP 的 list 语法采用赋值运算符 = 的右侧,对其进行解构,然后将 children 赋给其中的变量。

像这样的列表语句:

list($name, $password) = $some_array;

期望 $some_array 是一个数值数组,其中至少包含 2 children。如果只有 1 个,PHP 会抱怨您缺少第 2 个项目(偏移量 1)。在您的情况下,explode 调用需要在您的 base64_decode 结果中有一个 : 冒号,但情况可能并非如此。

为防止这种情况发生,您可以对其进行修改,使其不直接解构 explode 调用的结果。像这样:

if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
        $name_and_password = explode(':', base64_decode($matches[1]));
        $name = $name_and_password[0] ?? ''; // if not set, default to be empty string ''
        $password = $name_and_password[1] ?? ''; // if not set, default to be empty string ''
        $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
}