SQL

Класс SQL предоставляет собой облегчённую обвёртку интерфейса для доступа к базам данных SQL в PHP (работает с помощью PDO).

Пространство имен: \DB

Расположение файла: lib/db/sql.php

Конструктор

$db = new \DB\SQL ( string $dsn [, string $user = NULL [, string $pw = NULL [, array $options = NULL ]]] );

Например, для подключения к базе данных MySQL синтаксис выглядит так:

$db=new \DB\SQL('mysql:host=localhost;port=3306;dbname=mysqldb','username','password');\
 

Подключение к базе данных SQLite будет выглядеть так:

$db=new \DB\SQL('sqlite:/path/to/db.sqlite');

Четвертый параметр - это набор параметров, которые вы можете использовать для установки дополнительных атрибутов PDO:

$options = array(
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, // generic attribute
    \PDO::ATTR_PERSISTENT => TRUE,  // we want to use persistent connections
    \PDO::MYSQL_ATTR_COMPRESS => TRUE, // MySQL-specific attribute
);
$db = new \DB\SQL('mysql:host=localhost;port=3306;dbname=mysqldb','username','password', $options);

Вот список ссылок на сведения о DSN-соединении для всех поддерживаемых в настоящее время движков на уровне SQL:

  • mysql : MySQL 5.x
  • sqlite : SQLite 3 и SQLite 2
  • pgsql : PostgreSQL
  • sqlsrv : Microsoft SQL Server / SQL Azure
  • mssql, dblib, sybase : FreeTDS / Microsoft SQL Server / Sybase
  • odbc : ODBC v3
  • oci : Oracle

Методы

driver

Вернуть имя драйвера SQL

echo $db->driver(); // mysql

version

Вернуть версию сервера

echo $db->version(); // 5.1.51

name

Вернуть имя базы данных

echo $db->name(); // mysqldb

schema

Получить схему таблицы SQL

array|FALSE schema ( string $table [, array|string $fields = NULL [, int $ttl = 0 ]] )

Эта функция позволяет получить схему данной таблицы SQL.

$fields представляет собой либо массив, либо список имен столбцов для включения в возвращаемую схему. По умолчанию для всех полей.

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

Пример использования:

$db->exec("CREATE TABLE IF NOT EXISTS mytable
          (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
           name varchar(128) NULL DEFAULT 'anonymous',
           age SMALLINT UNSIGNED NOT NULL,
           birth DATE NULL
          )"
);
$columns = $db->schema('mytable', 'name;age'); // only interested in these 2 columns
var_dump($columns);
// outputs
array (size=2) {
	'name' => array (size=5) { 
		'type' => string 'varchar(128)' (length=12)
		'pdo_type' => int 2  // \PDO::PARAM_STR
		'default' => string 'anonymous' (length=9)
		'nullable' => boolean true
		'pkey' => boolean false 
	}
	'age' => array (size=5) {
		'type' => string 'SMALLINT UNSIGNED' (length=17)
		'pdo_type' => int 1 // \PDO::PARAM_INT
		'default' => null
		'nullable' => boolean false
		'pkey' => boolean false
	}
}

Совет: вы можете улучшить производительность InnoDB в MySQL с помощью `SET GLOBAL innodb_stats_on_metadata = 0;` ! Для этого требуется привилегия администратора!

exec

Выполнить команду SQL

array|int|FALSE exec ( string|array $commands [, string|array $args = NULL [, int $ttl = 0 [, bool $log=TRUE ]]] )
 

Этот метод позволяет выполнять один или несколько заданных операторов $commands SQL и возвращает либо результирующие строки (для операторов SELECT, CALL, EXPLAIN, PRAGMA и SHOW), либо количество затронутых строк (для операторов INSERT, DELETE и UPDATE) или FALSE в случае ошибки.

Можно использовать $args для применения определенных аргументы к командам SQL.

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

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

Например, рассмотрим следующую таблицу mytable:

id name
1 Joe
2 William
3 Jack
4 Averell
$rows=$db->exec('SELECT id,name FROM mytable ORDER BY id DESC');
echo count($rows); // outputs 4
foreach($rows as $row)
  echo $row['name'];
// outputs 'Averell,Jack,William,Joe,'

в то время как оператор UPDATE вернет количество обновленных строк:

echo $db->exec('UPDATE mytable SET id=id+10'); // outputs 4

Параметризованные запросы

В exec()второй аргумент нужен , чтобы передать аргументы безопасно (см параметризованные запросы ).

Например, вместо:

$db->exec('INSERT INTO mytable VALUES(5,\'Jim\')')

настоятельно рекомендуется написать:

$db->exec('INSERT INTO mytable VALUES(:id,:name)',array(':id'=>5,':name'=>'Jim'))

Вот эквивалентный синтаксис с безымянными заполнителями:

$db->exec('INSERT INTO mytable VALUES(?,?)',array(5,'Jim'))

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

$db->exec('INSERT INTO mytable(name) VALUES(?)','Jim');

Кэширование запросов

Третий аргумент $ttl используется для включения кэширования запросов. Установите желаемое время жизни в секундах и убедитесь, что у вас активирован CACHE . Таким образом, вы можете ускорить работу своего приложения при обработке данных, которые не очень часто меняются.

Четвертый аргумент $log - это переменная для включения и отключения логов. Вы можете использовать этот параметр для профилирования, так как время обработки в миллисекундах также регистрируется в журнале каждой команды SQL.

Трансакция

Одновременно может выполняться несколько операторов SQL, если предоставляется массив операторов. F3 выполнит их как транзакцию, поэтому в случае сбоя одного оператора выполняется откат всего стека запросов.

Имейте в виду, что возвращаемое значение относится только к последней выполненной инструкции.

$result=$db->exec(array(
    'INSERT INTO mytable VALUES(:id,:name)',
    'DELETE FROM mytable'
  ),
  array(
    array(':id'=>6,':name'=>'Bill'),
    NULL
  )
);
echo $result; // outputs 6 (deleted rows)

Если вам нужно возвращаемое значение для каждого оператора, вы должны явно определить транзакцию и использовать exec()для каждого оператора (см. Ниже).

begin, rollback & commit

Запуск, прерывание или завершение транзакции SQL

// state 1: empty table
$db->begin();
$db->exec('INSERT INTO mytable(name) VALUES(?)','Alfred');
$db->exec('INSERT INTO mytable(name) VALUES(?)','Bonnie');
// state 2: table contains 2 rows
$db->rollback();
// state 3: back to state 1
$db->exec('INSERT INTO mytable(name) VALUES(?)','Clyde');
// state 4: table contains 1 row
$db->commit();
// state 5: changes commited
// end of transaction: only Clyde has been inserted to database

trans

Вернет TRUE, если в данный момент активна транзакция SQL

if (!$db->trans())
    $db->begin();

count

Вернуть количество строк, затронутых последним запросом

$db->exec('INSERT INTO mytable(name) VALUES(?)','Alfred');
echo $db->count(); // outputs 1
$db->exec('INSERT INTO mytable(name) VALUES(?)','Bonnie');
echo $db->count(); // outputs 1
$db->exec('SELECT * FROM mytable');
echo $db->count(); // outputs 2

log

Вернуть результаты профилировщика SQL

$db->exec('INSERT INTO mytable(name) VALUES(?)','Clyde');
$db->exec('INSERT INTO mytable(name) VALUES(?)','Don');
$db->exec('INSERT INTO mytable(name) VALUES(?)','Elliott');
 
echo $db->log();
 
// outputs:
Mon, 27 Dec 2013 12:26:05 +0100 (2.0ms) INSERT INTO mytable(name) VALUES('Clyde')
Mon, 27 Dec 2013 12:26:05 +0100 (3.6ms) INSERT INTO mytable(name) VALUES('Don')
Mon, 27 Dec 2013 12:26:05 +0100 (1.3ms) INSERT INTO mytable(name) VALUES('Elliott')

uuid

Вернуть уникальный хэш идентификатора подключения

string uuid ( )

Эта функция возвращает хэш от $dsn DSN , передаваемого в _constructоr

type

Сопоставьте тип данных аргумента с его обратной константой PDO

int type ( scalar $val )

Эта функция позволяет получить константу PDO, соответствующую типу php, $valкак показано ниже:

  • тип PHP NULL вернет \PDO::PARAM_NULL
  • тип PHP boolean вернет \PDO::PARAM_BOOL(int 5)
  • тип PHP integer типа PHP врнет \PDO::PARAM_INT(int 1)
  • и любой другой тип php вернет \PDO::PARAM_STR(int 2)

quote

Строка цитаты

string quote ( string $val [, int $type = \PDO::PARAM_STR ] )

quotekey

Вернуть имя идентификатора в кавычках

string quotekey ( string $key )

Эта функция экранирует кавычками имя ключа таблицы или столбца в соответствии с требованиями и синтаксисом текущей базы данных. Например , превратит page в «page» для SQLite и Oracle, а для db MySQL превратит в `page`.

pdo

Возврат объекта PDO

\PDO pdo ( )
Печать/экспорт