PHP $_SESSION 变量未定义,使用 Slim


PHP $_SESSION variable undefined using Slim

我正在尝试使用 Slim 在 php 中设置会话变量。我希望将用户 id 存储为变量以在其他地方使用。我认为我的函数中的语法或顺序错误。

这是我设置变量的函数:

function loadAdmin()
{
    //Set new session and save user id to variable
    if (!isset($_SESSION)) {
        session_start();
    }
    $app          = 'Slim'Slim::getInstance();
    $token        = $app->request->headers->get('token');
    $token_exists = getToken_Validate();
    if($token_exists) {
        $sql = "SELECT id, title AS admin_title, last_name AS admin_last_name
                FROM admin WHERE token=:token";
        try {
            $db   = getDB();
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':token', $token);
            $stmt->execute();
            $admin = $stmt->fetchAll(PDO::FETCH_OBJ);
            $db    = null;
            echo json_encode($admin); 
            $_SESSION['uid'] = $stmt['id'];          
        } catch(PDOException $e) {
            echo '{"error":{"text":'. $e->getMessage() .'}}';
        }
    } else {
        echo '{"err": "failed"}';
    }
}

这是我在获取特定数据时使用变量的函数:

function loadDashboard() 
{
    session_start();    
    $uid = $_SESSION['uid'];
    $token_exists = getToken_Validate();
    if ($token_exists) {
        //Get number of rows from multiple tables
        $sql = "SELECT 
            (SELECT COUNT(*) FROM users WHERE id=:uid) AS total_students,
            (SELECT COUNT(*) FROM subjects) AS total_subjects,
            (SELECT COUNT(*) FROM notes) AS total_notes";
        try {
            $db = getDB();
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':uid', $uid);
            $stmt->execute();
            $users = $stmt->fetchAll(PDO::FETCH_OBJ);
            $db = null;
            echo json_encode($users);
        } catch(PDOException $e) {
            echo '{"error":{"text":'. $e->getMessage() .'}}';
        }
    } else {
        echo '{"err": "failed"}';
    }
}

尝试加载仪表板后我得到的苗条错误是:

未定义的索引:uid

对不起,如果我的PHP很糟糕,任何帮助不胜感激。

事实证明,这与斯利姆无关。

$_SESSION['uid'] = $stmt['id'];没有向变量存储任何内容。

我必须首先将 id 列绑定到一个变量:

$stmt->bindColumn('id', $uid);

然后我可以将该变量设置为会话变量:

$_SESSION['uid'] = $uid;

这是完整的工作功能:

function loadAdmin() 
{
    if (!isset($_SESSION)) {
        session_start();
    }
    $app            = 'Slim'Slim::getInstance();
    $token          = $app->request->headers->get('token');
    $token_exists   = getToken_Validate();
    if($token_exists) {
        $sql = "SELECT 
        id,
        title AS admin_title, 
        last_name AS admin_last_name 
        FROM admin WHERE token=:token";
        try {
            $db     = getDB();
            $stmt   = $db->prepare($sql);
            $stmt->bindValue(':token', $token);
            $stmt->execute();
            $stmt->bindColumn('id', $uid);
            $admin  = $stmt->fetchAll(PDO::FETCH_OBJ);
            $db     = null;
            $_SESSION['uid'] = $uid;            
            echo json_encode($admin);
        }
        catch(PDOException $e) {
            echo '{"error":{"text":'. $e->getMessage() .'}}';
        }
    }
    else {
      echo '{"err": "failed"}';
    }
}