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>';
}
Позволяет хранить гибкие структуры без дополнительных таблиц.