2010-09-02 37 views
0

我正在生產一個需要原子格式化日期的Google日曆查詢字符串。PHP urlencode/urldecode of date(DATE_ATOM)issue

我使用php 5.1.6和日期(DATE_ATOM)生成格式正確的當前日期。因此,例如,在查詢的未編碼的URL部分有:

start-max=2010-09-02T10:25:58+01:00 

我需要rawurlencode這一點,它變成

start-max%3D2010-09-02T11%253A37%253A59%252B01%253A00 

現在,如果我rawurldecode這成爲

start-max=2010-09-02T11%3A39%3A35%2B01%3A00 

所以它沒有正確解碼和谷歌拒絕查詢...

如果我rawurldecode查詢兩次日期已解碼,但原來的「+」被替換的空間(即使它是在上面的字符串仍然編碼)

同樣是真實的進行urlencode/urldecode :(

任何想法如何使用此日期格式對URL進行編碼/解碼?

乾杯

+0

感謝您的幫助。 OK現在編碼已經被清除了,但是url正在傳遞給simplepie來處理,並且它不喜歡未編碼的日期字符串或者編碼的日期字符串! 如果我使用date('Y-m-d \ TH:i:s \ Z'),我可以使用它。創建日期並將其傳遞給未編碼的simplepie。不理想,但現在必須要做,直到我有更多時間進行調查。 – xymod 2010-09-02 12:15:01

回答

0

無法重現:

$ php -r 'echo rawurlencode("start-max=2010-09-02T10:25:58+01:00").PHP_EOL;' 
start-max%3D2010-09-02T10%3A25%3A58%2B01%3A00 
$ php -r 'echo rawurlencode(rawurlencode("start-max=2010-09-02T10:25:58+01:00")).PHP_EOL;' 
start-max%253D2010-09-02T10%253A25%253A58%252B01%253A00 

$ php -r 'echo rawurldecode(rawurlencode("start-max=2010-09-02T10:25:58+01:00")).PHP_EOL;' 
start-max=2010-09-02T10:25:58+01:00 
$ php -r 'echo urldecode(urlencode("start-max=2010-09-02T10:25:58+01:00")).PHP_EOL;' 
start-max=2010-09-02T10:25:58+01:00 

所以,很可能你的rawurlencode'ing值,然後整個字符串:

$ php -r 'echo rawurlencode("start-max=".rawurlencode("2010-09-02T10:25:58+01:00")).PHP_EOL;' 
start-max%3D2010-09-02T10%253A25%253A58%252B01%253A00 

...如果你在一個get變量中發送一個完整的URL,這可能是你期望的行爲,但更可能你在某個地方有一個邏輯錯誤。

+0

乾杯 - 你讓我走開了,再次檢查我的代碼,我相信我一直對我的編碼過度。但它仍然沒有解決:我需要去通過代碼再次抓取,看看發生了什麼。我可能誤解了Google日期要求,因爲它現在將日期格式的空格解釋爲 – xymod 2010-09-02 11:33:12

+0

ps - 我將URL用作代碼中其他地方的參數值,但也用作simplepie的URL ... URL最初是編碼的,我試圖在進入simplepie之前解碼它。我確實編碼了兩次 - 一次在http_build_query中,然後是完整的URL – xymod 2010-09-02 12:19:47

0

你不能在編碼您的查詢字符串的= -symbol - 只有參數值本身和參數名稱(如果它不是固定的,可能包含有問題的字符)應該是urlencode d。正確的方法是

$query = 'start-max='.urlencode(date(DATE_ATOM)); 
// or if the parameter name could be problematic 
$query = urlencode('start-max').'='.urlencode(date(DATE_ATOM)); 
+0

好點。我在實際的代碼中使用了http_build_query,所以我在上面的示例中略顯sl sl。 – xymod 2010-09-02 11:29:36

0

使用PHP的http_build_query

$BaseURL = 'http://example.com/page.php'; 
$Query = http_build_query(array(
    'start-max'=>'2010-09-02T10:25:58+01:00', 
    'param2'=>'anotherval', 
)); 

$URL = $BaseURL. '?'. $Query; 
+0

嗨,謝謝 - 但我實際上已經在使用它了,但是愚蠢地重新編碼了其他地方的函數中的值,並沒有注意到。 – xymod 2010-09-02 11:34:18