PHP-код urlencode / urldecode даты (DATE_ATOM) - PullRequest
0 голосов
/ 02 сентября 2010

Я создаю строку запроса в календаре Google, для которой требуется дата в атоме.

Я использую 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

Так что он не декодировался должным образом, и Google отклоняет запрос ...

Если я rawurldedecode запрос дважды, дата декодируется, но оригинальный '+' заменяется пробелом (хотя он все еще закодирован в приведенной выше строке)

То же самое верно для urlencode / urldecode :(

Любые идеи, как кодировать / декодировать URL с этим форматом даты в нем?

Приветствия

Ответы [ 3 ]

0 голосов
/ 02 сентября 2010

Невозможно воспроизвести:

$ 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

... что может быть желательным поведениемесли вы отправляете полный URL-адрес в переменную get, но, скорее всего, у вас где-то есть логическая ошибка.

0 голосов
/ 02 сентября 2010

Использовать 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 голосов
/ 02 сентября 2010

Вы не должны кодировать = -символ в строке запроса - только само значение параметра и имя параметра (если оно не фиксировано и может содержать проблемные символы) должно быть 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));
...