Взаимодействие PHP с MySQL через phpMyAdmin

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

Основные подходы к работе с MySQL в PHP

Как обеспечить безопасную и гибкую работу с базой данных из PHP?

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


// Подключение к MySQL через PDO
$dsn = 'mysql:host=localhost;dbname=test;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());
}

// Подготовленный запрос
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => 'test@example.com']);
$user = $stmt->fetch();

Phpmyadmin php (phpmyadmin в php)

Типичные проблемы:

  • Ошибка подключения из-за неверных параметров в DSN. Решение: проверять имя хоста, порт (по умолчанию 3306), имя базы, учётные данные.
  • Кодировка: без указания charset могут возникнуть проблемы с кириллицей. Рекомендуется utf8mb4.
  • Исключения: если не установлен режим исключений, ошибки могут остаться незамеченными. Устанавливайте ERRMODE_EXCEPTION.

Как использовать объектно-ориентированный интерфейс MySQLi?

Расширение MySQLi (MySQL improved) также поддерживает подготовленные запросы и объектный стиль.


$mysqli = new mysqli('localhost', 'root', '', 'test');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');

$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$email = 'test@example.com';
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();

Php having (оператор having в sql (php))

Возможные ошибки:

  • Неверный тип привязки переменных (s, i, d, b). Проверяйте соответствие.
  • Забыли закрыть соединение – ресурсы могут остаться занятыми. Вызывайте $stmt->close() и $mysqli->close().

Как упростить написание запросов с помощью легковесной ORM Medoo?

Medoo – минималистичная библиотека, предоставляющая удобный синтаксис.


// Установка: composer require catfan/medoo
require 'vendor/autoload.php';

use Medoo\Medoo;

$database = new Medoo([
    'type' => 'mysql',
    'host' => 'localhost',
    'database' => 'test',
    'username' => 'root',
    'password' => ''
]);

$user = $database->get('users', '*', [
    'email' => 'test@example.com'
]);

Php sql (php и sql)

Проблемы:

  • Medoo требует установки через Composer, что может быть сложно для новичков.
  • При сложных запросах (JOIN, подзапросы) её синтаксис становится громоздким.

Как использовать полноценную ORM Doctrine для сложных проектов?

Doctrine предоставляет мощные возможности, включая DQL, миграции и генерацию сущностей.


// Установка: composer require doctrine/orm
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = ['/path/to/entities'];
$isDevMode = true;
$dbParams = [
    'driver' => 'pdo_mysql',
    'host' => 'localhost',
    'dbname' => 'test',
    'user' => 'root',
    'password' => '',
];

$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);

// Использование репозитория
$userRepository = $entityManager->getRepository('User');
$user = $userRepository->findOneBy(['email' => 'test@example.com']);

Трудности:

  • Doctrine требует детальной настройки метаданных (YAML, XML, аннотации).
  • Производительность может быть ниже прямых запросов для простых операций.
- Php mysqli подключение (подключение к mysql через mysqli)
- обновление данных php (обновление записей в базе данных через php (update))
- соединение mysql php (соединение с mysql из php)

Расширенные примеры использования PDO и других решений

PDO: транзакции и массовая вставка

Пример

try {
    $pdo->beginTransaction();
    $stmt = $pdo->prepare('INSERT INTO orders (user_id, total) VALUES (:uid, :total)');
    $stmt->execute(['uid' => 1, 'total' => 200.50]);
    $stmt2 = $pdo->prepare('UPDATE users SET balance = balance - :total WHERE id = :uid');
    $stmt2->execute(['total' => 200.50, 'uid' => 1]);
    $pdo->commit();
} catch (PDOException $e) {
    $pdo->rollBack();
    echo 'Ошибка транзакции: ' . $e->getMessage();
}
При успешном выполнении баланс пользователя уменьшится, заказ появится в таблице. При ошибке изменения откатятся.

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

Пример

// Создаём процедуру (однократно)
$mysqli->query('CREATE PROCEDURE GetUser(IN uid INT) SELECT * FROM users WHERE id = uid');

// Вызов процедуры
$stmt = $mysqli->prepare('CALL GetUser(?)');
$stmt->bind_param('i', $userId);
$userId = 1;
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    print_r($row);
}
// Обработка множества результатов (если процедура возвращает несколько наборов)
$stmt->next_result();
$stmt->close();
Array ( [id] => 1 [name] => Иван [email] => ivan@example.com )

Medoo: агрегатные функции и группировка

Пример

$count = $database->count('orders', [
    'user_id' => 1
]);
echo "Количество заказов: $count";

$sum = $database->sum('orders', 'total', [
    'user_id' => 1
]);
echo "Сумма заказов: $sum";

// Группировка по статусу
$stats = $database->select('orders', [
    'status',
    'total_orders' => Medoo::raw('COUNT(*)'),
], [
    'GROUP' => 'status'
]);
print_r($stats);
Количество заказов: 5
Сумма заказов: 1250.75
Array ( [0] => Array ( [status] => new [total_orders] => 3 ) [1] => Array ( [status] => completed [total_orders] => 2 ) )

Doctrine: DQL запрос и извлечение связанных сущностей

Пример

$dql = "SELECT u, p FROM User u JOIN u.profile p WHERE u.email = :email";
$query = $entityManager->createQuery($dql);
$query->setParameter('email', 'test@example.com');
$user = $query->getOneOrNullResult();

if ($user) {
    echo $user->getName() . ' - ' . $user->getProfile()->getBio();
}
Иван - PHP разработчик

PDO: работа с большими данными (пагинация через LIMIT и OFFSET)

Пример

$page = 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare('SELECT * FROM articles ORDER BY created_at DESC LIMIT :limit OFFSET :offset');
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$articles = $stmt->fetchAll();

// Общее количество для постраничной навигации
$total = $pdo->query('SELECT COUNT(*) FROM articles')->fetchColumn();
$pages = ceil($total / $perPage);
$articles – массив с записями текущей страницы, $pages – количество страниц.

phpMyAdmin в PHP - comments

En
Phpmyadmin php (php)