2010-07-07 3 views
0

변수 값의 이상한 변화 :PHP - A는이 코드를 작성했습니다

<?php 
require("../../config.php"); 
require("../php/funct.php"); 

try { 
    $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_TABL.';', DB_AUSER, DB_APASS); 
} 
catch(PDOException $e) { 
    echo 'Error: ' . $e->getMessage(); 
} 
$idee=unique_id(); 
$insystem=true; 

include('session_check.php'); 

unset($insystem); 
    print($sesja); ///// SECOND PRINT() 
if($sesja!=1) { 
    die("Session error"); 
    exit; 
} else {  
     //some other code 
} 

session_check.php은 여기에 있습니다 :

<?php 
if(isset($insystem) && $insystem) { 
    if(!isset($_COOKIE['seid'])) { 
     setcookie('seid', $idee, time() + COOKIELIFE); 
     $sesja=0; 
    } else { 
     setcookie('seid', $_COOKIE['seid'], time() + COOKIELIFE); 
     $dane=$pdo->prepare('SELECT s.id, s.ip, s.czas, s.prawa, p.nick, p.id FROM sessions s JOIN pracownicy p ON s.Pracownicy_id=p.id WHERE s.id=:id'); 
     $dane->bindValue(':id',$_COOKIE['seid'], PDO::PARAM_STR); 
     $dane->execute(); 
     $dsesji = $dane -> fetch(); 
     $dane->closeCursor(); 
     unset($dane); 
     if($dsesji!==false) { 
      if(isset($_GET['lo']) && ($_GET['lo']==='lo') && isset($indeks) && $indeks) { 
       $usun=$pdo->prepare('DELETE FROM sessions WHERE id=:id'); 
       $usun->bindValue(':id',$_COOKIE['seid'], PDO::PARAM_STR); 
       $usun->execute(); 
       unset($usun); 
       setcookie('seid', 'abc', time() - 42000); 
       header("Location: index.php"); 
      } 
      $sesja=1; 
      $_nick=$dsesji['nick']; 
      $_Pracownicy_id=$dsesji['id']; 
      $_prawa=explode('|',$dsesji['prawa']); 
      unset($_prawa[count($_prawa)-1]); 
      if($dsesji['ip']!=$_SERVER['REMOTE_ADDR']) { 
       $usun=$pdo->prepare('DELETE FROM sessions WHERE id=:id'); 
       $usun->bindValue(':id',$_COOKIE['seid'], PDO::PARAM_STR); 
       $usun->execute(); 
       unset($usun); 
       setcookie('seid', 'abc', time() - 42000); 
       header("Location: index.php?lo=bs"); 
       exit; 
      } 
      $teraz=time(); 
      $roznica=$teraz-$dsesji['czas']; 
      if($roznica>(TIMEOUT*60)) { 
       $usun=$pdo->prepare('DELETE FROM sessions WHERE id=:id'); 
       $usun->bindValue(':id',$_COOKIE['seid'], PDO::PARAM_STR); 
       $usun->execute(); 
       unset($usun); 
       setcookie('seid', 'abc', time() - 42000); 
       header("Location: index.php?lo=to"); 
       exit; 
      } 
      if($sesja!=0) { 
       $idee=unique_id(); 
       setcookie('seid', $idee, time() + COOKIELIFE); 
       $dane=$pdo->prepare('UPDATE sessions SET id=:nowyid WHERE id=:id'); 
       $dane->bindValue(':nowyid',$idee, PDO::PARAM_STR); 
       $dane->bindValue(':id',$_COOKIE['seid'], PDO::PARAM_STR); 
       $dane->execute(); 
       unset($dane); 
       $_CURR_SID=$idee; 
       unset($idee); 
      } 
      print($sesja); ///// FIRST PRINT() 
     } else { 
      $sesja=0; 

     } 
    } 
} else { 
    die('aerr1'); 
} 
?> 

문제는 다음과 같습니다 (session_check.php에서) 1 인쇄 1을 출력 - 예상되는 값은 무엇입니까? 그러나 주 스크립트의 두 번째 인쇄는이 두 인쇄간에 $ sesja 변수가 변경되지 않았기 때문에 저에게 이상한 것을 인쇄합니다.

무엇이 잘못 되었나요?

+1

코드가 너무 복잡하여 추적하기가 어렵습니다. 여러 함수로 나누고 각 함수를 개별적으로 테스트해야합니다. 또한 디버거를 사용해보십시오 (설정하기가 너무 어렵지 않음). 다음과 같은 상황에서 가장 유용합니다. 체 케스 – Palantir

답변

2

이것은 가변 범위가 include에 있기 때문에 발생합니다. $sesja은 처음에 포함 된 코드에서 설정되고 거기에만 살았습니다. 코드 실행이 주 PHP 스크립트로 돌아 오면 $sesja은 범위를 벗어나 잊어 버렸습니다.

해결하려면 include 전에 어딘가에 $sesja = 0;을 설정해야합니다. 그런 다음 포함 된 코드는 범위를 상속하고 올바른 변수를 수정합니다.

관련 문제