Важно! Надо СРОЧНО поменять пароли, которые предоставляли техподдержке АСПРО!

Работа 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();
выборка
\Bitrix\Main\DB\Connection::query - документация Битрикса
//Строка запроса. Выбираем все логины, активных пользователей
$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;
}


 
заготовка для выборки
$connection = \Bitrix\Main\Application::getConnection(); 
$sql = 'SELECT VALUE_ID FROM b_uts_user WHERE UF_OLD_DEALER_ID IS NULL OR UF_OLD_DEALER_ID = "" order by VALUE_ID limit 10';
$recordset = $connection->query($sql);
while ($record = $recordset->fetch()){

}
количество записей
$recordset->getSelectedRowsCount();
вернет 1й элемент, удовлетворяющий условию
$arResult = $connection->queryScalar($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
            );
выбрать зарегистрированных юзеров, но которые не активировали аккаунт
select DATE(DATE_REGISTER) AS day, COUNT(*) AS event_count from b_user where DATE_REGISTER>'2024-06-03' and ACTIVE='N' and (LAST_LOGIN is null)  GROUP BY DATE(DATE_REGISTER);
свойство обновить UF_OLD_DEALER_ID из UF_DEALER_ID для всех юзеров
$connection = \Bitrix\Main\Application::getConnection(); 
$sql = 'SELECT VALUE_ID, UF_DEALER_ID FROM b_uts_user WHERE UF_DEALER_ID like "a:1:{%" AND (UF_OLD_DEALER_ID IS NULL OR UF_OLD_DEALER_ID = "") order by VALUE_ID limit 10000';
$recordset = $connection->query($sql);

while ($record = $recordset->fetch()){   
   $id = $record["VALUE_ID"];
   $arDealerIds = unserialize($record["UF_DEALER_ID"]);
   $dealerId = is_array($arDealerIds)&& !empty($arDealerIds[0]) ? $arDealerIds[0] : false;

   if(!empty($dealerId)){
      $sql = 'UPDATE b_uts_user SET UF_OLD_DEALER_ID = '.$dealerId.' WHERE VALUE_ID = '.$id;
      
      $connection->query($sql);
   }
   
}


Примеры работы с SQLite3
foreach ($_GET as $key => $value){    
   $query_text .= $key.'='.$value.'&';
}

$logFileName = "/var/log/user/com_".date("Y.m").".db";
$createDBQuery = "create table if not exists 'query' ('query_date' TEXT, 'query_text' TEXT)";
if ($db = new SQLite3($logFileName)) {
    $date =  date('Y-m-d H:i:s');
    $db->exec('BEGIN;');
    $db->exec($createDBQuery);
    $qstring = "insert into query (query_date,query_text) values ('";
    $qstring .= $date;
    $qstring .= "','";
    $qstring .= $query_text;
    $qstring .="')";
    $db->exec($qstring);
    $db->exec('COMMIT;');
    $db->close();
} else {
    die('Error: '.$sqliteError);
}
$logFileName = "/var/log/user/com_".date("Y.m").".db";
$arSerials = [];
if ($db = new SQLite3($logFileName)) {
   $results = $db->query('SELECT count(DISTINCT query_text)  FROM query where query_text like "%LicID=NC50%"');
   echo "<pre>";
   while ($row = $results->fetchArray()) {
      print_r($row);
   }
   echo "</pre>";
}
$logFileName = "/var/log/user/com_2024.09.db";
$arSerials = [];
if ($db = new SQLite3($logFileName)) {
   $i = 0;   
   foreach($arSerials as $sn){
      $temp = explode("-",$sn);   
      $sn1 = $temp[0].$temp[2];
      $q = 'SELECT query_date FROM query where query_text like "%LicID='.$sn1.'%" order by query_date desc limit 1';
      echo $sn." - ";
      $results = $db->query($q);
                if($row = $results->fetchArray()) {
         echo $row["query_date"];         
         }      
      echo "<br>";
      $i++;
      if($i==40){//иначе подвисает
         break;
      }
 
   }

}