PHP и MySQL: практические примеры и решения

Раздел: PHP и MySQL -> Примеры кода

Основы работы с MySQL в PHP: практические примеры

Наиболее эффективным и современным способом взаимодействия PHP с MySQL является использование расширения PDO (PHP Data Objects) с подготовленными запросами. Этот подход гарантирует защиту от SQL-инъекций, удобен для работы с разными СУБД и предоставляет единообразный интерфейс.


<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    die('Ошибка подключения: ' . $e->getMessage());
}
?>

Php mysql пример (примеры кода php mysql)

Соединение устанавливается один раз и используется во всех запросах. Подготовленные запросы повышают производительность при многократном вызове одного запроса с разными параметрами.

Типичные проблемы: некорректный DSN, неверные учётные данные, отсутствие драйвера PDO для MySQL. Решение: проверить наличие расширения php_pdo_mysql в php.ini, проверить имя базы данных и порт.

Как выполнить выборку данных с условиями?


$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE status = ?');
$stmt->execute([1]);
$users = $stmt->fetchAll();

пример php страницы (пример страницы на php)

Вопрос решён: параметры передаются отдельно, данные экранируются автоматически.

Ошибка: забыли использовать execute() с массивом параметров. Иначе запрос вернёт пустой результат.

Как безопасно вставить новую запись?


$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute([':name' => 'Иван', ':email' => 'ivan@example.com']);
$newId = $pdo->lastInsertId();

задание php (задания по php)

Использование именованных плейсхолдеров улучшает читаемость. Типичная ошибка - несовпадение имён плейсхолдеров с ключами массива.

Как обновить данные без риска инъекции?


$stmt = $pdo->prepare('UPDATE users SET name = ? WHERE id = ?');
$stmt->execute(['Пётр', 5]);

коды php скрипты (примеры кода php)

Аналогично вставке, но с использованием WHERE.

Проблема: обновление сразу всех записей из-за отсутствия условия WHERE. Проверять наличие условия перед выполнением.

Как удалить запись с проверкой существования?


$stmt = $pdo->prepare('DELETE FROM users WHERE id = ?');
$stmt->execute([10]);
if ($stmt->rowCount() === 0) {
    echo 'Запись не найдена';
}

Метод rowCount() возвращает количество затронутых строк.

Как обработать исключения при работе с БД?


try {
    $stmt = $pdo->query('SELECT * FROM non_existent_table');
} catch (PDOException $e) {
    error_log('Ошибка: ' . $e->getMessage());
    echo 'Произошла ошибка запроса.';
}

Журналирование ошибок и показ пользователю общего сообщения - хорошая практика.

Ошибка: не включать режим исключений (ERRMODE_EXCEPTION) - тогда ошибки останутся незамеченными.

Как использовать MySQLi (процедурный стиль) для простых проектов?


$conn = mysqli_connect('localhost', 'root', '', 'testdb');
if (!$conn) {
    die('Ошибка: ' . mysqli_connect_error());
}
$result = mysqli_query($conn, 'SELECT * FROM users');
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'] . '<br>';
}

Проще для начинающих, но требует ручного экранирования (mysqli_real_escape_string).

Проблема: забыли освободить результат (mysqli_free_result) и закрыть соединение (mysqli_close).

Расширенные примеры работы с MySQL в PHP

Транзакции с PDO

Пример

$pdo->beginTransaction();
try {
    $pdo->exec('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
    $pdo->exec('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    echo 'Перевод отменён: ' . $e->getMessage();
}

Гарантирует, что обе операции выполнятся или ни одна.

Массовая вставка с подготовленным запросом

Пример

$data = [
    ['Анна', 'anna@mail.com'],
    ['Ольга', 'olga@mail.com'],
];
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
foreach ($data as $row) {
    $stmt->execute($row);
}

Многократное использование prepare() увеличивает производительность.

Работа с хранимыми процедурами

Пример

$stmt = $pdo->prepare('CALL get_users_by_status(:status)');
$stmt->execute([':status' => 'active']);
$users = $stmt->fetchAll();

Удобно для инкапсуляции сложной логики.

Получение результатов в разных форматах

Пример

$stmt = $pdo->query('SELECT * FROM users');

// fetch as object
$usersObj = $stmt->fetchAll(PDO::FETCH_OBJ);

// fetch as key-value pairs
$pairs = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

Выбор формата упрощает дальнейшую обработку.

Обработка ошибок с логированием

Пример

try {
    $pdo->query('SELECT * FROM missing_table');
} catch (PDOException $e) {
    $logMessage = date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL;
    file_put_contents('db_errors.log', $logMessage, FILE_APPEND);
    echo 'Системная ошибка, попробуйте позже.';
}

Никогда не выводите детали ошибки пользователю в production.

Пример с миграциями (создание таблицы)

Пример

$pdo->exec('
    CREATE TABLE IF NOT EXISTS posts (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        content TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
');
echo 'Таблица создана или уже существует.';

Использование IF NOT EXISTS предотвращает повторное создание.

Работа с JSON-полями MySQL (с версии 5.7)

Пример

$stmt = $pdo->prepare('INSERT INTO products (name, attributes) VALUES (?, ?)');
$attrs = json_encode(['color' => 'red', 'size' => 'L']);
$stmt->execute(['Футболка', $attrs]);

// получение данных
$stmt = $pdo->query('SELECT name, JSON_EXTRACT(attributes, "$.color") FROM products');
$data = $stmt->fetchAll(PDO::FETCH_NUM);
foreach ($data as $row) {
    echo $row[0] . ' - цвет: ' . $row[1] . '<br>';
}

Позволяет хранить гибкие структуры без дополнительных таблиц.

Примеры кода PHP MySQL - comments

En
Php mysql пример (php)