2010-09-02 79 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