2014-04-19 55 views
1

我有一個HTML表單(method =「GET」,行動=「cart.php」)中,我用兩個按鈕來發送相同的形式。PHP:isset()函數不檢測GET變量

echo '<input type="image" src="data/images/back.png" height="40px" id="back" name="back">'; 
echo '<input type="image" src="data/images/continue.png" height="40px" id="go" name="go">'; 

現在,在PHP端,我想檢查哪些按鈕中的一個被點擊(「走出去」按鈕或「後退」按鈕)。

我做:

if(isset($_GET['go.x']) == true) 
{ 
    echo 'form submitted using button GO'; 
} 
else 
{ 
    echo 'form submitted using button BACK'; 
} 

我使用的形式傳遞一個 「go.x」 和 「go.y」 變量 'go.x' 變量名(確切的X,Y圖像按鈕,當用戶點擊)內側的位置

然而,isset()函數的功能總是返回false ...怎麼可能呢? 感謝

+0

當你print_r($ _ GET)時會發生什麼;'? – Jono20201

+0

x和y是單獨的GET值,只需使用'go'即可。 – Chris

+0

噢,我的上帝......我解決我自己......我isset($ _ GET [back_x] ==真)和它的工作 –

回答

3

the manual

因爲foo.x和foo.y將使PHP中無效的變量名,它們 被自動轉換成了foo_x和foo_y。也就是說, 時期被替換爲下劃線。因此,您可以訪問 這些變量,如 從外部來源檢索變量一節中所述的任何其他變量。例如,$ _GET ['foo_x']。

有一個open issue raised against this replacement of periods with underscores in PHP表明該行爲旨在將register_globals打開時提交的變量名轉換爲有效的全局名稱。

現在已棄用的register_globals最終被移除,看起來有可能將行爲改變爲您一直期待的行爲。

+0

謝謝。然而,我並不完全滿意你的答案:foo.x和foo.y在任何情況下都不是變量,它們只是關聯數組$ _GET的字符串鍵。 PHP不禁止其中有句點的字符串,所以爲什麼這種奇怪的行爲? –

+0

我的猜測是由於歷史原因相關['register_globals'](http://www.php.net/manual/en/ini.core.php#ini.register-globals),如果設置,會使個人變量也可以直接訪問。也就是說,如果你打開了'register_globals',以及'$ _GET ['foo.x']',你會希望創建'$ foo.x',這是不可能的,因爲它是不是有效的名字。有一個[開放的錯誤](https://bugs.php.net/bug.php?id=60219)反對這種行爲,似乎表明,這是因爲這個原因,它可能會改變現在'register_globals'正在。 –

+0

有趣。從開放的bug報告看來,這是預期的行爲。他們甚至發佈了執行週期 - >下劃線轉換的代碼。 –

1

我回答我的問題,因爲我嘗試:

if(isset($_GET[go_x] == true)) 
{ 
} 

和它的工作。現在我的新問題是:爲什麼PHP將我的go.x GET變量轉換爲go_x?

+0

它是一個Apache Web服務器的問題? –

+0

它會做到這一點與傳遞給PHP腳本的所有變量: http://www.php.net/manual/en/language.variables.external.php#language.variables.external.dot-in-names – Chris

+1

這是遺留下來的東西。PHP用於自動將GET,POST和cookie值中的值作爲命名變量直接導入全局範圍(例如,'$ go_x')。那些不能有句點,所以它把它們轉換爲下劃線。 – Boann

0

您在JavaScript中詳細說明了名稱爲「go」的對象,但php並不理解變量x(「go.x」)的外推,我建議在JavaScript中的數據之前詳細闡述並設置輸入類型「隱藏「來發送數據到php頁面,進一步闡述。

ps。

如果(isset($ _ GET [ 'go.x'])==真)
這等於說
如果(isset($ _ GET [ 'go.x']))

http://it2.php.net/isset