Разработка PHP-страниц: основы и примеры
Создание веб-страницы на PHP
Основной подход: минимальная PHP-страница
Любая веб-страница на PHP представляет собой файл с расширением .php, содержащий HTML и встроенный PHP-код. Сервер интерпретирует PHP-блоки и отдаёт результат как чистый HTML.
<?php
echo "Hello, World!";
?>Php веб сервисы (php веб-сервисы)
Результат: в браузере отобразится строка "Hello, World!". Этот код можно поместить в файл index.php и открыть через веб-сервер (Apache/Nginx с PHP).
Пояснение шагов:
- Открывающий тег
<?phpуказывает серверу начать обработку PHP. - Команда
echoвыводит текст. - Закрывающий тег
?>возвращает управление HTML (не обязателен в конце файла).
Типичные проблемы и их решение
- Проблема: пустая страница. Решение: включить отображение ошибок через
error_reporting(E_ALL); ini_set('display_errors', 1);. - Проблема: синтаксическая ошибка (пропущена точка с запятой). Решение: проверить код на наличие синтаксических ошибок.
Как встроить PHP-код прямо в HTML-разметку?
PHP можно размещать внутри любого места HTML-документа. Пример:
<!DOCTYPE html>
<html>
<head><title>Пример</title></head>
<body>
<h1><?php echo "Добро пожаловать"; ?></h1>
<p>Сегодня <?php echo date('d.m.Y'); ?></p>
</body>
</html>Php веб страница (веб-страница на php)
Результат: заголовок и дата будут динамическими. Для коротких выражений удобен сокращённый синтаксис <?= ... ?>, который эквивалентен <?php echo ... ?>.
Типичные ошибки
- Забыт закрывающий тег
?>– после него весь остаток файла воспринимается как PHP и может вызвать ошибку. - Неправильное экранирование кавычек внутри echo – используйте одинарные кавычки или экранирование.
Как обработать данные, отправленные через HTML-форму?
Форма отправляет данные методами GET или POST. Пример обработчика process.php:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = htmlspecialchars($_POST['name']);
echo "Привет, $name!";
}
?>
<form method="post">
<input type="text" name="name">
<button>Отправить</button>
</form>
Config app php (конфигурация php приложения)
Результат: после ввода имени и отправки формы появится приветствие. Функция htmlspecialchars предотвращает XSS-атаки.
Проблемы и решения
- Не проверено существование ключа в массиве
$_POST– выдаёт warning. Решение: использоватьisset()или??. - Данные не экранированы – уязвимость XSS. Решение: всегда использовать
htmlspecialcharsпри выводе.
Как организовать код с помощью подключения внешних файлов?
Функции и конфигурацию выносят в отдельные файлы и подключают через include или require.
<?php
// config.php
$db_host = 'localhost';
$db_user = 'root';
?>
<?php
// index.php
include 'config.php';
echo "Подключение к $db_host";
?>App php route (маршрутизация в php приложении)
Результат: переменная $db_host доступна в index.php.
Типичные ошибки
- Неправильный путь к файлу –
includeвыдаёт warning, но скрипт продолжает работу. Решение: использоватьrequireдля критичных файлов, проверять путь с__DIR__. - Повторное подключение – может вызвать переопределение функций. Решение: использовать
include_once/require_once.
Как сохранять данные между запросами с помощью сессий?
Сессии позволяют хранить информацию о пользователе. Пример:
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
}
$_SESSION['count']++;
echo "Вы посетили страницу {$_SESSION['count']} раз.";
?>Default php app (настройки по умолчанию в php приложении)
Результат: при каждом обновлении страницы счётчик увеличивается.
Проблемы и решения
- Ошибка "headers already sent" –
session_start()должен вызываться до любого вывода (echo, HTML). Решение: разместить вызов в самом начале файла. - Сессия не сохраняется – проверить настройки cookie и права на папку для хранения сессий.
Как подключиться к базе данных MySQL и вывести записи?
Современный способ – PDO (PHP Data Objects). Пример подключения и выборки:
<?php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$pdo = new PDO($dsn, 'root', '');
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'] . '<br>';
}
?>App php domain (работа с доменами в php)
Результат: список имён из таблицы users.
Типичные проблемы
- SQL-инъекции при использовании конкатенации в запросе. Решение: использовать подготовленные запросы (
prepareиexecute). - Ошибка подключения (неверный хост, логин). Решение: обернуть в try-catch и вывести сообщение об ошибке.
Как сделать простую шаблонизацию с помощью PHP?
Можно хранить HTML-шаблон с плейсхолдерами и заменять их.
<?php
// template.html
$template = file_get_contents('template.html');
$template = str_replace('{title}', 'Главная', $template);
$template = str_replace('{content}', 'Добро пожаловать!', $template);
echo $template;
?>App path php (работа с путями файлов в php)
Или использовать прямое включение PHP в шаблон:
<?php
$title = 'О нас';
include 'layout.php';
?>
Где layout.php содержит HTML с <?= $title ?>.
Проблемы
- Сложность поддержки при большом количестве плейсхолдеров. Решение: использовать готовые шаблонизаторы (Twig, Blade).
- Опасность выполнения произвольного кода, если шаблон загружается из непроверенного источника.
Расширенные примеры работы с PHP-страницами
Пример 1: Простой счётчик посещений на основе файла
Счётчик хранит количество посещений в текстовом файле. Код:
<?php
$counterFile = 'counter.txt';
if (!file_exists($counterFile)) {
file_put_contents($counterFile, '0');
}
$count = (int)file_get_contents($counterFile);
$count++;
file_put_contents($counterFile, $count);
echo "Страница посещена $count раз.";
?>
Результат (после нескольких обновлений):
Страница посещена 5 раз.
Пример 2: Форма регистрации с валидацией и записью в БД
Файл register.php:
<?php
$error = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
if (empty($username) || empty($email)) {
$error = 'Заполните все поля.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error = 'Некорректный email.';
} else {
// Подключение к БД и вставка (используем подготовленный запрос)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare('INSERT INTO users (username, email) VALUES (:username, :email)');
$stmt->execute(['username' => $username, 'email' => $email]);
echo 'Регистрация прошла успешно!';
exit;
}
}
?>
<form method="post">
Имя: <input type="text" name="username" value="<?= htmlspecialchars($_POST['username'] ?? '') ?>"/><br>
Email: <input type="email" name="email"/><br>
<button>Зарегистрироваться</button>
</form>
<p style="color:red"><?= $error ?></p>
Результат при успешной регистрации:
Регистрация прошла успешно!
При незаполненном поле:
Заполните все поля.
Пример 3: Генерация JSON-списка пользователей из БД
Скрипт api/users.php возвращает JSON:
<?php
header('Content-Type: application/json');
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, username, email FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($users, JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
echo json_encode(['error' => $e->getMessage()]);
}
?>
Результат (пример вывода):
[{"id":1,"username":"Иван","email":"ivan@example.com"},{"id":2,"username":"Мария","email":"maria@example.com"}]
Пример 4: Загрузка изображения на сервер и его отображение
Файл upload.php:
<?php
$uploadDir = 'uploads/';
$message = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['image'])) {
$file = $_FILES['image'];
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($file['type'], $allowedTypes)) {
$message = 'Разрешены только JPEG, PNG, GIF.';
} elseif ($file['error'] !== UPLOAD_ERR_OK) {
$message = 'Ошибка загрузки: ' . $file['error'];
} else {
$dest = $uploadDir . uniqid() . '_' . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $dest)) {
$message = 'Файл загружен: <img src="' . htmlspecialchars($dest) . '" />';
} else {
$message = 'Не удалось сохранить файл.';
}
}
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*" required/>
<button>Загрузить</button>
</form>
<div><?= $message ?></div>
Результат после загрузки файла photo.jpg:
Файл загружен: <img src="uploads/64a1f2b3c4d5e_photo.jpg" />