SQL запросы в PHP: практическое руководство с примерами

Раздел: Backend разработка -> Работа с базами данных

Основы выполнения 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 с конкатенацией пользовательских данных.

- Php mysql server (mysql сервер php)
- Php mysql (работа с mysql в php)
- Php mysqli (mysqli в php)

Расширенные примеры 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 ) )

SQL запрос в PHP - comments

En
Sql запрос php (php)