BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • IO7 Framework vs Laravel 13 — Сравнение
    • Структура
    • Варианты проектов
    • Доступ к участкам проекта
    • Разворачивание нового проекта
    • Установка проекта
    • Запуск локальной разработки
  • API

    • Обзор API
    • IOCore::call() и IOCore::callAction()
    • Создание API
  • CLI

    • Обзор CLI
    • iocli
    • Кастомные CLI команды
  • Работа с базами данных

    • Обзор работы с базами данных
    • Cron / Планировщик задач (Schedule)
    • Фабрики
    • Миграции
    • Сидеры
    • Query Builder
    • Подключение MinIO
    • Подключение MongoDB
    • Подключение MySQL
    • Подключение PostgreSQL
    • Подключение ProxySQL
    • Подключение RabbitMQ
    • Подключение Redis
  • Логирование

    • Обзор логирования
    • IOEvent - Логирование событий
    • Pinba (PinbaManager) - Профилировщик
  • Модели

    • Обзор моделей
    • CRUD операции
    • Связи моделей
  • Очереди

    • Обзор очередей
    • RabbitMQ
  • Маршруты

    • Обзор маршрутов
    • Определение маршрутов
    • Middleware
  • Сессии

    • Обзор сессий
    • Кроссдоменная SSO
    • JWT авторизация
    • Социальная авторизация
    • OAuth2
    • Keycloak
  • Twig

    • Обзор Twig
    • Формы (FormBuilder)
    • Twig функции
  • Тестирование

    • Обзор тестирования
    • Unit тесты
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Вспомогательные функции (Helpers)
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • Core класс
    • Route и работа с ними
    • Request и работа с ними
    • Middleware и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
    • Миграции
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS
    • Хранилище (store)
    • Навигация в хосте
    • Навигация в микрофронтенде
    • Параметры микрофронтенда
    • Проверка полномочий
  • Tailux UI Компоненты

    • Базовый UI

      • AvatarDot
      • Avatar
      • Badge
      • Button
      • Card
      • ConfirmModal
      • Divider
      • Highlight
      • Tag
    • Загрузка

      • Circlebar
      • Progress
      • Skeleton
      • Spinner
    • Навигация

      • Accordion
      • AccordionButton
      • AccordionHeader
      • AccordionItem
      • AccordionPanel
      • AccordionProvider
      • Pagination
      • PaginationControl
      • PaginationItems
      • PaginationDots
      • PaginationFirst
      • PaginationLast
      • PaginationNext
      • PaginationPrevious
    • Отображение данных

      • Box
      • Collapse
      • ContextualHelp
      • ScrollShadow
      • Timeline
      • TimelineItem
    • Элементы таблиц

      • Table
      • CollapsibleSearch
      • ColumnFilter
      • CopyableCell
      • DateFilter
      • FacetedFilter
      • FilterSelector
      • PaginationSection
      • RadioFilter
      • RangeFilter
      • ResponsiveFilter
      • RoleFilter
      • SelectedRowsActions
      • TableColumnVisibility
      • TableSettings
      • TableSortIcon
    • Элементы форм

      • Checkbox
      • Combobox
      • DatePicker
      • Filepond
      • Input
      • Listbox
      • Radio
      • Range
      • Select
      • StyledSwitch
      • Swap
      • SwapOn
      • SwapOff
      • Switch
      • Textarea
      • TextEditor
      • Upload

Подключение MySQL

Внимание

Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!

  • Конфигурация
    • Параметры подключения
  • Подключение через SqlConnection
    • Простое подключение
    • Подключение к нескольким серверам
    • Через create_conn()
    • Через конструктор с параметрами
  • Подключение через DB фасад
    • Базовая инициализация
    • Несколько подключений
    • Через существующий PDO
  • Подключение через ConnectionManager
    • Автоматическое определение из переменных окружения
    • Ручное создание конфигурации
    • Read/Write разделение
  • Переменные окружения
    • Автозагрузка
  • Примеры
    • CRUD операции через SqlConnection
    • CRUD через DB фасад
    • Поиск с фильтрами
    • Транзакции
    • ON DUPLICATE KEY UPDATE
    • Переключение базы данных
    • Проверка соединения
  • Рекомендации
  • FAQ
    • Как подключиться к MySQL с SSL?
    • Как настроить persistent connections?
    • Как обработать ошибку подключения?
    • Как узнать версию MySQL?
    • Как работает insert_or_update в MySQL?

Руководство по подключению к MySQL в IO7 фреймворке.

Конфигурация

IO7 использует три способа настройки MySQL подключения:

  1. Переменные окружения (.env) — рекомендуемый способ
  2. Глобальные константы — для автозагрузки
  3. Программная настройка — через ConnectionManager::mysqlConfig()

Параметры подключения

ПараметрЗначение по умолчаниюОбязателенОписание
drivermysqlДаДрайвер БД
host—ДаАдрес сервера
port3306НетПорт сервера
database—ДаИмя базы данных
username—ДаПользователь
password—ДаПароль
charsetutf8mb4НетКодировка
collationutf8mb4_unicode_ciНетСравнение символов
prefix''НетПрефикс таблиц
stricttrueНетСтрогий режим
engineInnoDBНетДвижок таблиц

Подключение через 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()) {
    // Работаем с БД
}

Рекомендации

  1. Используйте utf8mb4 кодировку для поддержки эмодзи и Unicode
  2. Настройте PDO::ATTR_ERRMODE => ERRMODE_EXCEPTION для обработки ошибок
  3. Используйте подготовленные выражения через query() с параметрами
  4. Не храните пароли в коде — используйте .env переменные
  5. Настройте PDO::ATTR_TIMEOUT для предотвращения зависаний
  6. Используйте транзакции для связанных операций записи
  7. Переключайте БД через 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. При наличии дубликата по уникальному ключу запись обновляется вместо вставки.

Prev
Подключение MongoDB
Next
Подключение PostgreSQL