Основы работы с базой данных. Класс DB
Основы работы с базой данных. Класс DB
Для большинства модулей в PrestaShop требутся возможность чтения или записи в базе данных. Такую возможность предоставляет класс ядра DB. Помимо обеспечения абстракции для различных типов баз данных (пока реализована поддержка только MySQL) этот класс предоставляет некоторые инструменты для упрощения работы с базой.
Основы работы с классом
Класс DB состоит из двух классов:
- Класс DB в файле ~/classes/Db.php является абстрактным
- Класс MySQL в файле ~/classes/MySQL.php основан на классе DB
Добавление поддержки других типов баз данных может быть реализовано через создание классов потомков DB и размещением соответсвующих файлов в директории ~/classes (например класс MyDb в файле MyDb.php). Для использования созданного класса в файле ~/classes/config/settings.inc.php устанавливаем константу _DB_TYPE_ в соответсвии с названием класса (например define('_DB_TYPE_', 'MyDb');)
Для доступа к базе данных экземпляр объекта DB может быть получен как:
$db = Db::getInstance();
Версиях >1.4 этот код может выглядить как:
$db = Db::getInstance(_PS_USE_SQL_SLAVE_);
Такая запись позволяет использовать подчиненные SQL сервера. Версия 1.4 позволяет использовать несколько MySQL серверов. Изменения в базе главного сервера, доступ к которому может быть получен при помощи первого кода, реплицируются на вторичные сервера. Если используется _PS_USE_SQL_SLAVE_ будет произведено подключение к одному из доступных серверов (главному или подчиненным), что позволит распределить нагрузку между серверами. Аргумент _PS_USE_SQL_SLAVE_ должен использоваться только для запросов чтения (SELECT, SHOW и т.д.), и только если результат не обновляется немедленно. Если требуется получить данные из какой-либо таблицы сразу после внесения изменений в нее используйте запрос к главному серверу.
Методы класса DB
Метод autoExecute()
Этот метод автоматически генерирует запросы вставки или обновления строк в базе данных. Он должен использоваться вместо непосредственного выполнения INSERT или UPDATE запросов (если запросы не являются составными). Преимущество этого метода в централизации выполнения запросов (метод может быть переопределен для изменения запросов к определенным таблицам).
Пример использования:
$target = Tools::getValue('id'); $name = Tools::getValue('name'); Db::getInstance()->autoExecute('target_table', array( 'id_target' => (int)$target, 'name' => pSQL($name), ), 'INSERT');
Будет сформирован запрос:
INSERT INTO `target_table` (`id_target`, `name`) VALUES (10, 'myName')
- Убедитесь, что ваши данные защищены от SQL инъекций до их использования в autoExecute(). В примере, id_target приводится к целому, а name защищается от SQL инъекций при помощи функции pSQL()
- Именам таблиц должен всегда предшествовать префикс (константа _DB_PREFIX_)
- Для создания запроса на частичное обновление нужно использовать четвертый аргумент функции для указания условий (например …→autoExecute('table', $data, 'UPDATE', 'myField = 13 AND id < 8');)
Метод autoExecuteWithNullValues()
Этот метод делает то же самое, что и autoExecute(), но с одним различием: пустые строки и нулевые значения заменяются на SQL NULL. Этот метод используется, если ваши поля принимают нулевые значения и в базу данных должен попасть NULL, а не пустая строка. Этот метод полезен при добавлении в базу пустой строки, когда на определенные поля стоит ограничение уникальности значения.
Метод Delete($table, $where = false, $limit = false, $use_cache = 1)
Этот метод DELETE версия autoExecute(). Он может быть использован для тех же целей. Аргумент $limit ограничивает число удаляемых записей. Преимуществом этого метода является то, что он может быть использован совместно с PrestaShop's SQL query cache system и удаляет кэшированные запросы, если не установить аргумент $use_cache в false.
Пример:
Db::getInstance('target_table', 'myField < 15', 3);
Создает запрос:
DELETE FROM target_table WHERE myField < 15 LIMIT 3
Метод Execute($sql, $use_cache = 1)
Этот метод выполняет запрос из аргумента $sql. Она должна использоваться только для запросов записи (INSERT, UPDATE, DELETE, TRUNCATE и т.д.), поскольку удаляет кэш запросов (если не установить аргумент $use_cache в false).
Пример:
$sql = 'DELETE FROM `'._DB_PREFIX_.'product` WHERE `date_upd` < NOW()'; if (!Db::getInstance()->Execute($sql)) die('Error');
Метод ExecuteS($sql, $array = true, $use_cache = 1)
Этот метод выполняет $sql запрос и загружает все результаты в массив. Метод используется только для запросов чтения (SELECT, SHOW и т.д.). Результаты запроса будут кэшироваться, если не установить аргумент $use_cache в false. Пример:
$sql = 'SELECT * FROM `'._DB_PREFIX_.'shop`'; if ($results = Db::getInstance()->ExecuteS($sql)) foreach ($results as $row) echo $row['id_shop'].' - '.$row['name'];
Метод getRow($sql, $use_cache = 1)
Этот метод выполняет $sql запрос и возвращает первую строку результата. Метод используется только для запросов чтения (SELECT, SHOW и т.д.). Результаты запроса будут кэшироваться, если не установить аргумент $use_cache в false.
$sql = 'SELECT * FROM `'._DB_PREFIX_.'shop` WHERE id_shop = 42'; if ($row = Db::getInstance()->getRow($sql)) echo $row['id_shop'].' - '.$row['name'];
Метод getValue($sql, $use_cache = 1)
Этот метод выполняет $sql запрос и возвращает первую колонку первой строки результата. Метод используется только для запросов чтения (SELECT, SHOW и т.д.). Результаты запроса будут кэшироваться, если не установить аргумент $use_cache в false.
$sql = 'SELECT COUNT(*) FROM `'._DB_PREFIX_.'shop`'; $totalShop = Db::getInstance()->getValue($sql);
Метод NumRows()
Этот метод отображает количество результатов последнего запроса SQL.
Другие методы
- Insert_ID(): возвращает ID строки, созданной последним INSERT запросом
- Affected_Rows(): возвращает количество строк, затронутых последним UPDATE или DELETE запросом
- getMsgError(): возвращает последнее сообщение об ошибке, если выполнение запроса не удалось
- getNumberError(): возвращает номер последней ошибки, если выполнение запроса не удалось