База данных

Класс с функциями для работы с базой данных – DB – определен в файле includes/database.php.

Все функции статичные, их можно вызвать из любого файла в формате: DB::имя_функции().

Пример:

Например, чтобы сделать запрос к таблице diafan_users, и получить оттуда все поля с пользователями одного типа, нужно сделать так:

$result = DB::query("SELECT fio FROM diafan_users WHERE role_id=%d", $role_id);

Указывая таблицу, можно не писать префикс diafan_users, а написать {users}.

$result = DB::query("SELECT fio FROM {users} WHERE role_id=%d", $role_id);

Обратите внимание, в примере мы не пишем WHERE role_id=$role_id, а пишем WHERE role_id=%d. Это сделано для безопасности, чтобы можно было спокойно делать запросы с внешними переменными типа $_GET["role_id"].

Для фильтрации аргументов SQL-запроса вместо данных передаются маски, а данные передаются в качестве дополнительных аргументов для функций DB::query(), DB::query_result() и DB::query_range() в порядке, в котором они следуют в SQL-запросе. Существуют следующие маски:

  • %d – число,
  • %s – строка,
  • %h – строка без HTML кода,
  • %% – символ %,
  • %f – число с плавающей точкой,
  • %b – файлы

Название таблицы пишется без префикса в фигурных скобках.

Пример:

{attachments}

Переводимые переменные в SQL-запросе пишутся в квадратных скобках.

Пример:

[name]

Для проверки, правильно ли сформировался SQL-запрос и какие данные в него подставлены, запрос можно вывести на экран. Для этого нужно перед запросом написать DEV и включить режим разработки.

Пример:

$text = DB::query_result("DEV SELECT [text] FROM {shop_category} WHERE id=%d", $cat_id);

Методы

boolean connect ([string $db_url = DB_URL], [boolean $check = false]) – Подключается к базе данных.

  • string $db_url: данные для подключения к базе данных
  • boolean $check: проверка соединения
Подключение к базе данных происходит автоматически при первом SQL-запросе. Данные для подключения беруться из константы DB_URL, определенной в файле config.php.

void close () – Закрывает ранее открытое соединение.

Пример:

// закрываем текущее соединение
DB::close();

//подключимся к другой базе данных и запросим список пользователей
DB::connect("mysql://root:@localhost/otherdb");
$users = DB::query_fetch_all("SELECT id, fio FROM otherdb_users");

// закрываем новое соединение
DB::close();

//возвращаем подключение обратно
DB::connect(DB_URL);

boolean set_charset (string $charset) – Задает набор символов по умолчанию.

  • string $charset: набор символов, который необходимо установить.

Пример:

DB::set_charset('utf8');

array mode ([array $minus = array()], [array $plus = array()], [boolean $global = false]) – Задает режимы работы SQL.

  • array $minus: режимы, которые вычитаются
  • array $plus: режимы, которые включаются
  • boolean $global: режим установки. По умолчанию устанавка режимов для текущей сессии. Для установки глобальных режимов необходимо обладать привилегиями суперпользователя.

mixed query (string $query) – Отправляет запрос к базе данных.

  • string $query: текст запроса

Пример:

// вставляем данные в таблицу diafan_clauses
DB::query("INSERT INTO {clauses} ([name], [act], created) VALUES ('%h', '%d', %d)", $_POST["name"], $_POST["act"], time());

mixed query_without_prefix (string $query) – Отправляет запрос к базе данных без замены префикса.

  • string $query: текст запроса

Пример:

// используется при импорте базы данных, чтобы SQL-запрос не преобразовывались
DB::query_without_prefix("INSERT INTO diafan_config (name, module_name, value) VALUES ('images_variations_element', 'news', 'a:2:{i:0;a:2:{s:4:\"name\";s:6:\"medium\";s:2:\"id\";i:1;}i:1;a:2:{s:4:\"name\";s:5:\"large\";s:2:\"id\";i:3;}}')");

resource query_range (string $query) – Отправляет запрос к базе данных с лимитом на количество получаемых в результате рядов.

  • string $query: текст запроса

Предпочтительно использовать функцию query_range_fetch_all().

Пример:

// получаем имена трех картинок, прикрепленных к товару ID=5
$result = DB::query_range("SELECT name FROM {image} WHERE module_name='shop' AND element_id=%d AND element_type='element'", 5, 0, 3);

Подобные запросы вы можете часто встретить в файлах *.model.php, где производится выборка данных для списков, а также в модулях, поддерживающих постраничную навигацию.

Пример:

// запрос фотографий в альбоме ID=5 для списка
// в файле modules/photo/photo.model.php
$result = DB::query_range("SELECT * FROM {photo} WHERE cat_id=5 ORDER BY sort DESC", $this->diafan->_paginator->polog, $this->diafan->_paginator->nastr);

$this->diafan->_paginator->polog, $this->diafan->_paginator->nastr в данном случае выступают в роли начального и конечного индекса выборки.

mixed result (resource $result, [integer $row = 0]) – Получает результирующие данные.

  • resource $result: обрабатываемый результат запроса
  • integer $row: номер получаемого ряда из результата

Пример:

// выполняем SQL-запрос к базе данных
$result = DB::query("SELECT id FROM {users} WHERE name='admin' LIMIT 1");
// получаем результат
$id = DB::result($result);

void free_result (resource $result) – Освобождает память от результата запроса.

  • resource $result: обрабатываемый результат запроса

Пример:

// выполняем SQL-запрос к базе данных
$result = DB::query("SELECT id FROM {users} WHERE name='admin' LIMIT 1");

// получаем результат
$id = DB::result($result);

// освобождаем результат
DB::free_result($result);

В примере три операции можно заменить вызовом функции query_result().

Пример:

$id = DB::query_result("SELECT id FROM {users} WHERE name='admin' LIMIT 1");

Есть аналогичные объединяющие функции для получения массива данных с одной или несколькими строками. Поэтому функции result() и free_result() вне класса DB не используются.

array fetch_row (resource $result) – Извлекает результирующий ряд как пронумерованный массив.

  • resource $result: обрабатываемый результат запроса

Пример:

// запрашиваем в базе данных и выводим список товаров
$result = DB::query("SELECT id, [name] FROM {shop}");
echo
'Товары: ';
while (
$row = DB::fetch_row($result))
{
    echo
'ID: '.$row[0].' name: '.$row[1]."\n";
}
DB::free_result($result);

array fetch_array (resource $result) – Извлекает результирующий ряд как массив.

  • resource $result: обрабатываемый результат запроса

Предпочтительно использовать функцию query_fetch_array() и аналогичные.

Пример:

// запрашиваем в базе данных и выводим список способов доставки
$result = DB::query("SELECT [name] FROM {shop_delivery} ORDER BY sort ASC");
echo
'Способы доставки:';
while (
$row = DB::fetch_array($result))
{
    echo
$row["name"] . <br>;
}
DB::free_result($result);

object fetch_object (resource $result) – Извлекает результирующий ряд как объект.

  • resource $result: обрабатываемый результат запроса

Пример:

// запрашиваем в базе данных и выводим список новостей
$result = DB::query("SELECT [name], [anons] FROM {news} ORDER BY created DESC");
echo
'Новости:';
while (
$row = DB::fetch_object($result))
{
    echo
'Название: '$row->name.' анонс: '.$row->anons;
}
DB::free_result($result);

integer num_rows (resource $result) – Получает количество рядов в результате.

  • resource $result: обрабатываемый результат запроса

Пример:

// выводим количество новостей старше текущей даты
$result = DB::query("SELECT id FROM {news} WHERE created>%d", time());
echo
DB::num_rows($result);
DB::free_result($result);

integer insert_id () – Возвращает автоматически генерируемый ID, используя последний запрос.

Пример:

// определяем ID только что добавленного пользователя
DB::query("INSERT INTO {users} (name) VALUES ('admin')");
$user_id = DB::insert_id();

// сокращенная запись
$user_id = DB::query("INSERT INTO {users} (name) VALUES ('admin')");

integer affected_rows () – Возвращает число затронутых прошлой операцией рядов.

mixed query_result () – Получает результирующие данные из SQL-запроса.

Пример:

// получаем описание текущей категории из БД
$text = DB::query_result("SELECT [text] FROM {shop_category} WHERE id=%d", $this->diafan->cat);

mixed query_fetch_array () – Получает результирующий ряд как массив из SQL-запроса.

Пример:

// запрашиваем в базе данных пользователя ID=4
$user = DB::query_fetch_array("SELECT * FROM {users} WHERE id=4");
echo
'Имя: '.$user["fio"];
echo
'Логин: '.$user["name"];
echo
'E-mail: '.$user["mail"];

array query_fetch_all () – Получает массив результирующих рядов из SQL-запроса.

Пример:

// запрашиваем в базе данных всех пользователей
$users = DB::query_fetch_all("SELECT * FROM {users}");
foreach(
$users as $user)
{
    echo
'Имя: '.$user["fio"];
    echo
'Логин: '.$user["name"];
    echo
'E-mail: '.$user["mail"];
}

array query_range_fetch_all (string $query) – Отправляет запрос к базе данных с лимитом на количество получаюмых в результате рядов и получает массив результирующих рядов.

  • string $query: текст запроса

Пример:

// запрашиваем в базе данных 3 новости, начиная с 10й, не старше текущей даты
$rows = DB::query_range_fetch_all("SELECT id, [name], [anons] FROM {news} WHERE created<%d", time(), 10, 3);
foreach(
$rows as $row)
{
    echo
'ID: '.$row["id"];
    echo
'Название: '.$row["name"];
    echo
'Анонс: '.$row["anons"];
}

array query_fetch_key (string $query)

Отправляет запрос к базе данных и получает массив результирующих рядов, в котором ключами являются значения одного из полей, название которого переданно последним агрументом.

.

  • string $query: текст запроса

Пример:

// запрашиваем в базе данных новости не старше текущей даты
// результат получаем в виде массива, в котором ключами будет ID новости
$rows = DB::query_fetch_key("SELECT id, [name], [anons] FROM {news} WHERE created<%d", time(), "id");

echo
'Новость ID=4:';
    echo
'Название: '.$rows[4]["name"];
    echo
'Анонс: '.$rows[4]["anons"];

echo
'Новость ID=19:';
    echo
'Название: '.$rows[19]["name"];
    echo
'Анонс: '.$rows[19]["anons"];

array query_fetch_key_array (string $query) – Отправляет запрос к базе данных и получает массив, в котором ключами являются значения одного из полей, название которого переданно последним агрументом, а значениями массив результирующих рядов, соответствующих ключу..

  • string $query: текст запроса

Пример:

// запрашиваем комментарии за последние 10 дней
// с группировкой по комментарию-родителю
$comments = DB::query_fetch_key_array("SELECT * FROM {comments} WHERE created>%d", time() - 864000, "parent_id");
// комментарии первого уровня
forearch($comments[0] as $row)
{
    echo
$row["text"];
    
// вложенные комментарии второго уровня
    
if(! empty($comments[$row["id"]]))
    {
        foreach(
$comments[$row["id"]] as $r)
        {
            echo
$r["text"];
        }
    }
}

array query_fetch_key_value (string $query) – Отправляет запрос к базе данных и получает массив, в котором ключами являются значения одного из полей, название которого переданно предпоследним агрументом, а значениеями значения другого поля, название которого передано последним агрументом..

  • string $query: текст запроса

Пример:

// получаем категории товаров в виде массива,
// где ключами будут ID категории, а значениями название
$cats = DB::query_fetch_key_value("SELECT id, [name] FROM {shop_category} WHERE act='%d'", 1, "id", "name");
echo
'Название категории ID=3: '.$cats[3];
echo
'Название категории ID=5: '.$cats[5];

array query_fetch_value (string $query) – Отправляет запрос к базе данных и получает массив значений поля, название которого передано последним агрументом..

  • string $query: текст запроса

Пример:

// получаем массив идентификаторов активных пользователей
$user_ids = DB::query_fetch_value("SELECT id FROM {users} WHERE act='%d'", 1, "id");
print_r($user_ids);
/* выведет:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
) */

mixed query_fetch_object () – Получает результирующий ряд как массив из SQL-запроса.

Пример:

// запрашиваем в базе данных пользователя ID=4
$user = DB::query_fetch_object("SELECT * FROM {users} WHERE id=4");
echo
'Имя: '.$user->fio;
echo
'Логин: '.$user->name;
echo
'E-mail: '.$user->mail;

integer size () – Получает размер базы данных.

array fields ([string $field = false], [boolean $no_cache = false]) – Получает список таблиц базы данных.

  • string $field: поле, которое должно присутствовать в таблице
  • boolean $no_cache: не использовать кэш

array columns (string $table, [boolean $no_cache = false]) – Получает список полей таблицы базы данных.

  • string $table: имя таблицы
  • boolean $no_cache: не использовать кэш

array tables ([string $table = false], [boolean $no_cache = false]) – Получает информацию о таблицах или таблицы базы данных.

  • string $table: имя таблицы
  • boolean $no_cache: не использовать кэш

string escape_string (string $str) – Мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов/charset соединения.

  • string $str: исходная строка

Пример:

// подготовим данные, полученне от пользователя
// для безопасного использования непосредственно в SQL-запросе
$search = DB::escape_string($_GET["searchword"]);
DB::query("INSERT INTO {search_history} (created, name) VALUES (".time().", '".$search."')");

Ваши комментарии и дополнения

Ваш комментарий будет первым.

Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.