База данных OSC\OM\Db

Введение

Класс Db управляет подключением к серверу базы данных и выполняет SQL-запросы. Он расширяет родной класс PHP PDO, через простую функциональность оптимизированую к структуре.

Класс выполняет SQL запросы, безопасно и надежно, путем связывания значений параметров запроса с помощью заглушки, а затем, имеющиеся значения вводит через сам SQL-запрос.

Связи

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

use OSC\OM\Db;

$OSCOM_Db = Db:: initialize();

Параметры

 Db::initialize($server, $username, $password, $database, $port, array $driver_options)

 Параметр  Значение
  $server   The address of the database server. Default: db_server
  $username   The username to connect to the database server with. Default: db_server_username
  $password   The password of the user account. Default: db_server_password
  $database   The name of the database. Default: db_database
  $port   The port number of the database server. Default: null
  $driver_options   Additional driver options to use for the database connection. Defaults:
 

PDO::ATTR_ERRMODE
 PDO::ERRMODE_WARNING


PDO::ATTR_DEFAULT_FETCH_MODE
 PDO::FETCH_ASSOC


PDO::ATTR_STATEMENT_CLASS
 OSC\OM\DbStatement


PDO::MYSQL_ATTR_INIT_COMMAND
 set session
 sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_S

Соединение с базой данных создается на каждом запросе страницы и доступен в регистре как Db.

Запросы

Подготовленные выражения

Запросы выполняются с Db::prepare(), который надежно связывает значения запроса с использованием заполнителей.

$seach = 'chocolate' ;
$category_id = 1;
$price = '4.99' ;
$Qproducts = $OSCOM_Db­>prepare('select title from :table_products where description like :description and category_id = :category_
id and status = :status and price < :price order by title' );
$Qproducts­>bindValue(':description' , '%' . $chocolate . '%' );
$Qproducts­>bindInt(':category_id' , $category_id);
$Qproducts­>bindBool(':status' , true);
$Qproducts­>bindDecimal(':price' , $price);
$Qproducts­>execute();
while ($Qproducts­>fetch()) {
echo $Qproducts­>value('title' );
}

Связанные параметры

Параметры могут быть связаны в запрос, используя следующие функции:

 Значение типа  Функция
  String   bindValue
  Integer   bindInt
  Boolean   bindBool
  Decimal   bindDecimal
  Null   bindNull

 Имена таблиц с префиксом: table_ связываются и подставляются автоматически через db_table_prefix.

Простой вызов функции

Выбор запроса

Простому вызову запроса, не нужны параметры, связи могут быть выполнены через Db::query(). Эта функция возвращает нормальный результат.

$Qstates = $OSCOM_Db­>query('select id, title from :table_states where country_id = 1 order by title' );

while ($Qstates­>fetch()) {

echo $Qstates­>value('title' );

}

Обновление / удаление запросов

Простое обновление / удаление запросов, которые не нужны параметры, которые будут привязываться могут быть выполнены с Db::Exec(). Эта функция возвращает число затронутых строк.

$result = $OSCOM_Db­>exec('delete from :table_states where country_id = 1' );

echo 'Affected rows: ' . $result;

Результаты

Результаты могут быть возвращены в виде одного набора результатов, множественного набора результатов, и как массив, содержащий все строки или столбцы.

Fetching

Один набор результатов

Возвращение одного  результата выполняется следующим образом:

$Qstate = $OSCOM_Db­>prepare('select title from :table_states where id = :id' );

$Qstate­>bindInt(':id' , 1);

$Qstate­>execute();

if ($Qstate­>fetch() !== false) {

echo 'State: ' . $Qstate­>value('title' );

}

Множественный набор результатов

Возвращение множественного результирующего набора выполняется следующим образом:

$Qstates = $OSCOM_Db­>prepare('select id, title from :table_states where country_id = :country_id' );

$Qstates­>bindInt(':country_id' , 1);

$Qstates­>execute();

while ($Qstates­>fetch()) {

echo 'State: ' . $Qstates­>value('title' );

}

Массив набора результатов

Массив может быть получен, содержащий либо все строки результирующего набора или все столбцы текущей строки:

$Qstates = $OSCOM_Db­>prepare('select id, title from :table_states where country_id = :country_id' );

$Qstates­>bindInt(':country_id' , 1);

$Qstates­>execute();

$states_all = $Qstates­>fetchAll();

$current_state = $Qstates­>toArray();

Результат существует

Проверка, чтобы увидеть, что результат существует, выполняется следующим образом:

$Qstates = $OSCOM_Db­>prepare('select id, title from :table_states where country_id = :country_id' );

$Qstates­>bindInt(':country_id' , 1);

$Qstates­>execute();

if ($Qstates­>fetch() !== false) {

echo 'States:' ;

do {

echo $Qstates­>value('title' );

} while ($Qstates­>fetch());

} else {

echo 'No states exist.' ;

}
Обратите внимание, что следующий вариант не будет работать:
$Qstates = $OSCOM_Db­>prepare('select id, title from :table_states where country_id = :country_id' );

$Qstates­>bindInt(':country_id' , 1);

$Qstates­>execute();

if ($Qstates­>fetch() !== false) {

echo 'States:' ;

while ($Qstates­>fetch()) {

echo $Qstates­>value('title' );

}

}
как вызов fetch() в ifstatement, чтобы проверить, если строка существует и пробегаем по результатам снова в whilestatement пропустит первую строку из результирующего набора из-за первого вызова. Метод do { .. } while ( .. ), показанный выше, является правильным способом.

Тип Hinting

Колонки могут быть возвращены в качестве конкретного типа переменной, используя следующие функции:

 Значение типа  Функция
  String   value
  HTML Safe String   valueProtected
  Integer   valueInt
  Decimal   valueDecimal
$Qproducts = $OSCOM_Db­>prepare('select id, title, code, price from :table_products where description like :description order by ti
tle' );

$Qproducts­>bindValue(':description' , '%chocolate%' );

$Qproducts­>execute();

if ($Qproducts­>fetch() !== false) {

do {

echo $Qproducts­>valueInt('id' ) . ': ' . $Qproducts­>valueProtected('title' ) . ' (' . $Qproducts­>value('code' ) . ') = ' .

$Qproducts­>valueDecimal('price' );

} while ($Qproducts­>fetch());

}

Затронутые Ряды

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

$Qupdate = $OSCOM_Db­>prepare('update :table_states set title = :title where id = :id' );

$Qupdate­>bindValue(':title' , 'Beverly Hills' );

$Qupdate­>bindInt(':id' , 1);

$Qupdate­>execute;

echo 'Affected rows: ' . $Qupdate­>rowCount();

Всего строк

Получение полных строк запроса может быть выполнена в виде:

$Qtotal = $OSCOM_Db­>prepare('select SQL_CALC_FOUND_ROWS id from :table_orders where status = :status' );

$Qtotal­>bindBool(':status' , true);

$Qtotal­>execute();

echo 'Total rows: ' . $Qtotal­>getPageSetTotalRows();

getPageSetTotalRows() требует SQL_CALC_FOUND_ROWSto существует в запросе и автоматически извлекает общее количество строк с помощью выбора FOUND_ROWS() после того, как запрос был выполнен.

Кроме того, можно использовать fetchAll(), однако этот метод использует больше ресурсов сервера и не рекомендуется:

$Qorders = $OSCOM_Db­>prepare('select id from :table_orders where status = :status' );

$Qorders­>bindBool(':status' , true);

$Qorders­>execute();

echo 'Total rows: ' . count($Qtotal­>fetchAll());

Наборы Страницы

Возврат страницы результирующего набора выполняется следующим образом:

$Qorders = $OSCOM_Db­>prepare('select SQL_CALC_FOUND_ROWS order_number, total_price from :table_orders where customer_id = :customer_id and status = :status order by id desc limit :page_set_offset, :page_set_max_results' );

$Qorders­>bindInt(':customer_id' , 1);

$Qorders­>bindBool(':status' , true);

$Qorders­>setPageSet(15);

$Qorders­>execute();

if ($Qorders­>getPageSetTotalRows() > 0) {

echo 'Orders' ;

while ($Qorders­>fetch()) {

echo 'Order #' . $Qorders­>valueInt('order_number') . ': ' . $Qorders­>valueDecimal('total_price');

}

echo $Qorders­>getPageSetLabel('Displaying  {{listing_from}} to  {{listing_to}} (of  {{listing_total}} orders) ' );

echo $Qorders­>getPageSetLinks();

}

Параметры

 setPageSet($max_results, $page_set_keyword, $placeholder_offset, $placeholder_max_results)

 Параметр  Значение
  $max_results   The number of results to show per page.
  $page_set_keyword   The name of the parameter holding the current page value. Default: page
  $placeholder_offset   The name of the binding placeholder used as the limit offset in the sql query. Default: page_set_offset
  $placeholder_max_results   The name of the binding placeholder used as the limit row number in the sql query. Default: page_set_max_results
Имя параметра текущего значения страницы передается в качестве второго параметра. Значение по умолчанию равно pageand значение извлекается
от $_GET['page'], если он существует.

Кэширование

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

$Qcfg = $OSCOM_Db­>prepare('select key, value from :configuration' );

$Qcfg­>setCache('configuration' );

$Qcfg­>execute();

while ($Qcfg­>fetch()) {

echo $Qcfg­>value('key' ) . ': ' . $Qcfg­>value('value' );

}

Параметры

 setCache($key, $expire, $cache_empty_results)

 Параметр  Значение
  $key   The name of the cache block to retrieve or save.
  $expire   The time in minutes the cached data should be saved for. A value of 0 keeps the cached data indefinitly until it has been
manually cleared. Default: 0
  $cache_empty_results   A boolean value to cache or not cache empty result sets. Default: false

Shortcuts (Клавиши быстрого доступа)

Сочетания функции завернуть Db::prepare() в более простой интерфейс, чтобы помочь написать код быстрее для более простых запросов.

Db::get()

Db::get() могут быть использованы для извлечения строк из простого запроса.

$Qstates = $OSCOM_Db­>get('states' , [

'id' ,

'title'

], [

'country_id' => 1

], 'title' );

while ($Qstates­>fetch()) {

echo $Qstates­>value('title' );

}

Параметры

 Db::get($table, $fields, array $where, $order, $limit, $cache, array $options)

 Параметр  Значение
  $table

  One (string) or more tables (array) to retrieve the rows from. Aliases may be used as:
    ['countries as c', 'states as s']

Имена таблиц автоматически подставляются, если параметр prefix_tables не установлен как ложный (см параметр $options
).

  $fields   One (string) or more fields (array) to retrieve. Aliases may be used as:
    ['c.countries_id as id', 'c.countries_title as title']
  $where   Array containing keys and values matching the column name to the condition:
    ['id' => 1]
  $order   One (string) or more fields (array) to sort by:
    ['title', 'c.date_added']
  $limit   An integer value to limit the number of rows to, or an array containing two integer values to limit the number of rows (second value) with an offset (first value):
    [1, 15]
  $cache  Массив, состоящий из параметров (в порядке убывания), отправляемые на setCache().
  $options   An array containing the following options:
    ['prefix_tables' => true]

 Более сложные мульти-отношения пример запроса могут быть выполнены как:

$Qproducts = $OSCOM_Db­>get([

'products p' ,

'products_to_categories p2c'

], [

'count(*) as total'

], [

'p.products_id' => [

'rel' => 'p2c.products_id'

],

'p.products_status' => '1' ,

'p2c.categories_id' => '1'

]);

$products_count = $Qproducts­>valueInt('total' );

Db::save()

Db::save() можно использовать для вставки или обновления данных в таблице.

$result = $OSCOM_Db­>save('states' , [

'title' => 'California'

], [

'id' => 1

]);

echo 'Affected rows: ' . $result;

Параметры

 Db::save($table, array $data, array $where_condition)

 Параметр  Значение
  $table  В следующей таблице, чтобы сохранить данные.
  $data  Ассоциативный key=> значение массива, содержащий данные, для сохранения в таблице. Ключи массива должны соответствовать именам полей таблиц? значение массива должны быть в него сохранены.
  $where_condition  Если условие не передается, данные вставляются в таблицу в качестве новой записи. Если ассоциативная $key=>$value передается, он используется в качестве условия, когда запроса на обновление данных о существующей записи.

 Db::delete()

Db::delete() можно использовать для удаления одного, нескольких или всех записей из таблицы.

$result = $OSCOM_Db­>delete('states' , [

'id' => 1

]);

echo 'Affected rows: ' . $result;

Параметры

 Db::delete($table, array $where_condition)

 Параметр  Значение
  $table  Таблица для удаления из неё записей.
  $where_condition  Если условие не будет принято, то все записи в таблице будут удалены. Если ассоциативно передается массив $key=>$value, оно используется в качестве запроса, чтобы удалить совпадающие записи. Ключи массива должны соответствовать именам полей таблиц массив, сравнивая значения.
Предыдущая статья:

Registry osCommerce v2.4

Следующая статья:

Конфигурация файлов osCommerce v2.4