【问题标题】:PHP urlencode / urldecode of date(DATE_ATOM) issuePHP urlencode / urldecode of date(DATE_ATOM) 问题
【发布时间】:2011-04-07 06:44:00
【问题描述】:

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

我正在使用 php 5.1.6 和 date(DATE_ATOM) 来生成格式正确的当前日期。因此,例如,在查询的未编码 url 部分有:

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

我需要对它进行原始编码,然后它就变成了

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

现在如果我 rawurldecode 它变成了

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

所以它没有正确解码,谷歌拒绝了查询......

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

对于 urlencode/urldecode 也是如此 :(

任何想法如何使用这种日期格式对 URL 进行编码/解码?

干杯

【问题讨论】:

  • 感谢您的帮助。好的,现在已经清理了编码,但是 url 正在被传递给 simplepie 来处理,并且它不喜欢未编码的日期字符串中的 +,或者编码的日期字符串!如果我使用 date('Y-m-d\TH:i:s\Z'); 我可以让它工作创建日期并将其传递给未编码的 simplepie。不理想,但现在必须这样做,直到我有更多时间进行调查。

标签: php datetime urlencode urldecode


【解决方案1】:

无法重现:

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

【讨论】:

  • 干杯 - 你让我离开并再次检查我的代码,我相信我对我的编码过于热心了。但它仍然没有解决:我需要去再次爬取代码以查看发生了什么。我可能误解了 google 日期要求,因为它现在将 + 解释为日期格式中的空格
  • ps - 我在代码中的其他地方使用 URL 作为参数值,但也作为 simplepie 的 URL ... URL 最初是编码的,我试图在进入之前对其进行解码进入简单派。我确实编码了两次——一次在 http_build_query 中,然后是完整的 URL
【解决方案2】:

您不能在查询字符串中编码=-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));

【讨论】:

  • 好点。我在实际代码中使用了 http_build_query,所以在上面的示例中我有点草率。
【解决方案3】:

使用 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;

【讨论】:

  • 嗨 - 谢谢 - 但我实际上已经在使用它了,但是在其他地方愚蠢地重新编码函数中的值并且没有注意到。
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
相关资源
最近更新 更多