Этот файл содержит рекомендации для Claude Code (claude.ai/code) при работе с кодом в данном репозитории.
krugozor/database — это библиотека классов PHP >= 8.0 для простой, удобной, быстрой и безопасной работы с базой данных MySQL с использованием расширения mysqli. Библиотека предоставляет систему типизированных заполнителей, которая автоматически экранирует SQL-параметры для предотвращения SQL-инъекций, сохраняя при этом читаемость и отлаживаемость SQL-запросов.
Пространство имён: Krugozor\Database
Ключевая философия разработки:
- Это НЕ ORM, SQL-конструктор или реализация ActiveRecord
- Это обёртка над mysqli, которая добавляет систему экранирования параметров на основе заполнителей
- Разработчики пишут обычный SQL с типизированными заполнителями вместо ручного экранирования значений
- Библиотека дополняет mysqli, а не заменяет её - вы можете получить доступ к базовому объекту mysqli
-
Mysql(src/Mysql.php) - Основной класс подключения к базе данных и выполнения запросов- Управляет подключением через mysqli
- Парсит SQL-шаблоны с заполнителями и подставляет экранированные значения
- Два режима работы:
MODE_STRICT(строгое соответствие типов) иMODE_TRANSFORM(толерантное преобразование типов, по умолчанию) - Сохраняет выполненные запросы при включённой отладке
- Поддерживает интернационализированные сообщения об ошибках (английский и русский)
-
Statement(src/Statement.php) - Обёртка над mysqli_result для удобного получения данных- Предоставляет методы для выборки результатов в виде ассоциативных массивов, индексированных массивов или объектов
- Методы для одной строки:
fetchAssoc(),fetchRow(),fetchObject(),getOne() - Методы для множества строк:
fetchAssocArray(),fetchRowArray(),fetchObjectArray() - Автоматически освобождает mysqli_result при уничтожении объекта
-
MySqlException(src/MySqlException.php) - Пользовательский класс исключений, расширяющий Exception
Основная особенность библиотеки — типизированные заполнители, которые автоматически экранируют значения в соответствии с их типом:
?i- Целое число (например,?i→123)?d- Число с плавающей точкой (например,?d→12.56)?s- Строка с экранированием (например,"?s"→"д\'Артаньян")?S- Строка для LIKE с экранированием % и _ (например,"%?S%"→"%\% \_")?n- Литерал NULL (игнорирует аргумент, всегда выводитNULL)?f- Имя поля/таблицы с экранированием обратными кавычками (например,?f→`field_name`)
?ai,?ad,?as- Простые массивы (например,?aiс[1, 2, 3]→"1", "2", "3")?Ai,?Ad,?As- Ассоциативные массивы в виде пар ключ=значение (например,?As→`name` = "value", `age` = "25")?a[?i, "?s"]- Явное указание типа для элементов массива?A[?i, "?s"]- Явное указание типа для элементов ассоциативного массива
Важно: Строковые заполнители (?s, ?S) должны быть обёрнуты в кавычки в SQL-шаблоне (например, 'WHERE name = "?s"'), в отличие от подготовленных выражений PDO.
# Запуск примера/тестового скрипта (требуется подключение к MySQL)
php console/tests.phpПеред запуском тестов:
- Настройте подключение к MySQL в
console/tests.php(константы: MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_PORT) - Убедитесь, что ваш пользователь MySQL имеет привилегию CREATE для создания тестовой базы данных
- Скрипт создаст временную базу данных
krugozor_database_testи очистит её после выполнения
composer require krugozor/database- PHP >= 8.0
- ext-mysqli
- ext-mbstring
use Krugozor\Database\Mysql;
$db = Mysql::create('localhost', 'user', 'password', 3306);
$db->setCharset('utf8')
->setDatabaseName('mydb');
// Выполнение запроса
$result = $db->query('SELECT * FROM users WHERE id = ?i', 123);
$row = $result->fetchAssoc();MODE_TRANSFORM(по умолчанию): Автоматически преобразует типы (например,"123"→123для?i)MODE_STRICT: Выбрасывает исключение при несоответствии типов
Установка режима: $db->setTypeMode(Mysql::MODE_STRICT);
query(...$args)- Выполнить запрос с вариативными аргументамиqueryArguments($sql, array $args)- Выполнить запрос с массивом аргументовprepare(...$args)- Парсить SQL-шаблон без выполнения (полезно для построения запросов по частям)
getQueryString()- Получить последний выполненный SQL (после подстановки заполнителей)getOriginalQueryString()- Получить SQL-шаблон (до подстановки)getAffectedRows()- Получить количество строк, затронутых INSERT/UPDATE/DELETEgetLastInsertId()- Получить ID автоинкремента из последнего INSERT
$db->setStoreQueries(true);
// ... выполнение запросов ...
$all_queries = $db->getQueries(); // Массив выполненных запросов$mysqli = $db->getMysqli(); // Доступ к базовому объекту mysqlisrc/
Mysql.php - Основной класс базы данных с подключением и парсингом запросов
Statement.php - Обёртка над результирующим набором
MySqlException.php - Класс исключений
console/
tests.php - Комплексные примеры использования и тестовый скрипт
-
Логика парсинга заполнителей (Mysql.php:655-838): Метод
parse()использует многобайтовые строковые функции для поиска и замены заполнителей. Он поддерживает отслеживание смещения для корректной обработки замен переменной длины. -
Валидация типов: Три приватных метода обрабатывают проверку и преобразование типов:
getValueIntType()- Валидирует/преобразует целые числаgetValueFloatType()- Валидирует/преобразует числа с плавающей точкойgetValueStringType()- Валидирует/преобразует строки Каждый учитывает текущую настройку MODE_STRICT или MODE_TRANSFORM.
-
Парсинг заполнителей массивов: Сложная логика обрабатывает как простые массивы (
?ai), так и массивы с явным указанием типов (?a[?i, "?s"]). Парсер рекурсивно вызывает сам себя для элементов массива. -
Экранирование имён полей (Mysql.php:997-1034): Обрабатывает нотацию database.table путём разделения по
.и оборачивания каждой части в обратные кавычки, удваивая существующие обратные кавычки. -
Обработка ошибок: Библиотека перехватывает как старые ошибки mysqli, так и mysqli_sql_exception, оборачивая их в MySqlException с локализованными сообщениями.
-
Поддержка сериализации: Реализует
__sleep()и__wakeup()для поддержки сериализации/десериализации, автоматически переподключаясь при десериализации.
README.md # Английская версия (основной файл в корне)
docs/
README_ru.md # Русская версия (ЭТАЛОН для всех переводов)
README_fr.md # Французская версия
-
Эталон — русский текст: Все переводы делаются ТОЛЬКО с русского файла
docs/README_ru.md. Никогда не используй другие источники (старые файлы, backup и т.д.). -
Структура ссылок:
- В
README.md(корень): ссылки на переводыdocs/README_ru.md,docs/README_fr.md - В
docs/README_*.md: ссылка на английский../README.md, на другие переводыREADME_*.md - Ссылка на
console/tests.php: в корне./console/tests.php, в docs../console/tests.php
- В
-
Блок ссылок на языки в начале каждого файла:
- Английский:
**Other languages:** - Русский:
**Другие языки:** - Французский:
**Autres langues:** - Текущий язык НЕ включается в список ссылок
- Английский:
-
Перевод контента:
- Профессиональный перевод, не дословный
- Технические термины (названия классов, методов, placeholders) НЕ переводятся
- Примеры кода остаются на PHP, комментарии переводятся
- Текстовые строки в примерах адаптируются к языку (например, "Д'Артаньян" → "d'Artagnan")
- Ссылки на php.net ведут на соответствующую языковую версию (
/ru/,/en/,/fr/)
-
При обновлении переводов:
- Сначала прочитать русский эталон
docs/README_ru.md - Определить изменённые секции
- Обновить ВСЕ файлы переводов, сохраняя идентичную структуру
- Проверить соответствие примеров кода во всех версиях
- Сначала прочитать русский эталон
- Когда пользователь изменяет README_ru.md (или просит обновить переводы):
- Определить, какие секции изменились
- Обновить соответствующие секции во всех файлах переводов
- Сохранить специфичные для языка особенности перевода
- Когда пользователь просит сделать перевод на новый язык:
- Эталон, с которого переводим - docs/README_ru.md
- Отвечай пользователю на русском языке