PHP urlencode/URLEDECODE日期(日期\原子)问题

PHP urlencode/URLEDECODE日期(日期\原子)问题,php,datetime,urlencode,urldecode,Php,Datetime,Urlencode,Urldecode,我正在生成一个需要atom格式日期的google日历查询字符串 我使用PHP5.1.6和date(date_ATOM)生成格式正确的当前日期。因此,例如,在查询的未编码url部分中: start-max=2010-09-02T10:25:58+01:00 我需要对它进行编码,它就变成了 start-max%3D2010-09-02T11%253A37%253A59%252B01%253A00 start-max=2010-09-02T11%3A39%3A35%2B01%3A00 现在如果

我正在生成一个需要atom格式日期的google日历查询字符串

我使用PHP5.1.6和date(date_ATOM)生成格式正确的当前日期。因此,例如,在查询的未编码url部分中:

start-max=2010-09-02T10:25:58+01:00
我需要对它进行编码,它就变成了

start-max%3D2010-09-02T11%253A37%253A59%252B01%253A00 
start-max=2010-09-02T11%3A39%3A35%2B01%3A00
现在如果我把它解码,它就变成了

start-max%3D2010-09-02T11%253A37%253A59%252B01%253A00 
start-max=2010-09-02T11%3A39%3A35%2B01%3A00
所以它没有正确解码,谷歌拒绝了这个查询

如果我对查询进行两次解码,则会对日期进行解码,但原始的“+”将被替换为空格(即使它仍然在上面的字符串中编码)

urlencode/URLEDECODE也是如此:(

你知道如何用这个日期格式对URL进行编码/解码吗


Cheers

您不能对查询字符串中的
=
-符号进行编码-只有参数值本身和参数名称(如果它不是固定的,并且可能包含有问题的字符)应该是
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));
无法复制:

$ 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,然后是整个字符串:

$ 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,这可能是您想要的行为,但更可能的是您在某个地方出现了逻辑错误。

使用PHP的
http\u build\u 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;

说得好。我在实际代码中使用了http_build_查询,所以我在上面的示例中有点马虎。干杯-你让我离开并再次检查我的代码,我相信我对我的编码过于热心。但它仍然没有解决:我需要再次爬过代码来查看发生了什么。我可能误解了ted的谷歌日期要求,因为它现在解释+作为一个空间的日期格式-我使用的URL作为参数值在其他地方的代码,但也作为一个URL的simplepie…该URL最初编码,我试图解码它之前,进入simplepie。我确实编码两次-一次在http_构建_query,然后是完整的URLHi-谢谢-但是我实际上已经在使用它了,但是在其他地方愚蠢地重新编码了函数中的值,并且没有注意到。谢谢你的帮助。好的,编码现在已经被清理了,但是url正在被传递到simplepie来处理,它不像未编码的日期字符串中的+或编码的字符串日期字符串也可以!如果我使用date('Y-m-d\TH:I:s\Z');创建日期并将其未编码地传递给simplepie,我就可以让它工作。这并不理想,但在我有更多时间调查之前,它必须暂时工作。