Изучаем PHP и MySQL правильно с нуля
С чего начать изучать PHP и MySQL? Запустите локальный сервер, создайте таблицу заметок, подключите PHP к базе через PDO и выведите записи в браузер. За один вечер вы получите рабочую динамическую страницу, а затем поймете, какие темы изучать дальше.
- Как PHP и MySQL работают вместе
- Что установить для первого проекта
- Установка XAMPP и первый PHP-скрипт
- Создаем базу данных и таблицу заметок
- Базовые SQL-запросы для таблицы notes
- Подключение PHP к MySQL через PDO
- Динамическая страница с формой и списком
- Ошибки при подключении PHP к MySQL
- Что изучать после первой страницы
Как PHP и MySQL работают вместе
Браузер отправляет запрос веб-серверу. Сервер передает PHP-файл интерпретатору, а PHP при необходимости обращается к базе данных.

PHP получает строки из MySQL или MariaDB и подставляет их в HTML.
Браузер получает готовую страницу и не видит исходный PHP-код.

В учебном проекте таблица notes хранит идентификатор, текст заметки и время создания. Форма отправляет текст PHP, а PHP записывает его в таблицу.
Что установить для первого проекта
Новичку нужен локальный сервер с PHP, сервер базы данных, инструмент для просмотра базы и редактор кода. Сборка компонентов экономит время на ручной настройке.
Для инструкции возьмите XAMPP. В панели XAMPP запустите веб-сервер и компонент базы данных, который входит в выбранную сборку. Учебные SQL-запросы и подключение через PDO подходят для MySQL и MariaDB.
Альтернативы – Laragon и OpenServer Panel. Встроенный сервер PHP подойдет для проверки страницы без базы данных:
php -S localhost:8000Запустите команду из каталога проекта и откройте http://localhost:8000. Для нашего проекта все равно понадобится отдельно запущенный сервер MySQL или MariaDB.
Docker оставьте на следующий этап.
Контейнеры помогают повторять окружение, но добавляют настройку сети, томов и образов.
Для кода установите Visual Studio Code и добавьте расширение PHP Intelephense. PhpStorm подойдет для большого PHP-проекта и дает больше встроенных инструментов.
Установка XAMPP и первый PHP-скрипт
Скачайте XAMPP с сайта Apache Friends и установите его. Инструкция с панелью управления и командами диагностики рассчитана на Windows.
- Откройте панель управления XAMPP.
- Нажмите «Start» рядом с Apache. В панели появится состояние запущенной службы.
- Нажмите «Start» рядом с компонентом базы данных. Его состояние также изменится на запущенное.
- Откройте каталог
htdocsвнутри каталога XAMPP. - Создайте папку
php-course, а внутри нее файлindex.php.
В index.php вставьте диагностический скрипт:
<?php
phpinfo();Сохраните файл в UTF-8 без добавочного расширения .txt. Откройте http://localhost/php-course/index.php. Страница с таблицей параметров PHP подтвердит запуск интерпретатора и покажет его версию.
Запишите значение Loaded Configuration File. Оно показывает активный файл настроек PHP.
После проверки удалите вызов phpinfo(), потому что диагностическая страница раскрывает параметры окружения.
Создаем базу данных и таблицу заметок
SQL-вариант дает воспроизводимый результат. Откройте phpMyAdmin по адресу http://localhost/phpmyadmin, выберите базу php_course после создания и просмотрите таблицу там.
Создание структуры SQL-запросом
На стартовой странице phpMyAdmin откройте вкладку «SQL». Вставьте запрос и запустите его кнопкой выполнения:
CREATE DATABASE IF NOT EXISTS php_course
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE php_course;
CREATE TABLE IF NOT EXISTS notes (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
body VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Выберите php_course в списке баз слева и откройте таблицу notes. В ней появятся столбцы id, body и created_at. Запрос SHOW CREATE TABLE notes; покажет ключ, автоинкремент и кодировку.
Просмотр результата в phpMyAdmin
Откройте таблицу notes и выберите просмотр строк. Пока таблица пуста, список записей будет пустым. Добавьте первую строку SQL-запросом в следующем разделе.
Базовые SQL-запросы для таблицы notes
Открывайте вкладку «SQL» в выбранной базе и выполняйте запросы по одному. После каждого запроса смотрите строки таблицы или сообщение о числе измененных записей.
Добавление строки
INSERT INTO notes (body)
VALUES ('Первая заметка');Откройте просмотр таблицы notes. В списке появится строка с текстом заметки, идентификатором и временем создания.
Выборка строк
SELECT id, body, created_at
FROM notes
WHERE id > 0
ORDER BY id DESC
LIMIT 10;Запрос вернет до 10 строк с положительным идентификатором.
Сортировка по убыванию покажет новые записи первыми.
Изменение строки
UPDATE notes
SET body = 'Измененная заметка'
WHERE id = 1;Подставьте идентификатор существующей записи. Повторный SELECT покажет новый текст. Условие WHERE ограничивает изменение одной строкой.
Удаление строки
DELETE FROM notes
WHERE id = 1;Перед удалением выполните SELECT * FROM notes WHERE id = 1;. После DELETE повторный запрос не вернет выбранную строку.
Подключение PHP к MySQL через PDO
PDO дает PHP единый интерфейс для базы.
DSN задает сервер, базу и кодировку. Режим исключений позволяет обработать ошибку подключения.
Параметры подключения вне публичного каталога
Создайте папку php-course-private внутри каталога XAMPP, рядом с htdocs. В ней создайте файл database.php. Структура проекта получится такой:
xampp/
php-course-private/
database.php
htdocs/
php-course/
db.php
index.phpПапка с настройками находится вне htdocs и каталога проекта. Не добавляйте ее в публичный репозиторий и не настраивайте для нее веб-доступ.
В database.php вставьте массив параметров:
<?php
return [
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'php_course',
'user' => 'root',
'password' => '',
];Пустой пароль подходит только для локальной учетной записи без пароля.
Если вы задавали пароль пользователю базы, впишите его в password. В user укажите имя этой учетной записи. Для другого порта замените 3306 в port портом работающего сервера базы.
Значения остаются PHP-строками в одинарных кавычках. Внутри пароля записывайте одинарную кавычку как \', а обратную косую черту как \\.
Файл соединения и проверка параметров
Создайте db.php рядом с index.php:
<?php
$config = require dirname(__DIR__, 2) . '/php-course-private/database.php';
$dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$config['database']};charset=utf8mb4";
try {
$pdo = new PDO($dsn, $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $exception) {
error_log($exception->getMessage());
http_response_code(500);
exit('Не удалось подключиться к базе.');
}Выражение dirname(__DIR__, 2) поднимается из htdocs/php-course в каталог XAMPP. PHP читает настройки через require при запуске скрипта. Способ работает и через Apache, и через встроенный сервер PHP.
Сохраните оба файла в UTF-8 без BOM. Закрывающий тег PHP в них не добавляйте.
Временно замените содержимое index.php:
<?php
require __DIR__ . '/db.php';
$result = $pdo->query(
"SELECT CONCAT(DATABASE(), ' | ', CURRENT_USER(), ' | port=', @@port)"
)->fetchColumn();
echo 'Подключение работает: ';
echo htmlspecialchars($result, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');Откройте http://localhost/php-course/index.php. Надпись покажет выбранную базу, учетную запись сервера и его порт. Имя базы должно совпасть с php_course, а порт – с настройкой port.
Если вы меняете пароль или порт, сохраните database.php и обновите страницу. Успешный ответ подтвердит соединение с новыми параметрами без перезапуска Apache. Сам пароль скрипт не выводит.
mysqli остается альтернативой PDO, а функции mysql_* удалены из PHP 7 и новее.
Динамическая страница с формой и списком
Верните в index.php полный пример. Он принимает POST-запрос, добавляет текст подготовленным выражением и экранирует каждое значение перед выводом.
<?php
require __DIR__ . '/db.php';
function escape(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
$error = '';
$body = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = $_POST['body'] ?? '';
$body = is_string($input) ? trim($input) : '';
if ($body === '') {
$error = 'Введите текст заметки.';
} elseif (mb_strlen($body, 'UTF-8') > 255) {
$error = 'Введите текст длиной до 255 символов.';
} else {
$statement = $pdo->prepare(
'INSERT INTO notes (body) VALUES (:body)'
);
$statement->execute(['body' => $body]);
header('Location: index.php', true, 303);
exit;
}
}
$statement = $pdo->query(
'SELECT id, body, created_at FROM notes ORDER BY id DESC LIMIT 100'
);
$notes = $statement->fetchAll();
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Заметки</title>
</head>
<body>
<h1>Заметки</h1>
<?php if ($error !== ''): ?>
<p role="alert"><?= escape($error) ?></p>
<?php endif; ?>
<form method="post" action="index.php">
<label for="body">Текст заметки</label>
<textarea id="body" name="body" maxlength="255" required><?= escape($body) ?></textarea>
<button type="submit">Добавить</button>
</form>
<ul>
<?php foreach ($notes as $note): ?>
<li><?= escape($note['body']) ?> – <small><?= escape($note['created_at']) ?></small></li>
<?php endforeach; ?>
</ul>
</body>
</html>Откройте страницу, введите текст и нажмите «Добавить». После перенаправления новая заметка появится первой в списке, а строка появится в таблице notes.
Подготовленное выражение передает текст отдельно от SQL-команды. Поэтому пользовательский ввод не меняет структуру запроса и снижает риск SQL-инъекции.
htmlspecialchars() заменяет специальные символы перед выводом в HTML.
Строка <em>Привет</em> отобразится обычным текстом, поэтому такой прием снижает риск XSS. Пример предназначен для локального обучения. Перед публикацией приложения добавьте авторизацию, защиту от CSRF и отдельную учетную запись базы с ограниченными правами.
Ошибки при подключении PHP к MySQL
Сначала прочитайте сообщение панели XAMPP. Затем проверьте порт, учетные данные, драйвер и кодировку.
Apache не запускается из-за порта 80 или 443
Другой веб-сервер может занять порт Apache. В командной строке выполните:
netstat -ano -p tcpНайдите слушающие строки с портами :80 и :443. Последний столбец содержит PID процесса. Подставьте его в команду:
tasklist /FI "PID eq 1234"Остановите найденный второй веб-сервер в его панели или окне служб. Если остановить его нельзя, запустите проект встроенным сервером на порту 8000. Для этого откройте терминал в папке htdocs/php-course:
php -S localhost:8000Если команда php не найдена, укажите полный путь к php.exe из папки php внутри установленного XAMPP. Например, для установки в C:\xampp команда выглядит так:
"C:\xampp\php\php.exe" -S localhost:8000Откройте http://localhost:8000/index.php. PHP заработает через другой веб-сервер, но сервер базы данных придется запускать отдельно. Чтобы остановить встроенный сервер, нажмите Ctrl+C в его терминале.
Компонент базы не запускается из-за порта 3306
Выполните netstat -ano -p tcp и найдите слушающую строку с портом :3306. Команда tasklist /FI "PID eq 1234" покажет процесс по PID.
Остановите второй MySQL или MariaDB через его панель либо службы Windows. Затем повторно запустите компонент базы в XAMPP.
Если второй сервер нужен, можно использовать его для учебного проекта. Создайте на нем базу php_course и таблицу notes приведенным SQL-запросом. В файле php-course-private/database.php укажите его порт, пользователя и пароль.
Обновите страницу проверки подключения: она должна показать выбранную базу и порт этого сервера.
Access denied for user 'root'@'localhost'
Сервер отклонил учетные данные или доступ пользователя с указанного адреса. Откройте php-course-private/database.php в каталоге XAMPP.
Впишите в user и password учетные данные вашей локальной базы. Проверьте host и port: PHP мог обратиться к другому экземпляру сервера.
Сохраните файл и обновите страницу проверки подключения. Успешный ответ покажет базу, учетную запись и порт без раскрытия пароля.
Подробности ошибки соединения код записывает в журнал ошибок PHP через error_log(). Только при локальной диагностике можно временно заменить строку exit('Не удалось подключиться к базе.'); таким выводом:
exit(htmlspecialchars(
$exception->getMessage(),
ENT_QUOTES | ENT_SUBSTITUTE,
'UTF-8'
));После диагностики верните общее сообщение: подробности ошибки раскрывают параметры подключения.
could not find driver
PHP не загрузил расширение pdo_mysql. Откройте страницу phpinfo() и найдите значение Loaded Configuration File.
- Откройте указанный файл
php.ini. - Найдите строку
;extension=pdo_mysqlили;extension=php_pdo_mysql.dll. - Удалите точку с запятой в начале строки.
- Сохраните файл и перезапустите Apache.
- Снова откройте страницу диагностики и найдите в
PDO driversзначениеmysql.
После изменения настроек перезапустите встроенный сервер командой php -S localhost:8000, если проект работает через него. Затем удалите диагностический вызов phpinfo().
Если форма сообщает об отсутствии mb_strlen(), включите расширение mbstring в том же активном php.ini. Для этого уберите начальную точку с запятой у строки ;extension=mbstring и перезапустите используемый веб-сервер.
Кракозябры вместо кириллицы
Поставьте utf8mb4 в таблице и DSN, добавьте в HTML строку <meta charset="utf-8">, а PHP-файлы сохраните в UTF-8.
Добавьте новую кириллическую заметку и откройте ее в браузере и phpMyAdmin. Если новая строка отображается правильно, проблема связана с кодировкой старой записи.
Что изучать после первой страницы
Двигайтесь от синтаксиса к архитектуре приложения. Каждую тему закрепляйте маленькой функцией, формой или SQL-запросом.
- Синтаксис и типы данных. Изучите условия, циклы, строки, числа и преобразования.
- Массивы и функции. Научитесь группировать данные и выносить повторяющиеся действия.
- Формы и сессии. Разберите GET и POST, серверную проверку и хранение состояния пользователя.
- ООП. Освойте классы, интерфейсы, исключения и пространства имен.
- Composer и PSR. Подключайте зависимости через Composer и изучайте стандарты PSR.
- Git. Делайте небольшие коммиты и храните пароль базы вне публичного репозитория.
- Фреймворк. После основ PHP выберите Laravel или Symfony.
Справочник языка ищите в официальной документации PHP. Возможности PDO описаны в руководстве PDO, а синтаксис базы – в документации MySQL.
Совет от нашей редакции: сохраните рабочую копию проекта после первой записи и меняйте в ней по одной вещи. Так связь между формой, PHP-кодом и строкой базы останется понятной.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Как сделать редирект на PHP 6 мин чтения
- Основы ООП в PHP: принципы и примеры 6 мин чтения
- Адаптивный помесячный календарь на AJAX и PHP 2 мин чтения
- Как создать формы регистрации и авторизации на PHP 5 мин чтения
Комментарии
Мне понравилась картинка с подписью "Три слона, на которых держится виртуальный мир" на которой Три кита
дададада
Автору + за "Поэтому новичкам больше подойдет самоучитель PHP для чайников, а не продвинутый справочник для профессионалов. Тогда и камень веб-науки окажется не таким уж и твердым" - это правильно сказано, я сам новенький в этих делах, и сразу полез в ООП не изучив основы, в итоге год в пустую. совет от меня, побольше практики, ставим себе задачи (ну или ищем в интернете) и выполняем их.