Php http build str

Особенности http_build_query в PHP

Казалось бы http_build_query — простая функция, однако, имеет некоторые особенности. Нельзя однозначно сказать что это баг, скорее просто недокументированная фича, которую стоит учитывать при разработке.

Допустим, есть массив [‘page’ => 2, ‘hide’ => null]. Что же вернёт http_build_query в результате? Это будет просто page=2, аргумент hide был отброшен, т.к. он имеет значение null! Что будет, если передать массив, где все значения будут null? Функция вернёт строку нулевой длины.

Взаимосвязь parse_str и http_build_query

В документации PHP по функции http_build_query есть отсылка к другой функции — parse_str, которая делает обратное действие: возвращает массив [‘page’ => ‘2’, ‘hide’ => »] на основе строк ‘page=2&hide’ или ‘page=2&hide=’. Если этот массив прогнать обратно через http_build_query, то результат получится ‘page=2&hide=’, что для некоторых ситуаций будет детерминировано.

Влияние http_build_query на фреймворк Laravel

Однако, некоторые фреймворки, например, Laravel и, скорее всего Symfony, строку с параметрами ‘page=2&hide’ или ‘page=2&hide=’ парсят [‘page’ => ‘2’, ‘hide’ => null]. Самое странное, что обратно этот массив параметров они собирают с помощью всё той же http_build_query, в результате чего в урле теряется параметр hide.

Ещё одна ошибка, которая часть встречается в скриптах при формировании полного url. Вот пример из Laravel 5.6 из класса \Illuminate\Http\Request:

public function fullUrlWithQuery(array $query) < $question = $this->getBaseUrl().$this->getPathInfo() == '/' ? '/?' : '?'; return count($this->query()) > 0 ? $this->url().$question.http_build_query(array_merge($this->query(), $query)) : $this->fullUrl().$question.http_build_query($query); >

Что вернёт данный метод, если в query все значения будут null? Что-то вроде: «http://127.0.0.1:8000/?». Как видите, на конце появился не нужный знак вопроса, т.к. после него нет ни одного параметра. Это происходит из-за того, что считается количество элементов в массиве вместе с null значениями.

Читайте также:  Kotlin async await coroutines

Однако, соседний метод \Illuminate\Http\Request::fullUrl() вернёт корректное значение: «http://127.0.0.1:8000/?hide=»

Проблема потери параметров в http_build_query

Казалось бы, нет проблемы, теряется параметр без значения. Однако, для внешних систем, параметр без значения может быть значимым и его потеря приведёт к непредвиденному результату. Например, это может быть какая-нибудь JS-библиотека, для которой параметр без значения так же важен как и параметр со значением. Проблемы также могут возникнуть в аналитических системах, при интеграции с другими сайтами и системами.

Не все веб-приложения работают на PHP, не все соблюдают стандарты и спецификации, особенно в других странах. И иногда потеря get-параметра без значения может обернуться серьёзной ошибкой для бизнес-логики.

А что, если не баг, а фича?

Однако, у этой особенности работы http_build_query есть и приятная сторона. Можно достаточно просто удалять ненужные параметры из строки запроса таким способом:

$query = ['page' => 2, 'hide' => 6, 'user' => 4, 'section' => 22]; $except = ['hide' => null, 'user' => null]; $new = http_build_query(array_merge($query, $except) );

В результате чего получится строка: page=2&section=22.

Читайте также

Что не так с этим скриптом? Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 2 логические…

Что не так с функцией file_put_contents() в PHP? Если в кратце, то суть такая: file_put_contents() не атомарен и не гарантирует записи данных файл, а может вообще очистить его…

Cлучайные числа с плавающей точкой в PHP Стандартные библиотеки PHP умеют генерировать только целые случайные числа. Однако, возникают задачи где нужно не целое рандомное число с максимально…

Источник

http_build_str

Строит строку запроса из массива, содержащего переменные запроса. По действию эта функция противоположна функции parse_str() .

Список параметров

Ассоциативный массив с параметрами запроса

Используемый разделитель аргументов (по умолчанию используется значение INI директивы arg_separator.output, или «&», если ничего не указано.

Возвращаемые значения

Возвращает построенный запрос как строку в случае успеха или FALSE в случае возникновения ошибки.

Смотрите также

User Contributed Notes 1 note

For those who are using PECL pecl_http 2, you need to refer to HttpQueryString, which is now implemented under http namespace. Therefore,

  • HTTP Функции
    • http_​cache_​etag
    • http_​cache_​last_​modified
    • http_​chunked_​decode
    • http_​deflate
    • http_​inflate
    • http_​build_​cookie
    • http_​date
    • http_​get_​request_​body_​stream
    • http_​get_​request_​body
    • http_​get_​request_​headers
    • http_​match_​etag
    • http_​match_​modified
    • http_​match_​request_​header
    • http_​support
    • http_​negotiate_​charset
    • http_​negotiate_​content_​type
    • http_​negotiate_​language
    • ob_​deflatehandler
    • ob_​etaghandler
    • ob_​inflatehandler
    • http_​parse_​cookie
    • http_​parse_​headers
    • http_​parse_​message
    • http_​parse_​params
    • http_​persistent_​handles_​clean
    • http_​persistent_​handles_​count
    • http_​persistent_​handles_​ident
    • http_​get
    • http_​head
    • http_​post_​data
    • http_​post_​fields
    • http_​put_​data
    • http_​put_​file
    • http_​put_​stream
    • http_​request_​body_​encode
    • http_​request_​method_​exists
    • http_​request_​method_​name
    • http_​request_​method_​register
    • http_​request_​method_​unregister
    • http_​request
    • http_​redirect
    • http_​send_​content_​disposition
    • http_​send_​content_​type
    • http_​send_​data
    • http_​send_​file
    • http_​send_​last_​modified
    • http_​send_​status
    • http_​send_​stream
    • http_​throttle
    • http_​build_​str
    • http_​build_​url

    Источник

Оцените статью