Функции MySQL в PHP: выбор подходящего инструмента

Раздел: Базы данных -> Базы данных

Какое решение для работы с MySQL в PHP считается наиболее эффективным?

Современным и безопасным подходом является использование расширения PDO (PHP Data Objects). PDO предоставляет единый интерфейс для работы с разными базами данных, поддерживает подготовленные запросы, что защищает от SQL-инъекций, и удобно обрабатывает ошибки через исключения.

Подключение к MySQL через PDO


$host = 'localhost';
$dbname = 'mydb';
$user = 'root';
$pass = '';
$charset = 'utf8';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=$charset", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Подключение выполнено';
} catch (PDOException $e) {
    echo 'Ошибка подключения: ' . $e->getMessage();
}

Function mysql php (функции mysql в php)

Пояснение: конструктор PDO принимает DSN (содержит тип базы, хост, имя БД и кодировку), имя пользователя и пароль. Атрибут ERRMODE_EXCEPTION включает режим исключений, что упрощает отладку.

Выполнение SELECT запроса с подготовленным выражением


$sql = 'SELECT id, name, email FROM users WHERE status = :status';
$stmt = $pdo->prepare($sql);
$stmt->execute([':status' => 'active']);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {
    echo $user['name'] . ' - ' . $user['email'] . '<br>';
}

Php api mysql (api с mysql в php)

Пояснение: используется именованный плейсхолдер :status. Метод prepare возвращает объект PDOStatement, затем execute передаёт значения. fetchAll получает все строки как ассоциативный массив.

Вставка данных с защитой от SQL-инъекций


$sql = 'INSERT INTO users (name, email, status) VALUES (:name, :email, :status)';
$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':name' => 'Иван',
    ':email' => 'ivan@example.com',
    ':status' => 'active'
]);
echo 'Новая запись с ID: ' . $pdo->lastInsertId();

Table entry php (php: вставка записи в таблицу)

Пояснение: подготовленное выражение автоматически экранирует значения, исключая риск инъекций.

Типичные проблемы: неверный DSN (например, забыли указать charset), неправильные учётные данные, отсутствие драйвера pdo_mysql в php.ini. Ошибка будет выброшена как исключение PDOException, которое нужно перехватывать.

Различные подходы к работе с MySQL

Как использовать устаревшие функции mysql_*?

Исторически в PHP применялись функции mysql_connect(), mysql_query() и т.д. Они полностью удалены из PHP 7.0 и не рекомендуются к использованию.


$conn = mysql_connect('localhost', 'root', '');
if (!$conn) {
    die('Ошибка: ' . mysql_error());
}
mysql_select_db('mydb', $conn);
$result = mysql_query("SELECT * FROM users WHERE name = '" . mysql_real_escape_string($_GET['name']) . "'");
while ($row = mysql_fetch_assoc($result)) {
    echo $row['name'];
}

удаленная php mysql (удаленное подключение к mysql в php)

Пояснение: для защиты приходится использовать mysql_real_escape_string, что неудобно и ненадёжно. Подготовленные запросы отсутствуют.

Ошибки: функция mysql_connect не определена в PHP 7+; возможность SQL-инъекций при неверном экранировании.

Как реализовать подключение через MySQLi в процедурном стиле?

Расширение MySQLi доступно отдельно, поддерживает подготовленные запросы.


$conn = mysqli_connect('localhost', 'root', '', 'mydb');
if (!$conn) {
    die('Ошибка: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($conn, 'SELECT id, name FROM users WHERE status = ?');
mysqli_stmt_bind_param($stmt, 's', $status);
$status = 'active';
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'];
}
mysqli_stmt_close($stmt);
mysqli_close($conn);

Php mysql примеры (примеры работы с mysql в php)

Проблемы: необходимо явно указывать типы параметров ('s' - строка, 'i' - целое), код получается громоздким.

Как работает объектный стиль MySQLi?


$mysqli = new mysqli('localhost', 'root', '', 'mydb');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('SELECT name FROM users WHERE status = ?');
$stmt->bind_param('s', $status);
$status = 'active';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['name'];
}
$stmt->close();
$mysqli->close();

Объектный синтаксис более лаконичен, но по-прежнему требует ручного указания типов.

Как выбрать между PDO и MySQLi?

PDO предпочтительнее, если нужна переносимость между СУБД (например, SQLite, PostgreSQL) или простота кода. MySQLi даёт доступ к специфическим возможностям MySQL (асинхронные запросы, множественные запросы). Но для типовых задач PDO проще и безопаснее.

- подключения базы данных php (подключение к базе данных php)

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

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

Пример

try {
    $pdo->beginTransaction();
    $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();
}
(если всё корректно) Перевод выполнен
(если ошибка) Ошибка: ...

Использование транзакций гарантирует атомарность операций.

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

Пример

$data = [
    ['name' => 'Анна', 'email' => 'anna@site.com'],
    ['name' => 'Петр', 'email' => 'petr@site.com'],
];
$sql = 'INSERT INTO users (name, email) VALUES (:name, :email)';
$stmt = $pdo->prepare($sql);
foreach ($data as $row) {
    $stmt->execute($row);
}
echo 'Добавлено ' . count($data) . ' записей';

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

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

Пример

$mysqli = new mysqli('localhost', 'root', '', 'mydb');
if ($mysqli->connect_error) die('Ошибка');
$stmt = $mysqli->prepare('CALL get_users_by_status(?)');
$stmt->bind_param('s', $status);
$status = 'active';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['name'] . '<br>';
}
$stmt->close();
$mysqli->close();
Иван
Мария

Получение метаданных о столбцах через PDO

Пример

$stmt = $pdo->query('SELECT * FROM users LIMIT 0');
$colCount = $stmt->columnCount();
for ($i = 0; $i < $colCount; $i++) {
    $colMeta = $stmt->getColumnMeta($i);
    echo $colMeta['name'] . ' - ' . $colMeta['native_type'] . '<br>';
}
id - INT
name - VARCHAR
email - VARCHAR
status - VARCHAR

Асинхронные запросы в MySQLi (только для объектного стиля)

Пример

$mysqli = new mysqli('localhost', 'root', '', 'mydb');
$mysqli->query('SELECT SLEEP(2)', MYSQLI_ASYNC);
$mysqli->query('SELECT 1', MYSQLI_ASYNC);
$links = [$mysqli];
$errors = $reject = [];
mysqli_poll($links, $errors, $reject, 1);
foreach ($links as $link) {
    if ($result = $link->reap_async_query()) {
        print_r($result->fetch_row());
    }
}

Асинхронные запросы позволяют не блокировать выполнение скрипта, но требуют внимательной обработки.

Функции MySQL в PHP - comments

En
Function mysql php (php)