PHP выполняется на сервере и формирует HTML до того, как страница попадёт в браузер. В гайде вы запустите локальный проект, научитесь обрабатывать форму и выводить данные без смешения пользовательского ввода с HTML.
Как пользоваться гайдом
Нужны базовые знания HTML, установленный PHP и терминал. Встроенный сервер PHP используйте только локально для обучения: он не предназначен для публичного размещения сайта.
1. Запускаем первую страницу
Создайте index.php в новой папке. Команда запускает встроенный сервер на вашем компьютере; откройте адрес http://localhost:8000/ в браузере. Если PHP не установлен, сначала настройте окружение по инструкции для вашей системы.
php -S localhost:8000
Добавьте в index.php строку и убедитесь, что текст появился в браузере.
2. Переменные, строки и числа
Имя переменной в PHP начинается со знака $. Точка соединяет строки. Число и строка — разные типы; не полагайтесь на неявное преобразование, когда считаете деньги или сравниваете значения.
<?php
$project = "Сайт компании";
$pages = 5;
echo $project . ": " . $pages . " страниц";
Создайте переменные для имени проекта и количества разделов, затем выведите предложение из них.
3. Условия и циклы
Условие if выбирает действие по результату проверки. Цикл foreach проходит по массиву. Сравнение === учитывает и значение, и тип.
<?php
$services = ["Разработка", "Дизайн", "Поддержка"];
foreach ($services as $service) {
echo $service . "<br>";
}
Выведите список услуг в HTML как элементы
4. Массивы и функции
Ассоциативный массив хранит значения по именованным ключам. Функция принимает параметры и возвращает результат через return. Если ключ может отсутствовать, проверяйте его или используйте значение по умолчанию.
<?php
$service = ["name" => "Сайт", "price" => 100000];
function formatPrice(int $value): string {
return number_format($value, 0, ".", " ") . " ₽";
}
echo formatPrice($service["price"]);
Добавьте второй массив услуги и выведите обе цены с помощью одной функции.
5. PHP внутри HTML-шаблона
PHP может собирать данные до вывода страницы. В шаблоне оставляйте разметку читаемой, а длинные вычисления выполняйте до неё. Для текста из внешнего источника понадобится экранирование — оно разобрано ниже.
<?php $title = "Наши услуги"; ?>
<!doctype html>
<html lang="ru">
<head><meta charset="utf-8"><title><?= htmlspecialchars($title, ENT_QUOTES, "UTF-8") ?></title></head>
<body><h1><?= htmlspecialchars($title, ENT_QUOTES, "UTF-8") ?></h1></body>
</html>
Создайте страницу с заголовком и списком услуг. Вынесите данные в начало файла, а HTML оставьте ниже.
6. Форма и метод POST
Форма отправляет данные на сервер. Значения из $_POST нельзя считать проверенными: поле может отсутствовать или содержать что угодно. Приведите значение к строке, удалите лишние пробелы и проверьте длину.
<?php
$name = trim((string)($_POST["name"] ?? ""));
$error = $_SERVER["REQUEST_METHOD"] === "POST" && $name === ""
? "Введите имя" : "";
?>
<form method="post">
<label>Имя <input name="name" required></label>
<button type="submit">Отправить</button>
</form>
Добавьте поле email и проверьте его с помощью filter_var($email, FILTER_VALIDATE_EMAIL).
7. Безопасный вывод в HTML
Когда выводите введённый человеком текст в HTML, заменяйте специальные символы функцией htmlspecialchars. Это правило относится к HTML-тексту и значениям атрибутов; для URL, JavaScript и SQL нужны отдельные способы обработки.
<?php
$name = trim((string)($_POST["name"] ?? ""));
$safeName = htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
echo "<p>Здравствуйте, {$safeName}!</p>";
Отправьте в поле строку Тест. На странице должны появиться сами символы, а не жирный HTML-текст.
8. Разделяем файлы проекта
Повторяемые части страницы можно вынести в отдельные файлы и подключить через require. Используйте путь от текущего файла через __DIR__, чтобы подключение не зависело от рабочей папки процесса.
<?php
$pageTitle = "Контакты";
require __DIR__ . "/partials/header.php";
// Содержимое страницы
require __DIR__ . "/partials/footer.php";
Вынесите общий заголовок и подвал в два файла. Откройте две страницы и убедитесь, что обе используют одни и те же части.
9. Запросы к базе данных без склейки SQL
Для параметров SQL используйте подготовленные запросы PDO. Не вставляйте значение из формы прямо в текст запроса: экранирование HTML не защищает SQL. На этом этапе достаточно понять разделение текста запроса и данных.
<?php
$stmt = $pdo->prepare("SELECT title FROM articles WHERE id = :id");
$stmt->execute(["id" => $articleId]);
$article = $stmt->fetch(PDO::FETCH_ASSOC);
Объясните своими словами, почему $articleId передаётся в execute(), а не дописывается в строку SQL.
10. Итоговый проект: форма обращения
Соберите страницу с полями имени, почты и сообщения. После отправки проверьте каждое поле на сервере и покажите понятные ошибки рядом с ним. Если данные корректны, покажите подтверждение; сохранение и отправку почты добавляйте только после настройки безопасности и хранения.
<?php
$name = trim((string)($_POST["name"] ?? ""));
$email = trim((string)($_POST["email"] ?? ""));
$valid = $name !== "" && filter_var($email, FILTER_VALIDATE_EMAIL);
if ($_SERVER["REQUEST_METHOD"] === "POST" && $valid) {
echo "<p>Данные получены. Это учебный пример: сообщение не отправлено.</p>";
}
Проверьте пустые поля, неверный email и строку с HTML-тегами. Затем добавьте сообщения об ошибках, сохраняя безопасный вывод.
Что изучать дальше
Официальное продолжение — учебник PHP и раздел о безопасности. Для интерфейса формы повторите CSS и JavaScript.