2013-10-22 1 views
0

누군가가 밝힐 수있는 이상한 문제가 발생했습니다. PHP 세션을 사용하여 로그인 세부 정보를 저장하는 웹 사이트가 있습니다. 이 사이트에는 PHP 세션 변수를 사용하는 게임이 있습니다. 잠시 동안 사이트에 로그인하지 않았을 때마다 게임을 시작하여 로그 아웃합니다. 세션 변수를 즉시 다시 로그인하면 로그인 상태를 유지하며 원하는만큼 여러 번 게임을 즐길 수 있습니다. 문제없이 사이트의 다른 페이지에 액세스 할 수 있습니다.새로운 PHP 세션 변수를 추가하면 세션이 파손됩니다.

모든 페이지 상단에 session_start가 있습니다. 이견있는 사람? 고맙습니다.

이 내 init.php 파일입니다

<?php 
    ob_start(); 
    session_start(); 
    //error_reporting(0); // don't display errors 

require 'database/connect.php'; 
require 'functions/general.php'; 
require 'functions/users.php'; 
require 'functions/items.php'; 
require 'functions/creatures.php'; 

$current_file = explode('/', $_SERVER['SCRIPT_NAME']); 
$current_file = end($current_file); 

if (logged_in() === true){ 
    $session_user_id = $_SESSION['user_id']; 
    $user_data = user_data($session_user_id, 'user_id', 'username', 'password', 'first_name', 'last_name', 'email', 'password_recover', 'type', 'allow_email', 'profile', 'coins'); 
    $creature_data = creature_data($session_user_id, 'base_creature_id', 'level', 'strength', 'speed', 'intelligence', 'happiness', 'status', 'battle_level'); 


    if(user_active($user_data['username']) === false) { 
     session_destroy(); 
     header('Location: logout.php'); 
     exit(); 
    } 
    if($current_file !== 'changepassword.php' && $user_data['password_recover'] == 1){ 
     header('Location: changepassword.php?force'); 
     exit(); 
    } 
} 

$errors = array(); 

?> 

그리고 여기에 게임 파일입니다

<?php 
require_once('core.php'); 
Hangman::StartPage(); 
?> 
    <head> 
     <link rel="stylesheet" type="text/css" href="games/plank/styles.css" /> 
    </head> 
     <?php Hangman::PrintGameState(); ?> 
     <div id="content"> 
      <!--<div id="banner"><img src="games/plank/images/interface/banner.png" /></div>--> 
      <div id="innerContent"> 
       <div id="wordArea"> 
        <span class="alphabet"> 
         <?php Hangman::PrintCurrentWord(); ?> 
        </span> 
       </div> 

       <span id="controls"> 

        <?php if(isset($_GET['finished']) === true && empty($_GET['finished']) === true){ ?> 
         <img id="result" src="games/plank/images/interface/<?php echo Hangman::GameResult() ? 'win' : 'lose'; ?>.png" /> 

         <a id="replay" href="http://www.mobbipets.com/site/walkthepalm.php?m=r"></a> 
        <?php } 
        else if (Hangman::IsGameFinished()) { 
         header('Location: walkthepalm.php?finished'); 
          if (Hangman::GameResult() == 'win'){ 
           update_coins($session_user_id, 50); 
           } 
         } 

        else { ?> 
        <span class="alphabet"> 
         <?php Hangman::PrintKeyboard(); ?> 
        </span> 
        <?php } ?> 
       </span> 
       <span id="hangman"><img src="games/plank/images/hangman/<?php echo $_SESSION['gameState']; ?>.png" /></span> 
      </div> 
     </div> 

<?php Hangman::EndPage(); ?> 

그리고 여기 core.php은 게임에서 사용하는 파일입니다.

<?php 
require_once('db.php'); 
/*================================================= 
    this class handles game logic and php sessions. 
==================================================*/ 
abstract class Hangman 
{ 
    private static $pageUrl = 'http://www.mobbipets.com/site/walkthepalm.php'; 
    private static $gameStates = 8; //includes the game over state 
    private static $keyboardButtons = "abcdefghijklmnopqrstuvwxyz&'-"; 
    private static $underscores = array(
     'us_1', 
     'us_2', 
     'us_3', 
     ); 
    private static $alphabetAliases = array(
     '&' => 'amp', 
     '\'' => 'apos', 
     '-' => 'hyphen', 
     ',' => 'comma', 
     '!' => 'exclaim', 
     '+' => 'plus', 
     '?' => 'question', 
     ); 

    //just checks if we have a valid session 
    public static function IsLoggedIn() 
    { 
     if(isset($_SESSION['valid']) && $_SESSION['valid']) 
      return true; 
     return false; 
    } 

    private static function RegenerateSession() 
    { 
     //session_regenerate_id(); 
     $_SESSION['valid'] = 1; 
     $_SESSION['lastActivity'] = time(); 
     $_SESSION['word'] = Database::GetRandomWord(); 
     $_SESSION['lettersLeft'] = strlen($_SESSION['word']); 
     $_SESSION['guessedLetters'] = ''; 
     $_SESSION['gameState'] = 1; 
    // $session_user_id = $_SESSION['user_id']; 
    } 

    //session handling 
    public static function StartPage() 
    { 
     //session_start(); 

     //terminate the session if we've been inactive for more than 10 minutes 
     if (self::IsLoggedIn()) 
     { 
      if (isset($_SESSION['lastActivity']) && ((time() - $_SESSION['lastActivity']) > 600)) 
       self::EndSession(); 
      else 
       $_SESSION['lastActivity'] = time(); 
     } 

     //if logged in after timeout check 
     if (self::IsLoggedIn()) 
     { 
      $mode = trim(@$_GET['m']); 
      if ($mode != '')    
       $mode = strtolower($mode); 

      if ($mode != '') //we've passed a special input 'mode' 
      { 
       switch ($mode) 
       { 
        case 'g': //player making a guess 
         $guess = trim(@$_GET['g']); 
         if ($guess != '') 
         { 
          $guess = self::FromAlias(strtolower($guess)); 
          if (strlen($guess) == 1 && stripos($_SESSION['guessedLetters'],$guess) === false) //valid 
          { 
           $_SESSION['guessedLetters'] .= $guess; 
           if (stripos($_SESSION['word'],$guess) === false) //wrong guess 
            $_SESSION['gameState']++; 
           else 
            $_SESSION['lettersLeft'] -= substr_count($_SESSION['word'] ,$guess); 
          } 
         } 
         break; 

        case 'r': //forced reset of session 
         self::EndSession(); 
         break; 
       } 
      } 
     } 

     //we forced a reset 
     if (!self::IsLoggedIn()) 
     { 
      self::RegenerateSession(); 
      header ('Location: '.self::$pageUrl); 
     } 
    } 


    //is the game finished 
    public static function IsGameFinished() 
    { 
     return $_SESSION['gameState'] >= self::$gameStates || (isset($_SESSION['lettersLeft']) && $_SESSION['lettersLeft'] <= 0); 
    } 

    //check if we won (true == win) 
    public static function GameResult() 
    { 
     return $_SESSION['gameState'] < self::$gameStates && $_SESSION['lettersLeft'] == 0; 
    } 

    //add any page-close stuff here 
    public static function EndPage() 
    { 

    } 

    //terminates the session 
    private static function EndSession() 
    { 
     //$_SESSION = array(); //destroy all of the session variables 
     //session_destroy(); 
     //session_unset(); 
     self::RegenerateSession(); 
     return true; 
    } 

    //convert a character to it's alias 
    private static function ToAlias($letter) 
    { 
     return array_key_exists($letter, self::$alphabetAliases) ? self::$alphabetAliases[$letter] : $letter; 
    } 

    //reduce an alias to it's corresponding character 
    private static function FromAlias($alias) 
    { 
     $key = array_search($alias, self::$alphabetAliases); 
     return $key === false ? $alias : $key; 
    } 

    //spit out the current word images based on game state 
    public static function PrintCurrentWord() 
    { 
     if (!self::IsLoggedIn()) 
      return; 

     $finished = self::IsGameFinished(); 

     for ($i = 0; $i < strlen($_SESSION['word']); $i++) 
     { 
      $letter = substr($_SESSION['word'],$i,1); 
      echo '<span class="'; 
      if (!$finished && stripos($_SESSION['guessedLetters'], $letter) === false) //haven't guessed this yet 
       echo self::$underscores[rand(0,count(self::$underscores)-1)]; 
      else //is a valid character that we've guessed already 
       echo self::ToAlias($letter); 
      echo '"></span>'."\n"; 
     } 
    } 

    public static function PrintGameState() //debugging 
    { 
     echo "\n<!--\n"; 
     echo "Word: ".$_SESSION['word']."\n"; 
     echo "Letters guessed: ".$_SESSION['guessedLetters']."\n"; 
     echo "Letters left: ".$_SESSION['lettersLeft']."\n"; 
     echo "Game State: ".$_SESSION['gameState']."\n"; 
     echo "-->\n"; 
    } 

    //print out the keyboard buttons 
    public static function PrintKeyboard() 
    { 
     if (!self::IsLoggedIn()) 
      return; 

     for ($i = 0; $i < strlen(self::$keyboardButtons); $i++) 
     { 
      $key = substr(self::$keyboardButtons,$i,1); 
      $keyAlias = self::ToAlias($key); 
      if (stripos($_SESSION['guessedLetters'], $key) === false) //haven't guessed this yet 
       echo '<a class="'.$keyAlias.'" href="?m=g&amp;g='.$keyAlias.'"></a>'; 
      else //we've guessed already 
       echo '<span class="'.$keyAlias.'"><img src="games/plank/images/alphabet/'.(stripos($_SESSION['word'], $key) === false?'wrong':'right').'.png" /></span>'; 
      echo "\n"; 
     } 
    } 
} 
?> 
+0

일부 코드를 표시 하시겠습니까? –

+0

소스 코드가 필요합니다 – subZero

+2

차를 가지고 있습니다. 내가 밖에서 날씨가 섭씨 20도이면 시작하지 않습니다. 휘발유를 추가했습니다. 왜 작동하지 않습니까? 이견있는 사람? 그게 정확히 당신의 질문처럼 보입니다. –

답변

2

일반적인 실수는 할당이 같다 :

$_SESSION = $data; 

이 이전에 저장된 정보를 덮어 쓰게됩니다.
더 나은 방법은 이름 인덱스 $_SESSION 배열을 만드는 것입니다 :

$_SESSION['somedata'] = $data; 

지금 당신은 단지 'somedata' 필드에 저장된 데이터를 덮어 쓰게됩니다.

관련 문제