Битриксоид из Колхоза
745 subscribers
298 photos
9 videos
5 files
98 links
Изучаем #Битрикс, находим ошибки, обслуживаем проекты, пишем модули, разрабатываем компоненты.

Ютуб: shorturl.at/himBM
Модуль-ускоритель: shorturl.at/lsyTW
Модуль комментариев: shorturl.at/ACDT2
Сайт разработчика: https://burlaka.studio
Download Telegram
=====
«Новый» фильтр и его where

$filter = \Bitrix\Main\Entity\Query::filter();

$filter->where();
$filter->whereNot();
$filter->whereColumn();
$filter->whereNull();
$filter->whereNotNull();
$filter->whereIn();
$filter->whereNotIn();
$filter->whereBetween();
$filter->whereNotBetween();
$filter->whereLike();
$filter->whereNotLike();
$filter->whereExists();
$filter->whereNotExists();
$filter->whereMatch();
$filter->whereNotMatch();
$filter->where();
$filter->whereNot();
$filter->whereColumn();
$filter->whereNull();
$filter->whereNotNull();
$filter->whereIn();
$filter->whereNotIn();
$filter->whereBetween();
$filter->whereNotBetween();
$filter->whereLike();
$filter->whereNotLike();
$filter->whereExists();
$filter->whereNotExists();


#битрикс #orm #D7 #запрос
=====
Пример использования нового фильтра, код из ядра

$filter = Main\Entity\Query::filter();
$filter->whereIn('PRODUCT_ID', $pageOfferIds);

$filter->where(
Main\Entity\Query::filter()
->logic('or')
->where('QUANTITY_FROM', '<=', 1)
->whereNull('QUANTITY_FROM')
);

$filter->where(
Main\Entity\Query::filter()
->logic('or')
->where('QUANTITY_TO', '>=', 1)
->whereNull('QUANTITY_TO'));

$iterator = Catalog\PriceTable::getList(array(
'select' => array(
'PRODUCT_ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY',
'PRICE_SCALE', 'TMP_ID'
),
'filter' => $filter,
'order' => array('PRODUCT_ID' => 'ASC', 'CATALOG_GROUP_ID' => 'ASC')
));
while ($row = $iterator->fetch())
{
...
}

#битрикс #orm #D7 #запрос
=====
Операторы в $filter->where

$filter = Main\Entity\Query::filter();

$filter->whereColumn('PARENT.LEFT_MARGIN', '<', 'SECTION.LEFT_MARGIN')
$filter->where('SHIPPING_CENTER', '=', 'Y');
$filter->where('PRICE', 'between', array(100, 7770));

#битрикс #orm #D7 #запрос
Обезопасивание данных

$request= \Bitrix\Main\Context::getCurrent()->getRequest();
$request->get('sql_data');
$request->getPost('php_code');

Когда мы работаем с объектом запроса, получая _GET- и _POST-ключи, мы фактически работаем с сырыми данными, что не безопасно.

$request позволяет пропустить данные через фильтр.
Метод: addFilter, аргумент — объект, реализующий интерфейс Bitrix\Main\Type\IRequestFilter.

Фильтру скармливаются ключи: get, post, files, headers, cookie.

Фильтровать можно сколько угодно раз. Единственный пример, встречающийся в коде ядра — класс \Bitrix\Main\Web\PostDecodeFilter, который отслеживает только _POST-ключи и приводит их в кодировку проекта.

#битрикс #запрос #безопасность
Битриксоид из Колхоза
Обезопасивание данных $request= \Bitrix\Main\Context::getCurrent()->getRequest(); $request->get('sql_data'); $request->getPost('php_code'); Когда мы работаем с объектом запроса, получая _GET- и _POST-ключи, мы фактически работаем с сырыми данными, что не…
Исходя из проблематики, мы можем реализовать свой класс, который будет конвертировать нужные ключи в безопасный вид.

Наши действия:

1. Создаём класс с фильтром
Пример: https://pastebin.com/XT3ULHtC

2. Регистрируем его в автоподгрузку в init.php:
use \Bitrix\Main\Loader;

Loader::registerAutoLoadClasses(null,
[
'\AlexeyGfi\SafeValueHelper' =>
'/bitrix/php_interface/include/AlexeyGfi/SafeValueHelper.php',
]
);

3. Применяем перед чтением ключей из запроса:
use Bitrix\Main\Context;

$request= Context::getCurrent()->getRequest();

$request->addFilter(new \AlexeyGfi\SafeValueHelper);
$request->getPost('php_code');

#битрикс #запрос #безопасность
Через объект запроса
$qRes = (new \Bitrix\Main\ORM\Query\Query($entity))
... ->exec();
...получить код выполненного sql-запроса:
$sql = $qRes->getTrackerQuery()->getSql();

#битрикс #запрос #sql