SQL запросы в PHP: практическое руководство с примерами
Основы выполнения SQL запросов в PHP
Взаимодействие с базами данных через PHP требует отправки SQL запросов и получения результатов. Для этого используются расширения PDO или mysqli. Выбор подхода влияет на безопасность и удобство.
Эффективное решение: PDO с подготовленными выражениями
Как выполнить SQL запрос в PHP с защитой от инъекций?
// Подключение к базе данных через PDO
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$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) {
echo 'Ошибка подключения: ' . $e->getMessage();
exit;
}
// Подготовленный запрос SELECT
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE email = :email');
$stmt->execute(['email' => 'user@example.com']);
$user = $stmt->fetch();
echo $user['name'];Phpmyadmin php (phpmyadmin в php)
Пояснения: DSN содержит тип СУБД, хост, имя базы и кодировку. Опции включают режим исключений и режим выборки. Подготовленный запрос отделяет структуру SQL от данных, что предотвращает инъекции. Параметры передаются в execute ассоциативным массивом.
// Вставка данных
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute(['name' => 'Иван', 'email' => 'ivan@example.com']);
echo 'ID новой записи: ' . $pdo->lastInsertId();Php having (оператор having в sql (php))
// Обновление
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$stmt->execute(['name' => 'Петр', 'id' => 1]);
echo 'Обновлено строк: ' . $stmt->rowCount();
Php sql (php и sql)
// Удаление
$stmt = $pdo->prepare('DELETE FROM users WHERE id = :id');
$stmt->execute(['id' => 5]);
echo 'Удалено строк: ' . $stmt->rowCount();Sql запрос php (sql запрос в php)
Типичные ошибки: неверные учетные данные (PDOException); синтаксическая ошибка в SQL (PDOException); попытка выполнить запрос без подготовки (использование query вместо prepare для пользовательских данных). Решение: применение try-catch, проверка SQL на ошибки, обязательное использование подготовленных выражений.
Альтернативный вариант: расширение mysqli
Как выполнить SQL запрос с помощью mysqli в объектном стиле?
$mysqli = new mysqli('localhost', 'root', '', 'test');
if ($mysqli->connect_error) {
die('Ошибка подключения: ' . $mysqli->connect_error);
}
$email = 'user@example.com';
// Экранирование (не рекомендуется, лучше использовать подготовленные)
$safe_email = $mysqli->real_escape_string($email);
$result = $mysqli->query("SELECT id, name FROM users WHERE email = '$safe_email'");
if ($result) {
$user = $result->fetch_assoc();
echo $user['name'];
} else {
echo 'Ошибка запроса: ' . $mysqli->error;
}Php mysql select (выборка данных из mysql)
В mysqli также доступны подготовленные выражения через
$stmt = $mysqli->prepare(...)Php mysqli подключение (подключение к mysql через mysqli)
. Для безопасности стоит применять именно их.Проблема: прямое экранирование не всегда гарантирует защиту, особенно при использовании нелинейных кодировок. Подготовленные выражения mysqli (с bind_param) более надёжны. Другая ошибка: забыть проверить результат query или prepare.
Вариант: PDO с прямым запросом (query) для статических SQL
Когда можно использовать PDO::query без подготовки?
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->query('SELECT NOW() AS current_time');
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['current_time'];Если запрос не содержит пользовательских данных, можно выполнять его через query. Это удобно для простых статических выражений.
Ошибка: вставка переменных в строку запроса без экранирования приводит к SQL-инъекции. Не следует использовать query с конкатенацией пользовательских данных.
Расширенные примеры SQL запросов в PHP
Пример 1: Транзакции с 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();
echo 'Транзакция выполнена успешно';
} catch (Exception $e) {
$pdo->rollBack();
echo 'Ошибка: ' . $e->getMessage();
}Транзакция выполнена успешно
Пример 2: Использование разных режимов выборки (FETCH_OBJ)
$stmt = $pdo->query('SELECT id, name FROM users LIMIT 3');
while ($user = $stmt->fetch(PDO::FETCH_OBJ)) {
echo $user->id . ': ' . $user->name . '
';
}1: Иван
2: Мария
3: Петр
Пример 3: Подготовленные выражения в mysqli с bind_param
$mysqli = new mysqli('localhost', 'root', '', 'test');
$stmt = $mysqli->prepare('SELECT name, email FROM users WHERE id = ?');
$id = 2;
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($name, $email);
$stmt->fetch();
echo "Имя: $name, Email: $email";
$stmt->close();Имя: Мария, Email: maria@example.com
Пример 4: Обработка ошибок в PDO с детальным выводом
try {
$pdo->exec('INVALID SQL');
} catch (PDOException $e) {
echo 'Код ошибки: ' . $e->getCode() . '
';
echo 'Сообщение: ' . $e->getMessage() . '
';
echo 'Файл: ' . $e->getFile() . '
';
echo 'Строка: ' . $e->getLine();
}Код ошибки: 42000
Сообщение: SQLSTATE[42000]: Syntax error or access violation: 1064 ...
Файл: /var/www/script.php
Строка: 15
Пример 5: Позиционные параметры в PDO
$stmt = $pdo->prepare('SELECT * FROM orders WHERE status = ? AND user_id = ?');
$stmt->execute(['active', 42]);
$orders = $stmt->fetchAll();
print_r($orders);Array ( [0] => Array ( [id] => 10 [status] => active [user_id] => 42 ) )