HTML и PHP: совместная работа на веб-странице
Основной способ: встраивание PHP в HTML через файлы .php
Наиболее эффективное решение для создания динамических веб-страниц - использование файлов с расширением .php. Сервер обрабатывает такой файл, исполняет код внутри специальных тегов <?php ... ?>, а результат (вместе с остальным HTML) отправляется браузеру. Это позволяет гибко вставлять данные, условия, циклы прямо в разметку. Например:
<!DOCTYPE html>
<html>
<head><title>Приветствие</title></head>
<body>
<h2><?php echo 'Добро пожаловать!'; ?></h2>
<p>Сегодня <?= date('d.m.Y') ?></p>
</body>
</html>В этом примере тег <?= ?> (сокращение от <?php echo ?>) выводит текущую дату. После обработки сервером браузер получит чистый HTML.
Типичные проблемы:
- Забытый закрывающий тег ?> в конце PHP-блока - может вызвать ошибку синтаксиса.
- Использование коротких тегов <? ?> без настройки short_open_tag - код не выполнится.
- Попытка запустить файл .html с PHP-кодом - сервер не обработает его как PHP (если только не настроены специальные правила).
Решение: всегда проверяйте закрытие тегов, используйте полные теги <?php ?> для совместимости, и сохраняйте файлы с расширением .php.
Как вставить PHP-код в HTML-файлы с другим расширением?
Иногда требуется обрабатывать файлы .htm или .html как PHP. Для этого на сервере (Apache, Nginx) настраивается обработчик, который указывает, что файлы с определённым расширением должны передаваться интерпретатору PHP. Например, в .htaccess:
AddType application/x-httpd-php .htm .htmlПосле этого даже файлы page.htm с PHP-кодом будут обработаны. Однако это создаёт нагрузку на сервер (все .html файлы будут проверяться), поэтому применяется редко и обычно только для отдельных директорий.
Проблема: производительность и безопасность.
Если все HTML-файлы обрабатывать через PHP, каждый запрос к статическому ресурсу потребляет ресурсы интерпретатора. Кроме того, злоумышленник может попытаться вставить PHP-код в загружаемые файлы (например, через уязвимость). Решение: использовать такой метод только для строго определённых файлов, лучше через директиву <FilesMatch> в Apache.
Как разделить PHP-логику и HTML-шаблон?
Для поддержки чистоты кода часто используют подход, когда основной PHP-файл подготавливает данные, а затем подключает HTML-шаблон с помощью include или require. Пример:
<?php
$title = 'Главная';
$content = 'Привет, мир!';
include 'template.php';
?>В template.php только HTML с PHP-вставками:
<!DOCTYPE html>
<html>
<head><title><?= $title ?></title></head>
<body>
<p><?= $content ?></p>
</body>
</html>Преимущество: логика и представление разделены, упрощается сопровождение.
Ошибки при подключении: неправильный путь.
Если файл не найден, require выдаст фатальную ошибку. Используйте абсолютные пути или константу __DIR__ для надёжности: require __DIR__ . '/template.php';
Какие есть альтернативы стандартным тегам PHP?
Кроме <?php ?> существуют короткие теги <? ?> (если включена директива short_open_tag), а также <% %> (ASP-стиль, устарел) и <script language="php"></script> (редко). На практике рекомендуется использовать только <?php ?> и <?= ?>, чтобы код был переносимым и не зависел от настроек сервера.
Проблема с short_open_tag: отключён по умолчанию.
Многие хостинги отключают короткие теги. Код с <? ?> не будет работать. Использование <?= ?> всегда доступно с PHP 5.4+.
Расширенные примеры использования HTML и PHP
Цикл для генерации списка
Вывод элементов массива в виде маркированного списка:
<?php
$fruits = ['Яблоко', 'Банан', 'Апельсин'];
?>
<ul>
<?php foreach ($fruits as $fruit): ?>
<li><?= htmlspecialchars($fruit) ?></li>
<?php endforeach; ?>
</ul>Результат:
<ul>
<li>Яблоко</li>
<li>Банан</li>
<li>Апельсин</li>
</ul>Здесь используется альтернативный синтаксис управления (endforeach) для удобства чтения. Функция htmlspecialchars защищает от XSS-атак.
Обработка формы и вывод данных
Файл form.php одновременно показывает форму и обрабатывает её:
<!DOCTYPE html>
<html>
<body>
<?php
$name = $_POST['name'] ?? '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
echo '<p>Привет, ' . htmlspecialchars($name) . '!</p>';
}
?>
<form method="post">
<input type="text" name="name" placeholder="Ваше имя">
<button type="submit">Отправить</button>
</form>
</body>
</html>Результат после отправки имени "Иван": <p>Привет, Иван!</p> <form method="post">...</form>
Проверка $_SERVER['REQUEST_METHOD'] позволяет не выводить сообщение при первом GET-запросе.
Включение фрагментов и использование функций
Создадим функцию для вывода шапки и подвала, чтобы не дублировать код на каждой странице. Файл functions.php:
<?php
function showHeader($title) {
echo "<!DOCTYPE html>\n<html>\n<head><title>$title</title></head>\n<body>";
}
function showFooter() {
echo "</body>\n</html>";
}
?>Файл index.php:
<?php require 'functions.php'; ?>
<?php showHeader('Мой сайт'); ?>
<h2>Добро пожаловать</h2>
<p>Текст страницы.</p>
<?php showFooter(); ?>Результат: полный HTML-документ с шапкой и подвалом.
Такой подход уменьшает дублирование и упрощает изменение общего оформления.
Работа с несколькими файлами и условиями
Пример сайта с навигацией, где содержание зависит от параметра page в URL:
<?php
$page = $_GET['page'] ?? 'home';
$allowed = ['home', 'about', 'contact'];
if (!in_array($page, $allowed)) $page = 'home';
?>
<!DOCTYPE html>
<html>
<head><title>Мой сайт</title></head>
<body>
<nav><a href="?page=home">Главная</a> | <a href="?page=about">О нас</a> | <a href="?page=contact">Контакты</a></nav>
<div>
<?php include __DIR__ . "/$page.php"; ?>
</div>
</body>
</html>Файлы home.php, about.php, contact.php содержат только соответствующий контент. Фильтрация через $allowed предотвращает включение произвольных файлов (уязвимость LFI).
Результат при ?page=about: навигация + содержимое about.php.