Основы работы с базой данных. Класс 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.

Этот метод автоматически добавляет в запрос LIMIT. Убедитесь, что вы не добавляете его вручную.

Пример:

$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.

Этот метод автоматически добавляет в запрос LIMIT. Убедитесь, что вы не добавляете его вручную.

Пример:

$sql = 'SELECT COUNT(*) FROM `'._DB_PREFIX_.'shop`';
   $totalShop = Db::getInstance()->getValue($sql);

Метод NumRows()

Этот метод отображает количество результатов последнего запроса SQL.

Этот метод не устарел, однако его использование не рекомендуется. Для получения количества строк используйте запрос SELECT COUNT (*).

Другие методы

  • Insert_ID(): возвращает ID строки, созданной последним INSERT запросом
  • Affected_Rows(): возвращает количество строк, затронутых последним UPDATE или DELETE запросом
  • getMsgError(): возвращает последнее сообщение об ошибке, если выполнение запроса не удалось
  • getNumberError(): возвращает номер последней ошибки, если выполнение запроса не удалось

Обсуждение

v, 2011/09/14 18:26

Пасибо!

indian program, 2013/04/09 08:37

tt, lol =))

Nik, 2014/10/30 09:32

Спасибо. Не могли добавить пример использания по каждому. Это будет действительно полезно=)

Андрей, 2015/02/11 15:04

Добрый день. Я не знаю, сюда я пишу или нет, подскажите пожалуйста, мне надо добавить строки:

add column «round_mode» in table «ps_orders» add column «id_tax_rules_group» in table «ps_order_detail»

Я зашел в админку магазина Расширенные параметры/Менеджер SQL / SQL query Name Cat - Править / LIST OF MYSQL TABLES / ps_orders а что дальше? PrestaShop 1.6.0.9.

Ваш комментарий. вики-синтаксис разрешён:
LGJTZ
 
osnovy-raboty-s-bazoj-dannyx.-klass-db.txt · Последние изменения: 2015/12/27 16:22 (внешнее изменение)