Подключение MySQL
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
Руководство по подключению к MySQL в IO7 фреймворке.
Конфигурация
IO7 использует три способа настройки MySQL подключения:
- Переменные окружения (
.env) — рекомендуемый способ - Глобальные константы — для автозагрузки
- Программная настройка — через
ConnectionManager::mysqlConfig()
Параметры подключения
| Параметр | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|
driver | mysql | Да | Драйвер БД |
host | — | Да | Адрес сервера |
port | 3306 | Нет | Порт сервера |
database | — | Да | Имя базы данных |
username | — | Да | Пользователь |
password | — | Да | Пароль |
charset | utf8mb4 | Нет | Кодировка |
collation | utf8mb4_unicode_ci | Нет | Сравнение символов |
prefix | '' | Нет | Префикс таблиц |
strict | true | Нет | Строгий режим |
engine | InnoDB | Нет | Движок таблиц |
Подключение через SqlConnection
Простое подключение
use IO\Database\SqlConnection;
$db = new SqlConnection('mysql');
$db->server = 'localhost';
$db->user = 'root';
$db->pass = 'password';
$db->db = 'mydb';
if ($db->tryconnect()) {
echo "Подключено к MySQL!";
}
Подключение к нескольким серверам
$master = new SqlConnection('mysql');
$master->server = '192.168.1.10';
$master->user = 'app';
$master->pass = 'secret';
$master->db = 'production';
$master->tryconnect();
$slave = new SqlConnection('mysql');
$slave->server = '192.168.1.11';
$slave->user = 'app_readonly';
$slave->pass = 'secret';
$slave->db = 'production';
$slave->tryconnect();
Через create_conn()
$db = SqlConnection::create_conn('localhost', 'root', 'password', 'mydb');
// Повторный вызов вернёт тот же экземпляр (кэширование)
Через конструктор с параметрами
$db = new SqlConnection('mysql');
$db->connect('localhost', 'root', 'password', 'mydb');
// После подключения — настройка кодировки и timezone
// Устанавливается автоматически в afterConnect()
Подключение через DB фасад
Базовая инициализация
use IO\Database\DB;
DB::init([
'driver' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'database' => 'mydb',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => 'InnoDB',
'options' => [
\PDO::ATTR_PERSISTENT => false,
\PDO::ATTR_TIMEOUT => 5,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
],
]);
// Использование
$users = DB::table('users')->where('active', 1)->get();
Несколько подключений
DB::init($config1, 'primary');
DB::init($config2, 'secondary');
// Использование
$primary = DB::connection('primary');
$secondary = DB::connection('secondary');
Через существующий PDO
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'root',
'password',
[\PDO::ATTR_PERSISTENT => false]
);
DB::initPdo($pdo, 'mysql');
Подключение через ConnectionManager
Автоматическое определение из переменных окружения
use IO\Database\ConnectionManager;
use IO\Database\DB;
$connections = ConnectionManager::fromConstants();
foreach ($connections as $name => $config) {
DB::init($config, $name);
}
Ручное создание конфигурации
use IO\Database\ConnectionManager;
$config = ConnectionManager::mysqlConfig(
'192.168.1.10',
'mydb',
'app_user',
'secret',
3306
);
DB::init($config, 'main');
Read/Write разделение
$config = ConnectionManager::readWriteConfig(
['replica1.local', 'replica2.local'], // read hosts
'master.local', // write host
'mydb',
'app_user',
'secret'
);
DB::init($config, 'cluster');
Переменные окружения
Файл .env:
# Движок БД
DB_ENGINE=mysql
# MySQL
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=secret
MYSQL_DB=mydb
Автозагрузка
// В файле инициализации (index.php или bootstrap)
$connections = ConnectionManager::fromConstants();
foreach ($connections as $name => $config) {
DB::init($config, $name);
}
Примеры
CRUD операции через SqlConnection
$db = new SqlConnection('mysql');
$db->connect('localhost', 'root', 'password', 'mydb');
// CREATE
$db->insert('users', [
'name' => 'Иван',
'email' => 'ivan@example.com',
'role' => 'admin',
]);
$newId = $db->last_insert_id();
// READ
$r = $db->query("SELECT * FROM users WHERE id = ?", [$newId]);
$user = $db->fetch($r);
$db->free_result($r);
// UPDATE
$db->update('users', ['pkid' => $newId], ['name' => 'Иван Петров']);
// DELETE
$db->delete('users', ['pkid' => $newId]);
CRUD через DB фасад
use IO\Database\DB;
// CREATE
DB::table('users')->insert([
'name' => 'Мария',
'email' => 'maria@example.com',
]);
// READ
$user = DB::table('users')->where('email', 'maria@example.com')->first();
$activeUsers = DB::table('users')->where('active', 1)->get();
// UPDATE
DB::table('users')->where('id', 1)->update(['name' => 'Мария Иванова']);
// DELETE
DB::table('users')->where('id', 1)->delete();
Поиск с фильтрами
$result = $db->search('products', [
'filter' => [
'status' => 1,
'>price' => 100,
'<=price' => 5000,
'%name' => 'телефон',
],
'order' => ['price' => 'asc'],
'limit' => 20,
'start' => 0,
]);
foreach ($result['res'] as $product) {
echo "{$product['name']} — {$product['price']} руб.\n";
}
Транзакции
$db->beginTransaction();
try {
$db->insert('orders', [
'user_id' => 1,
'total' => 2500,
'status' => 'pending',
]);
$orderId = $db->last_insert_id();
$db->insert('order_items', [
'order_id' => $orderId,
'product_id' => 42,
'quantity' => 1,
'price' => 2500,
]);
$db->update('users', ['pkid' => 1], ['balance' => '-2500']);
$db->commit();
echo "Заказ {$orderId} создан";
} catch (\Exception $e) {
$db->rollBack();
throw $e;
}
ON DUPLICATE KEY UPDATE
// MySQL
$db->insert_or_update('user_stats', [
'user_id' => 1,
'logins' => 1,
'last_login' => date('Y-m-d H:i:s'),
]);
// PostgreSQL
$db->insert_or_update('user_stats', [
'user_id' => 1,
'logins' => 1,
'last_login' => date('Y-m-d H:i:s'),
]);
Переключение базы данных
$db = new SqlConnection('mysql');
$db->connect('localhost', 'root', 'password', 'main_db');
// Переключиться на другую БД (MySQL)
$db->usedb('other_db');
$r = $db->query("SELECT * FROM other_table");
Проверка соединения
if (!$db->ping()) {
$db->tryconnect();
}
if ($db->connected()) {
// Работаем с БД
}
Рекомендации
- Используйте
utf8mb4кодировку для поддержки эмодзи и Unicode - Настройте
PDO::ATTR_ERRMODE => ERRMODE_EXCEPTIONдля обработки ошибок - Используйте подготовленные выражения через
query()с параметрами - Не храните пароли в коде — используйте
.envпеременные - Настройте
PDO::ATTR_TIMEOUTдля предотвращения зависаний - Используйте транзакции для связанных операций записи
- Переключайте БД через
usedb()только при необходимости
FAQ
Как подключиться к MySQL с SSL?
$config = ConnectionManager::mysqlConfig('localhost', 'mydb', 'root', 'secret');
$config['options'][\PDO::MYSQL_ATTR_SSL_CA] = '/path/to/ca.pem';
DB::init($config);
Как настроить persistent connections?
$config = ConnectionManager::mysqlConfig('localhost', 'mydb', 'root', 'secret');
$config['options'][\PDO::ATTR_PERSISTENT] = true;
DB::init($config);
Как обработать ошибку подключения?
try {
$db = new SqlConnection('mysql');
$db->connect('localhost', 'root', 'password', 'mydb');
} catch (\PDOException $e) {
error_log("Ошибка подключения: " . $e->getMessage());
// Fallback или уведомление
}
Как узнать версию MySQL?
$version = $db->get_var('version', "SELECT VERSION() as version");
echo "Версия MySQL: {$version}";
Как работает insert_or_update в MySQL?
Использует ON DUPLICATE KEY UPDATE. При наличии дубликата по уникальному ключу запись обновляется вместо вставки.