База данных 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
|
Соединение с базой данных создается на каждом запросе страницы и доступен в регистре как 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' );
}
}
Тип 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: Имена таблиц автоматически подставляются, если параметр 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, оно используется в качестве запроса, чтобы удалить совпадающие записи. Ключи массива должны соответствовать именам полей таблиц массив, сравнивая значения. |