PHP 日期(DATE_ATOM) 的 urlencode / urldecode 问题

发布于 2024-09-17 09:08:19 字数 580 浏览 3 评论 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 进行编码/解码的任何想法 吗?

干杯

I am producing a google calendar query string that requires an atom fomatted date.

I am using php 5.1.6, and date(DATE_ATOM) to produce the correctly formatted current date. So, for instance, in the unencoded url part of the query has:

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

I need to rawurlencode this and it becomes

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

Now if I rawurldecode this it becomes

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

So it hasn't decoded properly and google rejects the query...

If I rawurldecode the query twice the date is decoded but the original '+' is replaced with a space ( even though it is still encoded in the above string)

The same is true for urlencode/urldecode :(

Any ideas how to encode / decode the URL with this date format in it?

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

荆棘i 2024-09-24 09:08:19

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

Use PHP's 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;
埖埖迣鎅 2024-09-24 09:08:19

无法重现:

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

Cannot reproduce:

$ 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

So, probably you're rawurlencode'ing the value, and then the whole string:

$ 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

...which could be desired behavior if you're sending a complete url in an get variable, but more probably you have a logical error somewhere.

陪你到最终 2024-09-24 09:08:19

您不得在查询字符串中对 = 符号进行编码 - 只有参数值本身和参数名称(如果未修复且可能包含有问题的字符)应为 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));

You must not encode the =-symbol in your query string - only the parameter value itself and the parameter name (if it's not fixed and could contain problematic characters) should be urlencoded. The correct way would be

$query = 'start-max='.urlencode(date(DATE_ATOM));
// or if the parameter name could be problematic
$query = urlencode('start-max').'='.urlencode(date(DATE_ATOM));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文