2016-02-17 83 views
1

我想在使用Slim的php中設置會話變量。我希望將用戶標識存儲爲其他地方使用的變量。我認爲我的函數中有語法或順序錯誤。

這裏是我的功能設置變量:

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"}'; 
    } 
} 

苗條的錯誤嘗試後,我得到loadDashboard是:

未定義的索引:uid

對不起,如果我的PHP是可怕的,任何幫助表示讚賞。

+0

所以它告訴我uid還沒有設置。在將其分配給變量(在使用之前)之前,您需要檢查它是否存在。如果不存在,則需要運行該過程以首先進行設置。 – smozgur

+0

你是否試圖用'var_dump()'檢查'$ _SESSION'?您也可以考慮採用[Slim的會話/ cookie管理](http://docs.slimframework.com/sessions/cookies/) – phaberest

+0

您正在使用什麼版本的Slim?看起來像2.x由:: getInstance() –

回答

0

原來,這與Slim沒有任何關係。

$ _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"}'; 
    } 
}