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

为何JSON.session返回值始终为0?会话检测异常求助

问题解决:前端始终收到session=0的问题

核心原因

  1. 未同步session字段值:当$_SESSION['id_armero']存在时,初始化的$result['session']一直保持默认值0,从未根据实际会话状态更新,导致前端拿到的会话状态始终错误。
  2. switch语法错误:代码中写了switch (isset($_GET['action'])),这会判断布尔值,永远匹配不上'getUser'这类字符串case,导致getUser的逻辑根本不会被执行。
  3. Header拼写错误:aplication/json应为application/json,可能导致浏览器无法正确识别响应格式。

修复方案

1. 修正switch判断逻辑

将switch (isset($_GET['action']))改为switch ($_GET['action']),确保接口动作能正确匹配对应的处理逻辑。

2. 同步session字段状态

  • 检测到$_SESSION['id_armero']存在时,立即将$result['session']设为1;
  • 用户登录成功时,同样设置$result['session'] = 1;
  • 注销会话后,将$result['session']设回0,保持状态一致。

3. 修正响应头拼写

把header('content-type: aplication/json; charset=utf-8')改为header('content-type: application/json; charset=utf-8')。

完整修复后的PHP代码

<?php
require_once('../entities/dto/armero.php');

if (isset($_GET['action'])) {
    
    session_start();

    $armero = new Armero;

    $result = array('status' => 0, 'session' => 0, 'message' => null, 'exception' => null, 'dataset' => null, 'username' => null);

    if (isset($_SESSION['id_armero'])) {
        // 标记会话已存在
        $result['session'] = 1;
        // 修复switch判断条件
        switch ($_GET['action']) {
            case 'getUser':
                if (isset($_SESSION['correo_armero'])) {
                    $result['status'] = 1;
                    $result['username'] = $_SESSION['correo_armero'];
                } else {
                    $result['exception'] = 'Alias de usuario indefinido';
                }
                break;
            case 'logOut':
                if (session_destroy()) {
                    $result['status'] = 1;
                    $result['message'] = 'Sesion eliminada correctamente';
                    // 注销后会话不存在
                    $result['session'] = 0;
                } else {
                    $result['exception'] = 'Ocurrio un problema al cerrar la sesion';
                }
                break;
            
            default:
                $result['exception'] = 'Acción no disponible dentro de la sesión';
        }
    } else {
        switch ($_GET['action']) {
            case 'readUsers':
                if ($armero->readAll()) {
                    $result['status'] = 1;
                    $result['message'] = 'Debe autenticarse para ingresar';
                } else {
                    $result['exception'] = 'debe crear un usuario para comenzar';
                }
                break;
            case 'signUp':
                $_POST = Validator::validateForm($_POST);
                if (!$armero->setNombre($_POST['nombre'])) {
                    $result['exception'] = 'Nombres incorrectos';
                } elseif (!$armero->setApellido($_POST['apellido'])) {
                    $result['exception'] = 'Apellidos incorrectos';
                } elseif (!$armero->setCorreo($_POST['email'])) {
                    $result['exception'] = 'Correo incorrecto';
                } elseif (!$armero->setTelefono($_POST['telefono'])) {
                    $result['exception'] = 'Alias incorrecto';
                } elseif ($_POST['codigo_ser'] != $_POST['confirmar']) {
                    $result['exception'] = 'Claves diferentes';
                } elseif (!$armero->setCodigo($_POST['codigo_ser'])) {
                    $result['exception'] = Validator::getPasswordError();
                } elseif ($armero->createRow()) {
                    $result['status'] = 1;
                    $result['message'] = 'Usuario registrado correctamente';
                } else {
                    $result['exception'] = Database::getException();
                }
                break;
            case 'logIn':
                $_POST = Validator::validateForm($_POST);
                if (!$armero->checkUser($_POST['email'])) {
                    $result['exception'] = 'Alias Incorrecto';
                } elseif ($armero->checkPassword($_POST['clave']) && $armero->checkState()) {
                    $result['status'] = 1;
                    $result['message'] = 'Autenticacion Correcta';
                    $_SESSION['id_armero'] = $armero->getId();
                    $_SESSION['correo_armero'] = $armero->getCorreo();
                    // 登录成功标记会话存在
                    $result['session'] = 1;
                } else {
                    $result['exception'] = 'Clave incorrecta o usuario no activo';
                }
                break;
            default:
                $result['exception'] = 'Acción no disponible fuera de la sesión';    
        }
    }
    // 修复Header拼写错误
    header('content-type: application/json; charset=utf-8');
    print(json_encode($result));
} else {
    print(json_encode('Recurso no disponible'));
}

验证修复

修改完成后,前端调用getUser接口时,若会话存在,JSON.session会返回1,前端的if (JSON.session)判断会正常进入hello分支,会话状态检测逻辑恢复正常。

内容的提问来源于stack exchange,提问作者Contreras Chiquillo Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:02:04