2015-04-03 55 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