- таблицы БД Битрикса можно посмотреть тут /bitrix/admin/perfmon_tables.php?lang=ru
- выполнить любой SQL запрос тут /bitrix/admin/sql.php?lang=ru&del_query=Y
|
Работа с БД Битрикс API d7api 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;
}
|
заготовка для выборки
$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);
}
} |
Примеры работы с SQLite3foreach ($_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;
}
}
} |