2010-07-07 108 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;。然後,包含的代碼將繼承範圍並修改正確的變量。