0

我正在生成一个需要原子格式日期的谷歌日历查询字符串。

我正在使用 php 5.1.6 和 date(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 进行编码/解码?

干杯

4

3 回答 3

0

您不能=在查询字符串中对 -symbol 进行编码 - 只有参数值本身和参数名称(如果它不固定并且可能包含有问题的字符)应该是urlencoded。正确的方法是

$query = 'start-max='.urlencode(date(DATE_ATOM));
// or if the parameter name could be problematic
$query = urlencode('start-max').'='.urlencode(date(DATE_ATOM));
于 2010-09-02T10:58:26.693 回答
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

所以,可能你正在对值进行原始编码,然后是整个字符串:

$ 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,这可能是理想的行为,但更有可能您在某处遇到逻辑错误。

于 2010-09-02T11:04:47.267 回答
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;
于 2010-09-02T11:07:50.777 回答