2015-04-03 54 views
1

我寫了一個全新的腳本來將我的會話存儲在數據庫中,並且一切似乎都正常。出於某種原因,每當我打開頁面時,會話變量都消失了。打開新頁面時會話變量重置

我假設這與我使用session_start();當我使用session_start($ session_id)時,在頁面的頂部;在我的腳本上開始會話。這是否重置session_id?

這是主要的PHP腳本,設置變量/會話

<?php 
    session_start(); 
    include($_SERVER['DOCUMENT_ROOT']. '/../db_connect.php'); 
    if (!Isset($_SESSION['crecketgaming_usergroup'])){ 
     $_SESSION['crecketgaming_usergroup'] = "Guest"; 
    } 
    try { 
     $conn = new PDO("mysql:host=$servername:3307;dbname=$dbname", $username, $password); 
    }catch(PDOException $e){ 
     echo "Connection failed: " . $e->getMessage(); 
    } 

    onLoad($conn); 
    function onLoad($conn){ 
     $session_id = ""; 
     if(isset($_COOKIE['Crecketgaming_sessionid'])){ 
      $time = time(); 
      $session_id = $_COOKIE['Crecketgaming_sessionid']; 
      $addrip = $_SERVER['REMOTE_ADDR']; 
      $sql = "SELECT * FROM sessions WHERE session_id = :sessionid AND ip = :addrip"; 
      $sth = $conn->prepare($sql); 
      $sth->bindParam(':sessionid', $session_id, PDO::PARAM_STR); 
      $sth->bindParam(':addrip', $addrip, PDO::PARAM_STR); 
      if($sth->execute()){ 
      }else{ 
       echo "error"; 
      } 
      $rowcount = $sth->rowCount(); 
      $row = $sth->fetch(); 
      $userid = $row['user_id']; 
      //echo $row['user_id']; 
      if ($rowcount > 0) { 
      } else { 
       $session_id = storeUID($conn); 
      } 
     } else { 
      $session_id = storeUID($conn); 
     } 
     if($session_id !== "") { 
      if($userid === NULL){ 
      }else{ 
       //echo $userid; 
       setSessionDetails($conn, $userid); 
      } 
     } 
    } 

    function storeUID($conn){ 

     $addrip = $_SERVER['REMOTE_ADDR']; 
     $session_id = createUID(100); 
     $time = time(); 
     if(setcookie("Crecketgaming_sessionid", $session_id, mktime(). time()+60*60*24*30)){ 
      $agent = $_SERVER['HTTP_USER_AGENT']; 
      $ip = $ip = $_SERVER['REMOTE_ADDR']; 
      $sql = "INSERT INTO sessions (session_id, ip, time) VALUES (:sessionid, :addrip, :time)"; 
      $sth = $conn->prepare($sql); 
      $sth->bindParam(':sessionid', $session_id, PDO::PARAM_STR); 
      $sth->bindParam(':addrip', $addrip, PDO::PARAM_STR); 
      $sth->bindParam(':time', $time, PDO::PARAM_INT); 
      $sth->execute(); 
     } 
     return $session_id; 
     session_start($session_id); 
    } 

    function createUID($length) { 
     $chars = "abcdefghijkmnopqrstuvwxyz"; 
     srand((double)microtime()*1000000); 
     $i = 0; 
     $pass = '' ; 
     while ($i < $length) { 
      $num = rand() % 33; 
      $tmp = substr($chars, $num, 1); 
      $pass = $pass . $tmp; 
      $i++; 
     } 
     return $pass; 
    } 

    function setSessionDetails($conn, $userid) { 
     session_start($session_id); 
     session_id($session_id); 
     $sql = "SELECT * FROM users WHERE user_ID = :user_ID"; 
     $sth = $conn->prepare($sql); 
     $sth->bindParam(':user_ID', $userid); 
     $sth->execute(); 
     $row = $sth->fetch(); 
     $_SESSION['crecketgaming_usergroup'] = $row['Usergroup']; 

     $_SESSION['crecketgaming_username'] = $row['Username']; 

     $_SESSION['crecketgaming_userid'] = $row['user_ID']; 

    } 
?> 

而在例如我的索引頁面的頂部,這是我唯一的PHP代碼:

<?php 
    session_start(); 
    include($_SERVER['DOCUMENT_ROOT']. '/../db_connect.php'); 
    include($_SERVER['DOCUMENT_ROOT']. '/includes/page_load.php'); 
    include($_SERVER['DOCUMENT_ROOT']. '/includes/check_session.php'); 
?> 

這就是所謂的在頁面頂部。 db_connect包含我與服務器的連接詳細信息,page_load計算ip地址刷新頁面的次數,check_session是上面顯示的文件。

我檢查,如果我把

echo $_SESSION['crecketgaming_userid']; //outputs "1" 
echo $_SESSION['crecketgaming_usename ']; //outputs "crecket" 
exit; 

在check_session.php的底部,它顯示ID 1爲例。但在索引頁面或任何頁面上的事情,他們都是空的,就好像沒有人登錄。

所以我的問題是session_start();按照我的方式刪除以前的會話。我讀過它開始或恢復會話,但我從來沒有看到有關會話ID的任何內容。

我是一種新的PHP,所以如果任何人看到的東西要改善的地方,請告訴我。

+0

看起來像page_load.php或check_session.php實際上是刪除存儲的會話。嘗試將session_start()添加到這些頂部,並對其進行測試。 – MrTechie 2015-04-03 14:28:01

+0

@MrTechie他們都已經在頂部有這個,我被告知在前一頁的每一頁都做這個 – Crecket 2015-04-03 14:30:53

回答

0

我,我已經開始了一個後置的SESSION_ID()。我所要做的只是交換這兩個:

session_id($session_id); 
session_start(); 
0

嘗試改變:

$_COOKIE 

$_SESSION 
+0

我使用$ _COOKIE來存儲cookie一個月,我比瀏覽器時檢查是否會話ID是存儲在cookie中,匹配存儲在數據庫中的任何會話+如果IP地址匹配。我不能在不破壞我認爲的代碼的情況下改變它 – Crecket 2015-04-03 14:36:34