2010-08-31 227 views
3

接下來的一週,我被一個可悲的非常慢的單槓EDGE互聯網連接卡住了,所以請原諒我,如果我沒有花足夠多的時間研究這個,但是我只需設置一個本地服務器來測試我通常會在互聯網上進行測試的代碼,並且它在我的本地LAMP安裝上似乎沒有相同的工作方式。數組中的PHP字符串只返回第一個字符

的問題是,當我這樣做:

echo strtolower($_REQUEST['page']); 

的結果是這樣的:

files 

然而,當我這樣做:

$page['name'] = strtolower($_REQUEST['page']); 
echo $page['name']; 

的結果是這樣的:

f 

不,這不是一個錯字,它始終只返回字符串的第一個字母。執行var_dump($page)將導致string(5) "files",但執行var_dump($page['name'])將導致string(1) "f"。我正在使用PHP 5.2.1

這是怎麼回事?

謝謝!

Ari

+1

你百分之百確定你已經在這裏發佈的代碼是相同的,你實際上是在做什麼? – Amber 2010-08-31 03:15:09

+0

你在哪裏聲明位置'文件'的值? – 2010-08-31 03:16:16

+0

是的,我從字面上複製和粘貼。 – AriX 2010-08-31 03:18:35

回答

7

你幾乎回答了你自己的問題。 $page是「文件」(如您的第一個var_dump所示)。這可能是由於已棄用的register_globals或其手動近似引起的。鑑於此,

$page['files'] 

是「f」。這是因爲非數字字符串被隱式轉換爲0(!)。您可以輕鬆地重現此:

$page = 'files'; 
echo $page['files']; 
+0

在發佈之前,我已經想清楚了。是的,$頁面被設置爲文件,但我不知道。顯然這個問題源於我的本地安裝中打開的PHP設置,但不是遠程設置,這使得如果GET變量「page」設置爲文件,$ page也將被設置爲文件。 感謝您的幫助。 – AriX 2010-08-31 03:21:16

+0

@AriX'register_globals'我想?準確地說,你總是需要正確初始化變量*和*關閉'register_globals'。 – deceze 2010-08-31 03:23:39

+0

是的,它是我剛剛關閉的register_globals。我不知道爲什麼它首先出現 - 我不記得打開它,也許它默認使用Mac XAMPP? 再次,謝謝! – AriX 2010-08-31 03:31:39

1

做一個var_dump($page)將導致string(5) "files"

這意味着變量$page是一個字符串,而不是因爲你似乎期望包含字符串數組。你也可以在字符串上使用類似數組的偏移量來返回字符串中的單個字符。通過類型鑄造的魔法$string['files']相當於$string[0],它返回第一個字符。

您的問題是某處將字符串分配給$page,或者在此之後您將其從數組轉換爲單個字符串。您提供的代碼應該按原樣運行。

我想$page已經是一個字符串時,分配給$page['name'],所以你實際上設置字符串的第一個字符。嘗試明確聲明$page = array()

+0

是的,這就是問題所在 - 我顯然沒有清楚地讀到var_dump的輸出,以至於我認爲它不是一個數組,我認爲register_globals已關閉(因爲它應該是)。 – AriX 2010-08-31 03:31:05

0

總結:這是一個變量聲明的問題。使用陣列之前,首先聲明它:

$page = array(); 

祝奇怪的服務器配置工作。

相關問題