Функции 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 проще и безопаснее.
Расширенные примеры работы с 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());
}
}
Асинхронные запросы позволяют не блокировать выполнение скрипта, но требуют внимательной обработки.