Создание адресов с опцией option: PHP-методы и решения

Раздел: PHP веб-разработка -> Формы и ссылки

Формирование ссылки с параметром option

Основной способ: использование суперглобального массива $_GET и атрибута href

Для передачи параметра option через URL в скрипт index.php применяется конструкция index.php?option=значение. В PHP значение извлекается через $_GET['option']. Пример простейшей ссылки:


<a href="index.php?option=home">Главная</a>

ссылка index php option (формирование ссылки с параметром option в index.php)

При переходе по такой ссылке сервер получит запрос GET /index.php?option=home, и в коде можно обработать параметр:


<?php
$option = $_GET['option'] ?? 'default';
echo 'Выбрана опция: ' . htmlspecialchars($option);
?>

Этот подход подходит для простой навигации, где каждая опция соответствует отдельному разделу.

Как создать ссылку с параметром option, если в URL уже есть другие параметры?

Необходимо сохранить существующие GET-параметры и добавить новый. Для этого применяется функция http_build_query().


<?php
$params = $_GET;
$params['option'] = 'contacts';
$url = 'index.php?' . http_build_query($params);
?>
<a href="<?= htmlspecialchars($url) ?>">Контакты</a>

Функция автоматически экранирует значения. Этот вариант удобен при реализации фильтрации или постраничной навигации, когда нужно сохранить состояние.

Как передать параметр option через форму методом GET?

Иногда удобнее использовать форму с кнопками или выпадающим списком.


<form method="get" action="index.php">
  <select name="option">
    <option value="news">Новости</option>
    <option value="about">О нас</option>
  </select>
  <button type="submit">Перейти</button>
</form>

При отправке формируется URL index.php?option=news. Этот метод подходит для выбора раздела без необходимости вручную редактировать ссылки.

Как обработать параметр option с проверкой безопасности?

Для предотвращения XSS-атак следует фильтровать и экранировать значение. Рекомендуется использовать белый список допустимых опций.


<?php
$allowed = ['home', 'about', 'contacts'];
$option = $_GET['option'] ?? 'home';
if (!in_array($option, $allowed)) {
    $option = 'home';
}
?>

Такой подход применяется в системах маршрутизации малого масштаба.

Типичная ошибка: внедрение нежелательных параметров

Если просто конкатенировать строки без экранирования, злоумышленник может добавить дополнительные параметры. Пример уязвимости:


<!-- Опасно: -->
<a href="index.php?option=<?= $_GET['user_input'] ?>">ссылка</a>

Как избежать? Всегда использовать htmlspecialchars() при выводе в атрибут href и urlencode() при построении URL.


<a href="index.php?option=<?= urlencode($option) ?>">
  <?= htmlspecialchars($option) ?>
</a>

Другая распространенная проблема – дублирование параметра option при повторном использовании http_build_query() с $_GET, если значение уже было в строке. Решение – перезаписывать ключ.

Расширенные примеры построения ссылок с параметром option

Динамическое формирование ссылок с сохранением всех параметров

Пример функции, которая возвращает URL с новым значением option, сохраняя остальные GET-параметры:

Пример

<?php
function getOptionUrl($newOption) {
    $params = $_GET;
    $params['option'] = $newOption;
    return 'index.php?' . http_build_query($params);
}
?>
<a href="<?= getOptionUrl('gallery') ?>">Галерея</a>

Ссылка с параметром option в условной навигации (breadcrumbs)

Пример

<?php
$current = $_GET['option'] ?? 'home';
$breadcrumbs = [
    'home' => 'Главная',
    'catalog' => 'Каталог',
    'product' => 'Товар'
];
?>
<nav>
  <a href="index.php?option=home">Главная</a>
  <?php if ($current != 'home'): ?>
    > <span><?= $breadcrumbs[$current] ?? 'Неизвестно' ?></span>
  <?php endif; ?>
</nav>

Многоуровневые параметры (опция + подопция)

Пример

<?php
$params = ['option' => 'shop', 'sub' => 'phones'];
$url = 'index.php?' . http_build_query($params);
?>
<a href="<?= $url ?>">Телефоны</a>
<!-- Результат: index.php?option=shop&sub=phones -->

Обработка опции с помощью switch без экранирования

Пример

<?php
$option = $_GET['option'] ?? 'home';
switch ($option) {
    case 'about':
        include 'about.php';
        break;
    case 'contacts':
        include 'contacts.php';
        break;
    default:
        include 'home.php';
}
?>

Генерация ссылок для пагинации с сохранением опции

Пример

<?php
$page = $_GET['page'] ?? 1;
$option = $_GET['option'] ?? 'list';
$nextPage = $page + 1;
$params = ['option' => $option, 'page' => $nextPage];
$nextUrl = 'index.php?' . http_build_query($params);
?>
<a href="<?= $nextUrl ?>">Следующая страница</a>

Использование массива опций в URL (например, option[])

Пример

<?php
// Ссылка с несколькими значениями:
$url = 'index.php?option[]=news&option[]=sport';
// В PHP: $_GET['option'] станет массивом ['news', 'sport']
?>
<a href="<?= $url ?>">Новости и спорт</a>
При переходе по этой ссылке можно обработать массив опций:
<?php
if (isset($_GET['option']) && is_array($_GET['option'])) {
    foreach ($_GET['option'] as $opt) {
        echo htmlspecialchars($opt) . '<br>';
    }
}
?>

Формирование ссылки с проверкой существующего параметра option

Пример

<?php
$currentOption = $_GET['option'] ?? null;
$url = 'index.php?' . ($currentOption ? 'option=' . urlencode($currentOption) : '');
?>
<a href="<?= $url ?>">Текущая opция</a>

Результат выполнения функций с экранированием:

// Если $_GET['option'] = 'home   &'
// urlencode даст: home+++%26
// htmlspecialchars при выводе: home   &

Формирование ссылки с параметром option в index.php - comments

En
ссылка index php option (php)