Если вам нужно передать данные в URL в PHP, вы наверняка сталкивались с функцией urlencode()
. А может быть, слышали и о rawurlencode()
. И ещё третья функция — http_build_query()
— всплывает в ответах на форумах и в рекомендациях официальной документации.
Так когда использовать каждую из них? И в чём вообще разница между ними? Разберёмся на практике, без теории ради теории.
Что делают urlencode()
и rawurlencode()
Обе функции кодируют строку, превращая «опасные» символы (пробелы, амперсанды, знаки вопроса и др.) в безопасную форму для вставки в URL. Но делают это немного по-разному.
urlencode()
- Преобразует пробел в знак +
- Остальные специальные символы — в последовательности вида %XX
Пример:
1 2 |
echo urlencode('Привет мир!'); // %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82+%D0%BC%D0%B8%D1%80%21 |
rawurlencode()
- Преобразует все специальные символы в
%XX
- Пробел — в
%20
(а не+
!)
Пример:
1 |
echo rawurlencode('Привет мир!');<br>// %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80%21 |
Где использовать: путь или параметры?
Чтобы выбрать нужную функцию, важно понимать, где именно вы вставляете строку: в путь URL или в параметры запроса (query string).
Путь URL → rawurlencode()
Если строка идёт в путь — например, имя файла или slug — используйте rawurlencode()
. Это позволит сохранить корректную структуру URL.
1 2 3 4 |
$filename = "my image.png"; $url = "https://example.com/images/" . rawurlencode($filename); // https://example.com/images/my%20image.png |
Параметры запроса → urlencode()
(или лучше http_build_query()
)
Если вы передаёте параметры после ?
, например ?name=John Doe&age=30
, можно использовать urlencode()
— но ещё лучше довериться http_build_query()
.
Почему http_build_query()
лучше для параметров
Функция http_build_query()
специально создана для генерации строки параметров из массива. Она:
- Правильно кодирует ключи и значения
- Автоматически расставляет
&
между параметрами - Использует
urlencode()
внутри
1 2 3 4 5 6 7 |
$params = [ 'name' => 'John Doe', 'age' => 30, ]; echo http_build_query($params); // name=John+Doe&age=30 |
Это предпочтительный способ передавать параметры, потому что он надёжный и безопасный.
Типичные ошибки
Неправильно: использовать urlencode()
для путей
1 |
$url = "https://site.com/files/" . urlencode("my file.txt");<br>// → https://site.com/files/my+file.txt (некорректно) |
Правильно:
1 |
$url = "https://site.com/files/" . rawurlencode("my file.txt");<br>// → https://site.com/files/my%20file.txt |
Собираем параметры вручную:
1 2 3 |
$query = "name=" . urlencode("John Doe") . "&age=30"; // рабочий вариант, но лучше $query = http_build_query(['name' => 'John Doe', 'age' => 30]); |
Чтобы избежать проблем с URL в PHP:
- Используйте
rawurlencode()
для пути (например, файлов или slug’ов) - Используйте
http_build_query()
для параметров запроса urlencode()
— устаревший, но ещё применимый способ кодирования отдельных значений в параметрах
Такой подход сделает ваши URL безопасными, совместимыми и легко читаемыми как браузером, так и сервером.