Короткий ответ: если кнопка просто ведет на другую страницу, PHP не нужен — сделайте ссылку, оформленную как кнопку. Если перед переходом нужно обработать форму, сохранить данные или проверить условие, тогда PHP принимает POST-запрос и делает редирект через header('Location: ...')
Главная мысль: клик происходит в браузере, а PHP работает на сервере после запроса. Поэтому нужно выбрать сценарий: обычный переход, отправка формы или серверный редирект
Вариант 1: кнопка-ссылка
Если никакой обработки не нужно, используйте ссылку
<a class="button" href="/contacts.php">Открыть контакты</a>
Стили можно сделать как у кнопки
<style>
.button {
display: inline-block;
padding: 12px 18px;
border-radius: 8px;
background: #f5c542;
color: #111827;
text-decoration: none;
font-weight: 700;
}
</style>
Это самый правильный вариант для простого перехода
Вариант 2: форма отправляется на другую страницу
<form action="/thanks.php" method="post">
<input type="text" name="name" placeholder="Ваше имя">
<button type="submit">Отправить</button>
</form>
После нажатия кнопки браузер отправит POST-запрос на thanks.php
В thanks.php можно принять данные
<?php
$name = trim($_POST['name'] ?? '');
echo 'Спасибо, ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
Такой вариант подходит, если страница результата сама обрабатывает данные
Вариант 3: PHP обрабатывает и делает редирект
Создайте form.php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
if ($name !== '') {
header('Location: /thanks.php');
exit;
}
$error = 'Введите имя';
}
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Форма с редиректом</title>
</head>
<body>
<?php if (!empty($error)): ?>
<p><?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?></p>
<?php endif; ?>
<form method="post">
<input type="text" name="name" placeholder="Ваше имя">
<button type="submit">Продолжить</button>
</form>
</body>
</html>
Если имя заполнено, PHP отправит браузер на /thanks.php. Если имя пустое, пользователь останется на форме и увидит ошибку
Почему header должен быть до HTML
Редирект через header() отправляет HTTP-заголовок. Он должен быть вызван до любого вывода HTML, пробелов или echo
Плохой пример
<p>Текст уже отправлен</p>
<?php
header('Location: /thanks.php');
exit;
Так можно получить ошибку headers already sent
Когда нужен JavaScript
Если вы хотите перейти на другую страницу без отправки формы, можно использовать JavaScript, но для обычной навигации ссылка лучше. JavaScript имеет смысл, если переход зависит от действия на странице без обращения к серверу
<button type="button" onclick="window.location.href='/contacts.php'">
Открыть контакты
</button>
Но если это обычный переход, ссылка проще, надежнее и понятнее для поисковых систем
Мини-практика
Сделайте страницу order.php с формой имени. Если имя заполнено, после отправки перейти на thanks.php. Если имя пустое, показать сообщение Введите имя. Затем замените форму на обычную ссылку-кнопку и сравните два сценария
Частые ошибки
Используют PHP там, где нужна обычная ссылка Для простого перехода достаточно <a href="...">
Пишут HTML до header Редирект должен быть до вывода страницы
Забывают exit после header После редиректа код может продолжить выполняться
Путают action формы и Location action задает адрес отправки формы, а Location отправляет браузер дальше после обработки
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- Редирект в PHP: header Location, 301, 302 и переход на другую страницу
- PHP с нуля: первый файл и вывод на страницу
- Как прикрутить меню на PHP и не копировать его в каждую страницу
- Composer в PHP: установка пакетов без ручного копирования



