2010-08-15 19 views
4

我有我見過的PHP本身最古怪的問題。奇怪的PHP行爲,如果我把變量名稱感嘆號

設置:

PHP 5.33,IIS

下(試圖PHP 5.2.14以及)

問題: PHP只要我把感嘆號進入一鍵刪除所有會話數據在會話數組中。

實施例:

session1.php

session_start(); 
$_SESSION["foo"] = 'test'; 
header('Location: session2.php'); 

session2.php

session_start(); 
var_dump($_SESSION); 
die(); 

工作正常,我看到的可變數據打印出來。

array(1) { ["foo"]=> &string(4) "test" } 

但是,如果我改變行第一個文件是

​​

$_SESSION["f!oo"] = 'test'; 

我的意思是,如果我添加驚歎號 - 然後$ _SESSION數組是空的,當我得到到第二個文件

​​

我認爲這是PHP 5.2.14的一個bug版本,但升級沒有幫助。 我甚至不知道問題可能是什麼。也許這與Windows安裝程序或IIS有關?

任何想法?

+0

你使用了什麼會話後端?純文件? 'session.save_handler = files' – stillstanding 2010-08-15 10:17:54

+1

我的php 5.3.1可以正常使用「!」 (XAMPP)。 – ehpc 2010-08-15 10:24:19

+0

有一個關於此的舊bug報告,但顯然它不可重現(http://bugs.php.net/bug.php?id=14160) – nico 2010-08-15 10:30:19

回答

2

那麼你的問題是什麼?這個錯誤的原因是什麼或如何避免它?
第一個可能是因爲一些奇怪的PHP內部。例如,您不能使用數字鍵具有相同的結果。
後者更簡單 - 不要將感嘆號放入會話數組中的某個鍵中。

我記得,PHP會話機制來自於PHPLib--第一個PHP框架。由一些志願者學生撰寫。不是一個非常優秀的。在版本4.0中添加到PHP後,只能在4.1版本中使用,但仍有一些奇怪的遺留問題,如register_globals支持。後者很可能是你問題的原因。 $ _SESSION數組鍵必須是有效的PHP變量名稱,這是因爲古老的register_globals行爲,會話變量變爲全局PHP變量。

+0

register_globals已在5.3中棄用。 cbglum正在使用5.3.3 – stillstanding 2010-08-15 11:28:32

+0

@stillstanding所以呢? – 2010-08-15 11:39:16

+0

我注意到問題後,我把第一件事變成了register_globals。現在我更確信這是更多的IIS或Win問題,但我不知道如何在不離開此服務器的情況下解決問題。任何提示? – glum 2010-08-16 06:06:01

2

這是而不是Windows,它的不是Apache或任何其他網絡服務器,它是PHP的核心。

我看了一下 - 從5.3開始到5.6,問題依然存在:你不允許有「!」 (感嘆號)或「|」 (管道)在會話密鑰內。

Suhosin修補程序將部分修復它。然後,您可以在鑰匙內的任何位置留下感嘆號,但不是第一個位置,因此「foo!」是允許的,但不是「!foo」。管道仍然被禁止。

的修復:

  1. 變化在php.ini session.serialize_handlerphp_binaryphp_serialize
  2. 重新啓動Web服務器。

玩得開心!