Если вам нужно передать данные в 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 2 |
echo rawurlencode('Привет мир!'); // %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 2 |
$url = "https://site.com/files/" . urlencode("my file.txt"); // → https://site.com/files/my+file.txt (некорректно) |
Правильно:
|
1 2 |
$url = "https://site.com/files/" . rawurlencode("my file.txt"); // → 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 безопасными, совместимыми и легко читаемыми как браузером, так и сервером.