IO v6. $iodb и работа с базой данных
Описание
$iodb - глобальная переменная-объект для обращения к базе данных MySQL. Также, с ее помощью можно писать запросы в базу данных на языке SQL.
Переменная является экземпляром класса IO_MYSQL_PDO (project/app/io/mysql_pdo.php) (ранее IO_MYSQLI (project/app/io/mysqli.php) и еще ранее IO_MYSQL (project/app/io/mysql.php)).
Переменные
db_link
Объект соединения базы данных либо false.
object|bool $db_link = false
last_query_all
static string $last_query_all = ''
last_query
string $last_query = ''
db_connections
Массив соединений базы данных.
static array $db_connections = []
server
Адрес сервера базы данных.
string $server = ''
user
Имя пользователя базы данных.
string $user = ''
pass
Пароль пользователя базы данных.
string $pass = ''
db
Название базы данных.
string $db = ''
lastconnect
int $lastconnect = 1
log_query
Выводить лог запросов.
int $log_query = 0
code_page
Кодировка.
string $code_page = 'utf8'
time_zone
Временная зона (timezone).
string $time_zone = '+05:00'
log_class_exists
int $log_class_exists = -1
quiet
int $quiet = 0
_errorstr
Текст последней ошибки.
string $_errorstr = ''
_errorno
Номер последней ошибки.
string $_errorno = ''
_info_loop_query
int $_info_loop_query = 0
_time_query_max
int $_time_query_max = 2000
columns
array $columns = []
Методы
information_schema_load_current_db()
Выполняет SQL запрос "select * from information_schema.COLUMNS where TABLE_SCHEMA='".$this->db."';" и заполняет массив columns.
information_schema_load_current_db(): void
Пример:
global $iodb;
$iodb->information_schema_load_current_db();
tryconnect()
Создает соединение с базой данных MySQL, выбирает базу данных проекта, а также устанавливает кодировку и timezone. Вызывается при инициализации проекта.
tryconnect(): bool
Пример:
global $iodb;
$ret = $iodb->tryconnect();
connect()
Создает соединение с базой данных MySQL по указанным параметрам.
Применяется в том числе в функции tryconnect().
connect(string $server, string $user, string $pass, string|null $db = null): bool
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$server | string | Адрес сервера БД. | Да | |
$user | string | Имя пользователя БД. | Да | |
$pass | string | Пароль пользователя БД. | Да | |
$db | string|null | Название базы данных. | null | Нет |
Пример:
global $iodb;
$ret = $iodb->connect('server', 'username', 'password', 'trade');
create_conn()
Возвращает новый экземпляр класса IO_MYSQL_PDO.
static create_conn(string $server, string $user, string $pass, string $db = ''): object(IO_MYSQL_PDO)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$server | string | Адрес сервера БД. | Да | |
$user | string | Имя пользователя БД. | Да | |
$pass | string | Пароль пользователя БД. | Да | |
$db | string | Название базы данных. | '' | Нет |
Пример:
$dbObj = IO_MYSQL_PDO::create_conn('server', 'username', 'password', 'trade');
is_valid()
Проверяет, является ли переменная соединения ресурсом, т.е. проверяет на наличие соединения с базой данных.
is_valid(): bool
Пример:
global $iodb;
$ret = $iodb->is_valid();
ping()
Проверяет, переменная соединения не пустая ли, и если нет, то пытается выполнить простой SQL запрос select, т.е. проверяет на наличие соединения с базой данных.
ping(): bool
Пример:
global $iodb;
$ret = $iodb->ping();
usedb()
Переключение на указанную базу данных.
usedb(string $dbname): void
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$dbname | string | Название базы данных. | Да |
Пример:
global $iodb;
$iodb->usedb('trade');
ВНИМАНИЕ
Используется в самых крайних случаях. На постоянной основе использовать не рекомендуется.
query()
Отправка SQL запроса в БД.
query(string $query = '', int $save = 1): object(query_result)|false
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$query | string | SQL запрос. | '' | Да |
$save | int | ??? | 1 | Нет |
Пример:
global $iodb;
$q = "
SELECT *
FROM `iodb`.`countries`
WHERE `countryCode` = 'KZ';
";
$r = $iodb->query($q);
while($row = $iodb->fetch_assoc($r))
{
v_dump($row);
}
query_objects()
Отправка SQL запроса с расшифровкой его результата и преобразования каждой записи в экземпляр указанного класса.
query_objects(string $q, string $class = 'BmcObject', string|null $tablename = null): array
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$q | string | SQL запрос. | Да | |
$class | string | Название класса, под экземпляром которого будет возвращен список объектов. | 'BmcObject' | Да |
$tablename | string|null | ??? | null | Нет |
ВНИМАНИЕ
Данная функция долгое время не применялась на практике. Работает ли она сейчас корректно, неизвестно...
query_params()
Отправка SQL запроса с возможностью указания для него параметров в виде массива.
query_params(string $query = '', array|null $arr = null): object(query_result)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$query | string | SQL запрос. | '' | Да |
$arr | array|null | Параметры для SQL запроса | null | Нет |
Пример:
global $iodb;
$r = $iodb->query_params(
'SELECT * FROM `users` WHERE `login` like :login',
[
":login" => '%exinz%',
]
);
while($row = $iodb->fetch_assoc($r))
{
v_dump($row);
}
connected()
Возвращает, есть ли соединение с БД.
connected(): bool
Пример:
global $iodb;
$connected = $iodb->connected(); // true
free_result()
Закрывает курсор, переводя запрос в состояние готовности к повторному запуску.
free_result(object $result): bool
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$result | object | Результат SQL запроса (query_result). | Да |
fetch_assoc()
Расшифровка результата запроса (query_result) в ассоциативный массив.
fetch_assoc(object $result): array|false
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$result | object(query_result) | Результат SQL запроса. | Да |
Пример:
global $iodb;
$q = "
SELECT *
FROM `iodb`.`countries`
WHERE `countryCode` = 'KZ';
";
$r = $iodb->query($q);
while($row = $iodb->fetch_assoc($r))
{
v_dump($row);
}
error()
Вывод номера (кода) ошиюки, возникшей в последнем запросе.
Содержит в себе значение первого элемента массива из результата выполнения функции PDO::errorInfo().
error(): string
Пример:
global $iodb;
$iodb->query('bogus sql');
echo $iodb->error(); // HY000
errorstr()
Вывод номера (кода), а также текста ошибки, возникшей в последнем запросе.
Содержит в себе значение первого и третьего элементов массива из результата выполнения функции PDO::errorInfo().
errorstr(): string
Пример:
global $iodb;
$iodb->query('bogus sql');
echo $iodb->errorstr(); // [HY000]: near "bogus": syntax error
num_rows()
Возвращает количество строк, затронутых в указанном результате запроса.
num_rows(object $res): int
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$res | object(query_result) | Результат SQL запроса. | Да |
Пример:
global $iodb;
$result = $iodb->query('SELECT * FROM users');
echo $iodb->num_rows($result); // 155
last_insert_id()
Возвращает ID последней вставленной строки или значение последовательности.
last_insert_id(): int|null
Пример:
global $iodb;
echo $iodb->last_insert_id();
get_count()
get_count(string $q, string $field = 'count'): mixed
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$q | string | Текст SQL запроса. | Да | |
$field | string | Название поля, значения которого нужно получить. | 'count' | Нет |
ВНИМАНИЕ
Данная функция долгое время не применялась на практике. Работает ли она сейчас корректно, неизвестно...
escape()
Экранирует специальные символы в указанной строке, перед вставкой в SQL-запрос. Вспомогательная функция класса.
static escape(): string
Пример:
$msg = "Hello 'world'\nNew line \x1a End.";
echo IO_MYSQL_PDO::escape($msg); // Hello \'world\'\nNew line \\Z End.
ВНИМАНИЕ
Эта функция небезопасна для защиты от SQL-инъекций. Вместо этой функции лучше использовать встроенные функции PHP: PDO::quote($msg).
escape2()
Приводит в порядок имена таблиц и полей для использования в запросе. Вспомогательная функция класса.
static escape2(string $field): string
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$fiend | string | ??? | Да |
Пример:
echo IO_MYSQL_PDO::escape2('iodb');
getWhereFromFilter()
Генератор SQL параметра where на основе фильтра фреймворка (как в dbsearch2 у class). Вспомогательная функция.
static getWhereFromFilter(array|null $filter = null): string
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$filter | array|null | Массив параметров фильтра. | Да |
Пример:
global $iodb;
$where = IO_MYSQL_PDO::getWhereFromFilter([
'!=pkid' => [1, 2, 5],
'%text' => 'elcom',
]);
insert()
Добавление записи в БД.
insert(string $table, array $data, array|null $data2 = null): int(1|-1)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$data | array | Массив полей и их значений для добавления в БД. | Да | |
$data2 | array|null | ??? | null | Нет |
Пример:
global $iodb;
$iodb->insert('users', [
'login' => 'famio',
'sname' => 'Фамилиев',
'fname' => 'Имий',
'lname' => 'Отчествович',
'email' => 'famio@mail.site',
]);
insert_or_update()
В случае отсутствия записи в БД - добавление, иначе изменение.
insert_or_update(string $table, array $data, array|null $data2 = null): int(1|-1)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$data | array | Массив полей и их значений для добавления или изменения в БД. | Да | |
$data2 | array|null | ??? | null | Нет |
Пример:
global $iodb;
$iodb->insert_or_update('users', [
'login' => 'famio',
'sname' => 'Фамилиев',
'fname' => 'Имий',
'lname' => 'Отчествович',
'email' => 'famio@mail.site',
]);
insert_or_ignore()
В случае отсутствия записи в БД - добавление, иначе ничего не делать.
insert_or_ignore(string $table, array $data, array|null $data2 = null): int(1|-1)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$data | array | Массив полей и их значений для добавления в БД. | Да | |
$data2 | array|null | ??? | null | Нет |
Пример:
global $iodb;
$iodb->insert_or_ignore('users', [
'login' => 'famio',
'sname' => 'Фамилиев',
'fname' => 'Имий',
'lname' => 'Отчествович',
'email' => 'famio@mail.site',
]);
update()
Изменение записей в БД.
update(string $table, array $filter, array $data, array|null $data2 = null): int(1|-1)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$filter | array | Массив параметров фильтра (как в dbsearch2 у class). | Да | |
$data | array | Массив полей и их значений для изменения в БД. | Да | |
$data2 | array|null | ??? | null | Нет |
Пример:
global $iodb;
// сбросить поле email для тех, у кого email_confirm не равен 1
$iodb->update('users', [
'!=email_confirm' => 1,
], [
'email' => '',
]);
delete()
Удаление записей из БД.
delete(string $table, array $filter, int|null $count = null): int(1|-1)
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$filter | array | Массив параметров фильтра (как в dbsearch2 у class). | Да | |
$count | int|null | Параметр, указывающий limit в запросе. | null | Нет |
Пример:
global $iodb;
// удалить тех, у кого email_confirm не равен 1
$iodb->update('users', [
'!=email_confirm' => 1,
]);
affected_rows()
Получение задействованных строк.
Выполняет SQL запрос SELECT ROW_COUNT() as rows и возвращает значение поля rows.
affected_rows(): mixed
Пример:
global $iodb;
$iodb->affected_rows();
found_rows()
Получение найденных строк.
Выполняет SQL запрос SELECT FOUND_ROWS() as rows и возвращает значение поля rows.
found_rows(): mixed
Пример:
global $iodb;
$iodb->found_rows();
search()
Поиск записей в БД.
search(
string $table,
array $filter,
array|null $order = null,
int|null $start = null,
int|null $limit = null,
array|null $join = null,
array|null $fields = null,
int|bool $type = 0,
int|bool $calc_found_rows = 0,
array|null $groupby = null,
int|bool $distinct = 0
): array
| Аргумент функции | Тип | Описание | Значение по умолчанию | Обязательный |
|---|---|---|---|---|
$table | string | Название таблицы в БД. | Да | |
$filter | array | Массив параметров фильтра (как в dbsearch2 у class). | Да | |
$order | array|null | Массив параметров порядка сортировки в формате "поле" => "asc|desc". | null | Нет |
$start | int|null | Смещение offset. | null | Нет |
$limit | int|null | Ограничение количества записей limit. | null | Нет |
$join | array|null | Массив join. | null | Нет |
$fields | array|null | Массив полей fields. | null | Нет |
$type | int|bool | Возвращать ли результат запроса (query_reqult) вместо ассоциативного массива. | 0 | Нет |
$calc_found_rows | int|bool | Выполнять ли принудительный запрос получения количества записей в запросе. | 0 | Нет |
$groupby | array|null | Массив группировки group by. | null | Нет |
$distinct | int|bool | Исключать ли дубликаты. | 0 | Нет |
Пример:
global $iodb;
$ret = $iodb->search('users', [
'!=email_confirm' => 0,
], [
'pkid' => 'asc',
'ugmtimeAdd' => 'desc',
], 0, 0, [
"inner join users_questionary on (users_questionary.user_pkid = users.pkid)",
], [
"#users.login as user_login",
"#users_questionary.birthday as user_birthday",
"#users_questionary.about as user_about",
], 0, 0, [
'user_login',
], true);
beginTransaction()
Запуск транзакции.
beginTransaction(): bool
Пример:
global $iodb;
$iodb->beginTransaction();
try
{
$iodb->insert('users', [
'login' => 'famio',
]);
$iodb->commmit();
} catch(Exception $e)
{
$iodb->rollBack();
}
commit()
Фиксация транзакции в случае успеха.
commit(): bool
Пример:
global $iodb;
$iodb->beginTransaction();
try
{
$iodb->insert('users', [
'login' => 'famio',
]);
$iodb->commmit();
} catch(Exception $e)
{
$iodb->rollBack();
}
rollBack()
Откат транзакции в случае неудачи.
rollBack(): bool
Пример:
global $iodb;
$iodb->beginTransaction();
try
{
$iodb->insert('users', [
'login' => 'famio',
]);
$iodb->commmit();
} catch(Exception $e)
{
$iodb->rollBack();
}