Поскольку никто не смог дать ответ за последние 4 месяца, вот мои выводы подытожены.
Как динамически создавать ссылки HTML со строкой запроса?
Если вам нужно создать строку запроса для использования в HTML-ссылке (например, <a href="index.php?param1='.$value.'">Link</a>
), тогда вы должны использовать http_build_query
.
Эта функция принимает 4 параметра, первый из которых представляет собой массив / объект данных запроса. По большей части остальные 3 параметра не имеют значения.
$qs = [
'a' => 'a',
'quot;' => 'bar foo',
];
echo '<a href="?' . http_build_query($qs) . '">Link</a>';
Однако, вы все равно должны передать выходные данные функции через htmlspecialchars
, чтобы правильно кодировать &
. «Хороший фреймворк сделает это автоматически, как и {{}} Ларавела»
echo '<a href="?' . htmlspecialchars(http_build_query($qs)) . '">Link</a>';
В качестве альтернативы вы можете передать третий аргумент http_build_query
как '&'
, оставив второй null
. Это будет использовать &
вместо &
, что htmlspecialchars
будет делать.
О пробелах .
Для использования в данных формы (то есть в строках запроса) пробел должен быть закодирован как +
, а в любом другом месте он должен быть закодирован как %20
, например. new%20page.php?my+field=my+val
. Это необходимо для обеспечения обратной сопоставимости со всеми браузерами. Вы можете использовать более новый RFC3986, который будет кодировать пробелы как %20
, и он будет работать во всех распространенных браузерах, а также соответствовать современным стандартам.
echo '<a href="?' . http_build_query($qs, null, '&', PHP_QUERY_RFC3986) . '">Link</a>';
rawurlencode
против urlencode
Для любой части URL до ?
следует использовать rawurlencode
. Например:
$subdir = rawurlencode('blue+light blue');
echo '<a href="'.$subdir.'/index.php">rawurlencode</a>';
Если в приведенном выше примере вы используете urlencode
, ссылка будет разорвана. urlencode
имеет очень ограниченное использование и его следует избегать.
Не передавайте весь URL через rawurlencode
. Разделители /
и другие специальные символы в URL не должны кодироваться, если они должны выполнять свою функцию.
Сноска
Не существует общего соглашения о лучших методах использования http_build_query
, за исключением того факта, что его следует передавать через htmlspecialchars
, как и любой другой вывод в контексте HTML.
Laravel использует http_build_query($array, null, '&', PHP_QUERY_RFC3986)
CodeIgniter использует http_build_query($query)
Symfony использует http_build_query($extra, '', '&', PHP_QUERY_RFC3986)
Тонкий использует http_build_query($queryParams)
CakePHP использует http_build_query($query)
Веточка использует http_build_query($url, '', '&', PHP_QUERY_RFC3986)