2008-11-12 137 views
17

我遇到問題,PHP用POST和GET變量中的下劃線替換所有空格。PHP替換帶下劃線的空格

例如,如果我有網址:http://localhost/proxy.php?user名稱=最大 瀏覽器將其轉換爲http://localhost/proxy.php?user%20name=Max

但是,如果我給了$ _GET參數了,最關鍵的不是用戶名USER_NAME

有沒有可能改變這種行爲?在URL參數名稱

+1

[獲取PHP的可能重複停止更換「」 $ \ _ GET或$ \ _ POST數組中的字符?](http://stackoverflow.com/questions/68651/get-php-to-stop-replacing-characters-in-get-or-post-arrays) – 2015-02-25 16:12:04

回答

34

PHP manual

點傳入變量名

通常情況下,當他們 傳遞給腳本PHP不會改變的變量 名字。但是,它應該注意到 這個點(句號, 句號)不是 中的一個有效字符的一個PHP變量名。至於原因, 看看吧:

<?php $varname.ext; /* invalid variable name */ ?> 

現在, 解析器看到是一個名爲 $ varname的(一個變量,後面跟着一個字符串 連接運算符,後面 一個裸即加引號的字符串 這不匹配任何已知的密鑰或 保留字)'ext'。顯然,這個 沒有預期的結果。

因此,重要的是 請注意,PHP會自動將 替換爲帶下劃線的傳入變量 名稱中的任何點。

在頁面上留言:

是PHP轉換爲下劃線(_)的字段名字符的完整列表如下(不只是點):

chr(32) () (space) 
chr(46) (.) (dot) 
chr(91) ([) (open square bracket) 
chr(128) - chr(159) (various) 

PHP會不可逆地修改包含這些字符的字段名稱,以嘗試保持與已棄用的register_globals功能的兼容性。

+1

奇怪的是,編輯器進入一個無限循環,如果我試圖使第二段而不是代碼 – Greg 2008-11-12 12:23:36

+1

據我記得方括號不是簡單的用下劃線代替,而是允許多個值被放入一個數組。 – 2008-11-12 12:26:37

1

至於我還記得,我從來沒有見過的空間...

我想,這將是更好的參數名稱的所有空格轉換爲「_」。

+0

我有將點轉換爲「_」相同的問題。我想用點來與數據庫表進行直接匹配,使用別名表名,例如table_name.column_name。當php將點轉換爲「_」時,該字符串變爲不可用的「table_name_column_name」。你會如何解決它? – Anatoliy 2013-08-27 08:03:27

3

在register_globals的查詢字符串的老瘋狂的時代是由解壓到PHP的全局變量,但變量標識符的格式被約束,所以很明顯的空間不能工作。這種限制仍然存在,老實說,我認爲這樣保持它是個好主意。

如果您確實無法將空格更改爲URL中的下劃線,則只需在處理請求時將$ _GET數組打破,並用空格替換每個下劃線。

5

我認爲唯一的可能性,得到需要的參數,是使用$_SERVER['QUERY_STRING']解析他們自己:

$a_pairs = explode('&', $_SERVER['QUERY_STRING']); 
foreach($a_pairs AS $s_pair){ 
    $a_pair = explode('=', $s_pair); 
    if(count($a_pair) == 1) $a_pair[1] = ''; 

    $a_pair[0] = urldecode($a_pair[0]); 
    $a_pair[1] = urldecode($a_pair[1]); 

    $GLOBALS['_GET'][$a_pair[0]] = $a_pair[1]; 
    $_GET[$a_pair[0]] = $a_pair[1]; 
}