Изучаем PHP и MySQL правильно с нуля

С чего начать изучать PHP и MySQL? Запустите локальный сервер, создайте таблицу заметок, подключите PHP к базе через PDO и выведите записи в браузер. За один вечер вы получите рабочую динамическую страницу, а затем поймете, какие темы изучать дальше.

Как PHP и MySQL работают вместе

Браузер отправляет запрос веб-серверу. Сервер передает PHP-файл интерпретатору, а PHP при необходимости обращается к базе данных.

PHP формирует HTML-страницу по запросу браузера

PHP получает строки из MySQL или MariaDB и подставляет их в HTML.

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

MySQL хранит записи для 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.

  1. Откройте панель управления XAMPP.
  2. Нажмите «Start» рядом с Apache. В панели появится состояние запущенной службы.
  3. Нажмите «Start» рядом с компонентом базы данных. Его состояние также изменится на запущенное.
  4. Откройте каталог htdocs внутри каталога XAMPP.
  5. Создайте папку 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.

  1. Откройте указанный файл php.ini.
  2. Найдите строку ;extension=pdo_mysql или ;extension=php_pdo_mysql.dll.
  3. Удалите точку с запятой в начале строки.
  4. Сохраните файл и перезапустите Apache.
  5. Снова откройте страницу диагностики и найдите в 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-запросом.

  1. Синтаксис и типы данных. Изучите условия, циклы, строки, числа и преобразования.
  2. Массивы и функции. Научитесь группировать данные и выносить повторяющиеся действия.
  3. Формы и сессии. Разберите GET и POST, серверную проверку и хранение состояния пользователя.
  4. ООП. Освойте классы, интерфейсы, исключения и пространства имен.
  5. Composer и PSR. Подключайте зависимости через Composer и изучайте стандарты PSR.
  6. Git. Делайте небольшие коммиты и храните пароль базы вне публичного репозитория.
  7. Фреймворк. После основ PHP выберите Laravel или Symfony.

Справочник языка ищите в официальной документации PHP. Возможности PDO описаны в руководстве PDO, а синтаксис базы – в документации MySQL.

Совет от нашей редакции: сохраните рабочую копию проекта после первой записи и меняйте в ней по одной вещи. Так связь между формой, PHP-кодом и строкой базы останется понятной.

Комментарии

Оставьте свой комментарий
И
Иван

Мне понравилась картинка с подписью "Три слона, на которых держится виртуальный мир" на которой Три кита

НН
незнайка на луне

дададада

Е
Евгений

Автору + за "Поэтому новичкам больше подойдет самоучитель PHP для чайников, а не продвинутый справочник для профессионалов. Тогда и камень веб-науки окажется не таким уж и твердым" - это правильно сказано, я сам новенький в этих делах, и сразу полез в ООП не изучив основы, в итоге год в пустую. совет от меня, побольше практики, ставим себе задачи (ну или ищем в интернете) и выполняем их.