Source for file QAL.class.php
Documentation is available at QAL.class.php
* @copyright Energine 2006
//require_once('core/framework/DBA.class.php');
* Query Abstraction Layer.
* Режимы модифицирующих операций
* @param string $username
* @param string $password
* @param object $driverOptions
public function __construct($dsn, $username, $password, array $driverOptions, $charset = 'utf8') {
parent::__construct($dsn, $username, $password, $driverOptions, $charset);
* Выполняет простой SELECT-запрос к БД и возвращает результат выборки.
* Имена полей $fields задаётся одним из трёх способов:
* 3. true, для выборки всех полей таблицы.
* Условие выборки $condition задаётся массивом вида array(имя_поля => значение),
* или строкой WHERE-условия типа 'field1 = 4 AND field2 = 8'.
* Порядок сортировки результа задаётся массивом вида array(имя_поля => порядок_сортировки),
* или строкой предложения ORDER BY типа 'field1 DESC, field2 ASC'.
* Лимит выборки задаётся массивом вида array(смещение, кол-во_строк),
* или строкой предложения LIMIT типа '32'.
* Возвращает массив результата выборки или true, если результат пустой.
* @param string $tableName имя таблицы
* @param mixed $fields массив имен полей ИЛИ имя одного поля ИЛИ true для выборки всех полей таблицы
* @param mixed $condition условие выборки
* @param mixed $order порядок сортировки результата
* @param mixed $limit лимит выборки
* @see DBA::selectRequest()
public function select($tableName, $fields = true, $condition = null, $order = null, $limit = null) {
//$tableName = strtolower($tableName);
if (is_array($fields) && !empty($fields)) {
elseif ($fields === true) {
if ($this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'mysql') {
$tableName = "`$tableName`";
$sqlQuery = "SELECT $fields FROM $tableName";
$sqlQuery .= ' LIMIT '. implode(', ', $limit);
$sqlQuery .= " LIMIT $limit";
* Выполняет простую модифицирующую (INSERT, UPDATE, DELETE) операцию в БД.
* Режим операции задаётся одной из трёх констант:
* 1. QAL::INSERT - вставка;
* 2. QAL::UPDATE - обновление;
* 3. QAL::DELETE - удаление.
* Данные для операций типа QAL::INSERT и QAL::UPDATE задаются массивом
* вида array(имя_поля => значение).
* Условие операции задаётся массивом вида array(имя_поля => значение),
* или строкой WHERE-условия типа 'field1 = 4 AND field2 = 8'.
* В режиме QAL::INSERT метод возвращает последний сгенерированный ID для
* поля типа AUTO_INCREMENT, или true если такого поля в таблице нет.
* В режимах QAL::UPDATE и QAL::DELETE при успешном выполнении запроса
* всегда возвращается true.
* При ошибке выполнения любого типа операций возвращается false.
* @param int $mode режим операции
* @param string $tableName имя таблицы
* @param array $data данные для операции
* @param mixed $condition условие операции
* @see DBA::modifyRequest()
public function modify($mode, $tableName, array $data = null, $condition = null) {
if (empty($mode) || empty($tableName)) {
foreach ($data as $fieldName => $fieldValue) {
$fieldNames[] = $fieldName;
if ($fieldValue === self::EMPTY_STRING) {
$fieldValue = $this->quote('');
elseif ($fieldValue == '') {
$fieldValue = $this->quote($fieldValue);
$fieldValues[] = $fieldValue;
$sqlQuery = "INSERT INTO `$tableName` (". implode(', ', $fieldNames). ') VALUES ('. implode(', ', $fieldValues). ')';
$sqlQuery = "INSERT INTO `$tableName` VALUES ()";
foreach ($data as $fieldName => $fieldValue) {
if ($fieldValue === self::EMPTY_STRING) {
$fieldValue = $this->quote('');
elseif ($fieldValue === '') {
$fieldValue = $this->quote($fieldValue);
$fields[] = "$fieldName = $fieldValue";
$sqlQuery = "UPDATE `$tableName` SET ". implode(', ', $fields);
$sqlQuery = "DELETE FROM `$tableName`";
if (isset ($condition) && $mode != self::INSERT) {
* Строит WHERE-условие для SQL-запроса.
* @param mixed $condition
* @see QAL::selectRequest()
if (!empty($condition)) {
foreach ($condition as $fieldName => $value) {
//$fieldName = strtolower($fieldName);
$cond[] = "$fieldName IS NULL";
$cond[] = $fieldName. ' IN ('. $value. ')';
else $cond[] = ' FALSE ';
$cond[] = "$fieldName = ". $this->quote($value);
$result .= implode(' AND ', $cond);
* ВОзвращает данные из таблицы связанной по внешнему ключу
* @param string Имя таблицы
* @param string имя ключа
* @param int идентификатор текущего языка
* @param mixed ограничение на выборку
* @todo Исключать поля типа текст из результатов выборки для таблицы с переводами
* @todo Подключить фильтрацию
public function getForeignKeyData($fkTableName, $fkKeyName, $currentLangID, $filter = null) {
$fkValueName = substr($fkKeyName, 0, strpos($fkKeyName, '_')). '_name';
//если существует таблица с переводами для связанной таблицы
//нужно брать значения оттуда
LEFT JOIN %s %3$s on %3$s.%s = %2$s.%s
WHERE lang_id =%s'. $filter,
create_function('$value', 'return !($value["type"] == QAL::COLTYPE_TEXT);')
$res = $this->select($fkTableName, array_keys($columns), $filter, array($fkValueName=> QAL::ASC));
return array($res, $fkKeyName, $fkValueName);
* Строит предложение ORDER BY для SQL-запроса.
* @see QAL::selectRequest()
$orderClause = ' ORDER BY ';
foreach ($clause as $fieldName => $direction) {
//$fieldName = strtolower($fieldName);
$cls[] = "$fieldName ". constant("self::$direction");
$orderClause .= implode(', ', $cls);
* Строит предложение LIMIT для SQL-запроса.
* @see QAL::selectRequest()
$limitClause = " LIMIT {$clause[0]}";
$limitClause .= ", {$clause[1]}";
|