Работа с базой данных

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

Подготовка таблиц и схемы данных

Хаки автоматически поддерживают свои таблицы в базе данных в актуальном состоянии. Описание таблиц находится в файле schema.php в папке с хаком. Вам не потребуется создавать её вручную, используйте встроенный инструментарий:

  1. Подключитесь к базе данных своей сети через phpMyAdmin или MySQL WorkBench.
  2. Обязательно деактивируйте хак, если он активен!
  3. Создайте требуемые таблицы с нужными индексами. Используйте движок Aria.
  4. Обязательно следуйте принципам именования таблиц из следующего раздела.
  5. Перейдите в раздел "Генератор схемы данных" по кнопке "Файлы"
  6. Проверьте список таблиц и создайте новую схему. Она сохранится в хаке автоматически.
  7. Активируйте хак после обновления файла схемы данных.

Важно! Работа над таблицами хака должна вестись только на отключенном хаке! Любые изменения могут быть стёрты в соответствии со схемой данных в момент проверки системы или установки обновлений!

Принципы именования таблиц

Таблицы, создаваемые и используемые для хаков, должны начинаться с названия хака с префиксом x в начале. Полное название таблицы будет выглядеть как cpa_xhack_table, где вместо hack будет название хака, а table - имя самой таблицы. Названия таблиц всегда указываются маленькими латинскими буквами. Например, таблица со списком адресов из хака proxy будет называться cpa_xproxy_addr.

Названия таблиц рекомендуется задавать в файле start.php вашего хака в специальных константах с префиксом DB_. Например, таблица cpa_xproxy_addr может быть описана константой DB_XPROXY_ADDR или DB_XPROXY_ADDR_ADDR. Само имя таблицы указывается с SQL_PREF в начале.

define( 'DB_XPROXY_ADDR', SQL_PREF . 'xproxy_addr' );

Функции работы с базой данных

Работа с базой осуществляется через объект $core->db. Все данные для работы функций должны быть предварительно подготовлены и очищены. Данные, поступающие в $core->get и $core->post, уже подготовлены для работы. Данные из API-функций или созданные внутри приложения рекомендуется предварительно обработать функцией addslashes().

$core->db->query( $sql )

Выполняет текстовый запрос из $sql и возвращает true в случае успеха или false в случае неудачи.

$core->db->query( "UPDATE ".DB_XPROXY_ADDR." SET proxy_fail = 1 WHERE proxy_id = '$id'" );

$core->db->row( $sql )

Извлекает из базы строку по запросу $sql в виде ассоциативного массива.

$core->db->row( "SELECT * FROM ".DB_XPROXY_ADDR." WHERE proxy_id = '$id' LIMIT 1" );

$core->db->field( $sql )

Извлекает из базы одно поле по запросу $sql. Удобно для выборки количества элементов.

$core->db->data( "SELECT COUNT(*) FROM ".DB_XPROXY_ADDR." WHERE proxy_status = 1" );

$core->db->data( $sql )

Извлекает из базы массив строк по запросу $sql в виде ассоциативного массива. Рекомендуется при работе с небольшими наборами данных до сотни элементов.

$core->db->data( "SELECT proxy_id, proxy_status, proxy_ip, proxy_port FROM ".DB_XPROXY_ADDR." WHERE proxy_check = 1" );

$core->db->col( $sql )

Извлекает из базы столбец по запросу $sql в виде плоского массива.

$core->db->col( "SELECT proxy_id FROM ".DB_XPROXY_ADDR." WHERE proxy_check = 0" );

$core->db->icol( $sql )

Извлекает из базы ассоциативный массив ключ-значение из первого и второго элементов выборки по запросу $sql. Удобно для извлечения списка названий элементов.

$core->db->icol( "SELECT proxy_id, proxy_name FROM ".DB_XPROXY_ADDR." WHERE proxy_status = 1" );

$core->db->it( $sql )

Извлекает массив строк из базы через итератор. Аналог $core->db->data() для больших объемов данных. Рекомендуется для работы со статистикой.

$data = $core->db->it( "SELECT * FROM ".DB_XPROXY_ADDR );
foreach ( $data as $d ) … 

$core->db->ic( $sql )

Извлекает колонку из базы данных через итератор. Аналог $core->db->col() для больших объёмов данных.

$data = $core->db->ic( "SELECT proxy_token FROM ".DB_XPROXY_ADDR );
foreach ( $data as $d ) …

$core->db->ii( $sql )

Извлекает ассоциативный массив ключ-значение из базы через итератор. Аналог $core->db->icol() для больших объёмов данных.

$data = $core->db->ii( "SELECT proxy_id, proxy_name FROM ".DB_XPROXY_ADDR );
foreach ( $data as $id => $v ) …

$core->db->add( $table, $data )

Добавляет элемент из массива $data в таблицу с названием $table. Возвращает true в случае успеха и false в случае проблемы. Важно! Данные в массиве должны быть предварительно "защищены" вручную.

$core->db->add( DB_XPROXY_ADDR, [ 'proxy_name' => 'Meow', 'proxy_ip' => '127.0.0.1' ] );

$core->db->lastid()

Возвращает идентификатор последнего добавленного в базу элемента.

$core->db->replace( $table, $data )

Аналог $core->db->add, но работающий с командой REPLACE.

$core->db->addupd( $table, $data )

Аналог $core->db->add, который обновляет данные при наличии записи с таким же ключом. Замена $core->db->replace, которая не меняет идентификатор элемента при запросе.

$core->db->edit( $table, $data, $where )

Изменяет данные $data в таблице с названием $table с условием $where. Возвращает true в случае успеха и false в случае проблемы. Условие $where может быть передано как строкой, так и массивом ключ-значение. Значения массива складываются через AND. Важно! Данные в массиве должны быть предварительно "защищены" вручную.

$core->db->edit( DB_XPROXY_ADDR, [ 'proxy_status' => 1], "proxy_id = '$id'" ] );
$core->db->edit( DB_XPROXY_ADDR, [ 'proxy_status' => 1 ], [ 'proxy_id' => $id ] );

$core->db->del( $table, $where )

Удаляет данные в таблице с названием $table по условию $where. Возвращает true в случае успеха и false в случае проблемы. Условие $where работает так же, как в функции edit.

$core->db->del( DB_XPROXY_ADDR, [ 'proxy_id' => $id ] );

$core->db->get( $table, $where )

Возвращает одну строку из таблицы $table по условию $where в виде ассоциативного массива. Обёртка над функцией $core->db->row(). Условие $where работает так же, как в функции edit.

$core->db->get( DB_XPROXY_ADDR, [ 'proxy_id' => $id ] );

$core->db->all( $table, $where )

Возвращает все строки из таблицы $table по условию $where в виде ассоциативного массива. Обёртка над функцией $core->db->data(). Условие $where работает так же, как в функции edit.

$core->db->all( DB_XPROXY_ADDR, [ 'proxy_status' => 1 ] );