2011-09-09 39 views
1

這是用來獲取列表中曾擔任標記從會話:PHP會話看起來腐敗

session_start(); 
if(!isset($_SESSION['markers'])) { 
    $_SESSION['markers'] = array(0); 
    $list = '0'; 
} else { 
    $list = implode(', ', $_SESSION['markers']); 
} 

我用$list得到還沒放送標記:

SELECT * FROM `markers` WHERE {other conditions} AND `marker_id` NOT IN($list) 

然後對返回的每一行我將標記ID添加到會話中:

while ($row = mysqli_fetch_assoc($result)){ 
    $_SESSION['markers'][] = (int) $row['marker_id']; 
    ... 
} 

但是,在服務一些mar kers(比如說8,36)會話看起來是腐敗的。 var_dump($_SESSION);輸出:

array(1) { 
    ["markers"]=> 
    &array(3) { 
    [0]=> 
    int(0) 
    [1]=> 
    int(8) 
    [2]=> 
    int(36) 
    } 
} 

我說這已損壞,因爲當我手動做出類似陣列(codepad here)輸出不顯示在第三行中一個& - 它是array(3),不&array(3)。這是什麼造成的?

更新
@Marc B被暗示會話未損壞。他的看法是我們只有一個變量($ _SESSION),其中包含對數組($ markers)的引用,而不是數組本身;和這不是一個損壞的變量。那麼,會話對於會話使用目的已損壞。兩個標誌:

  1. 第二次調用同一個腳本(其中我猜else路線採取)導致fatal errorFatal error: Cannot use object of type DOMElement as array in ... on line 47。第47行是我們嘗試向陣列添加新標記ID的地方:$_SESSION['markers'][] = (int) $row['marker_id'];
  2. 當我試圖反序列化會話文件的實際內容時,它失敗(codepad here)。
+0

這不是「腐敗」 - 某些東西只是將該數組轉換爲對數組的引用。 –

+0

它看起來像一個數組引用,但我不知道答案爲什麼發生,我可能會建議嘗試在while循環中使用array_push,例如, array_push($ _ SESSION ['markers'],(int)$ row ['marker_id']); –

+0

@Mark - 所有會話觸摸代碼是上面顯示的內容。現在,將數組轉換爲對它的引用是什麼? –

回答

3

如果將register_globals設置爲On,與$ _SESSION變量關聯的全局變量就是引用。來源:http://php.net/manual/en/reserved.variables.session.php

+0

+1謝謝!我查了一下register_globals,結果發現它是'On'(不應該「Off」是PHP 5.2。*的默認設置)。我會檢查是否關閉該問題將解決問題。 –

+0

完美!打開register_globals解決了這個問題。 –

0

從PHP手冊 http://php.net/manual/en/reserved.variables.session.php

請注意,如果您有register_globals的開,關聯到$ _SESSION變量引用全局變量,因此這可能會導致一些奇怪的情況下引用它。

<?php 

session_start(); 

$_SESSION['test'] = 42; 
$test = 43; 
echo $_SESSION['test']; 

?> 

加載網頁,確定它顯示42,重新加載頁面...它顯示43

解決的辦法是每次你做一個在session_start()時間後,要做到這一點:

<?php 

if (ini_get('register_globals')) 
{ 
    foreach ($_SESSION as $key=>$value) 
    { 
     if (isset($GLOBALS[$key])) 
      unset($GLOBALS[$key]); 
    } 
} 

?>