HTML и PHP: совместная работа на веб-странице

Раздел: -> Основы 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.

HTML и PHP - comments

En
Htm php (php)