2010-07-07 52 views
0

一个已经写这些代码的怪异的变化:PHP - 变量值

<?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 - 期望的值是多少,但主脚本中的第二次打印输出0对我来说很奇怪,因为$ sesja变量在这两个print之间不会发生变化。

怎么了?

+1

你的代码太复杂了,很难跟踪它。你应该把它分成几个函数,并分别测试它们中的每一个。另外,尝试使用调试器(设置起来并不难):这对于这种情况非常有用。 Czesc – Palantir 2010-07-07 12:43:09

回答

2

发生这种情况是因为include内的变量范围。 $sesja首先在您的包含代码中设置,并且仅在此处生效。当代码执行返回到主PHP脚本时,$sesja超出范围并且被遗忘。

要解决,您需要在include之前的某处设置$sesja = 0;。然后,包含的代码将继承范围并修改正确的变量。