2015-04-03 2 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 это показывает идентификатор 1, например. Но на странице индекса или любой странице, если на то есть они все пусты, как будто никто не вошел в систему.

Так что мой вопрос: session_start(); удалить предыдущие сеансы, как я это делаю. Я прочитал, что он запускает или возобновляет сеанс, но я ничего не видел о идентификаторах сеанса.

Я как бы новичок в php, поэтому, если кто-нибудь увидит что-то, что можно улучшить в любом месте, скажите мне.

+0

Похоже, page_load.php или check_session.php фактически отбрасывает сохраненные сеансы. Попробуйте добавить session_start() в верхнюю часть этих тем и протестировать его. – MrTechie

+0

@MrTechie У них обоих уже есть это наверху, мне сказали сделать это на каждой странице некоторое время назад – Crecket

ответ

0

Я установил session_id() после того, как я уже начал один. Все, что мне нужно было сделать, это обмен этими двумя:

session_id($session_id); 
session_start(); 
0

Try изменения:

$_COOKIE 

в

$_SESSION 
+0

Я использую $ _COOKIE для хранения cookie в течение месяца, я, чем проверяю, когда браузер, если идентификатор сеанса, который хранится в файле cookie, соответствует любому из сеансов, хранящихся в базе данных +, если соответствует IP-адрес. Я не могу просто изменить его, не разрушая код, который я думаю – Crecket

Смежные вопросы