Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Работа c БД - orm d7 и старое ядро api



  • таблицы БД Битрикса можно посмотреть тут /bitrix/admin/perfmon_tables.php?lang=ru
  • выполнить любой SQL запрос тут /bitrix/admin/sql.php?lang=ru&del_query=Y

Работа с БД Битрикс API d7
api d7 - документация битрикса
$connection = \Bitrix\Main\Application::getConnection(); 
$sqlHelper = $connection->getSqlHelper();
выборка
//Строка запроса. Выбираем все логины, активных пользователей
$sql = 'SELECT LOGIN FROM b_user WHERE ACTIVE = \''.$sqlHelper->forSql('Y', 1).'\' ';


$recordset = $connection->query($sql); //вернет все элементы, удовлетворяющие условию

//можно, но не обязательно, модифицировать данные
$recordset->addFetchDataModifier(
   function ($data){
   $data["LOGIN"] .= ": Логин пользователя";
   return $data;
   }
);

$arResult = [];
while ($record = $recordset->fetch()){
   $arResult[]=$record;
}


$arResult = $connection->queryScalar($sql); //вернет 1й элемент, удовлетворяющий условию

выполнить любой sql запрос
$connection->queryExecute($sqlQuery);

в т.ч. обновить
$connection->queryExecute('UPDATE b_user SET ACTIVE = \'N\' WHERE LOGIN=\'test\' ');
в т.ч. добавить
$connection->queryExecute('INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)');



Работа с БД Битрикс старый api
класс CDatabase - документация Битрикса
При запуске каждой страницы автоматически создаётся глобальный объект $DB класса CDatabase.
Именно при помощи этого объекта и следует проводить все действия с базой данных.
global $DB; 

$strSql = "SELECT ID FROM b_stat_phrase_list WHERE  PHRASE='".$text."' and SESSION_ID='".$_SESSION["SESS_SESSION_ID"]."'"; //sql запрос
$strSql = $DB->ForSql($strSql); //Подготавливает строку (заменяет кавычки и прочее) для вставки в SQL запрос

$res = $DB->Query($strSql); //выполняет запрос SELECT,INSERT,DELETE,UPDATE
while ($row = $res->Fetch()){
   //..
}

$DB->StartTransaction(); //Открывает транзакцию

$arFields = array('имя поля'=>'значение');

$arFields["TIMESTAMP_X"] = $DB->GetNowFunction(); //текущее время


//обновить вариант 1
$strWhere = "WHERE ID='".$ID."'";
$DB->Update("b_form", $arFields, $strWhere,); 

//обновить вариант 2
$strUpdate = $DB->PrepareUpdate("b_form_result_answer", $arFields);    
$strSql = "UPDATE b_form_result_answer SET ".$strUpdate." WHERE RESULT_ID=".$RESULT_ID." and FIELD_ID=".$FIELD_ID;
$DB->Query($strSql, false, $err_mess.__LINE__);

//добавить вариант 1
$ID = $DB->Insert("b_form", $arFields); 

//добавить вариант 2
$arInsert = $DB->PrepareInsert("b_form_result_answer", $arFields);    
$strSql = "INSERT INTO b_form_result_answer (".$arInsert[0].") VALUES (".$arInsert[1].")";
$DB->Query($strSql, false, $err_mess.__LINE__);


if (strlen($strError)<=0){
   $DB->Commit(); //сохранить последние изменения в базе и закрыть транзакцию
}
else{
   $DB->Rollback(); //откатить изменения  и закрыть транзакцию

}

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

Выбрать товары, для которых цен установлено более 12
SELECT PRODUCT_ID, count(PRODUCT_ID) as cnt 
from b_catalog_price 
group by PRODUCT_ID
having cnt>12

выбрать товары, для которых разделы не проставлены в таблице разделов b_iblock_section_element
SELECT ID
 FROM b_iblock_element
 WHERE ID NOT IN (SELECT IBLOCK_ELEMENT_ID FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID=ID);
выбрать различные значения поля town из таблицы geocode
select DISTINCT town from geocode;

создать таблицу
create table if not exists a_tickets_buffer(
  `ID` int NOT NULL AUTO_INCREMENT,
  `TICKET_ID` int NOT NULL,
  `TITLE` varchar(8) NOT NULL DEFAULT '',
  `RESPONSIBLE_ID` int NOT NULL DEFAULT 15,  
  `CLIENT` varchar(50) NOT NULL DEFAULT '',
  `DATE_CLOSE` DATETIME,
  `TEXT` text,
  `STATUS_NAME` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`)
);
пример работы с БД:
Агент, который еще раз запускает неудачные почтовые события

почистить ВСЕ корзины, БЕЗ заказа
Delete from b_sale_basket where ORDER_ID is null or ORDER_ID='';
свойства товаров потом почистить
DELETE
            FROM b_sale_basket_props
            WHERE b_sale_basket_props.BASKET_ID NOT IN (
                SELECT b_sale_basket.ID FROM b_sale_basket
            );
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!