Добрый день, в элементе инфоблока я использую сложное свойство, которое хранит значение сериализованной строкой, например
[CODE]a:6:{s:9:"sportsman";s:2:"22";s:4:"team";s:2:"43";s:5:"try_1";s:6:"765756";s:5:"try_2";s:6:"678678";s:9:"semifinal";s:8:"34534543";s:5:"final";s:8:"65756756";}
[/CODE]Когда я хочу получить все результаты определенного спортсмена я передаю в CIBlockElement::GetList фильтр
[CODE]array('IBLOCK_ID' =>9,'?PROPERTY_RESULTS'=>$sportsman_db_value)[/CODE]где
[CODE]$sportsman_db_value='s:9:"sportsman";s:'.strlen($arResult['ID']).':"'.$arResult['ID'].'"';[/CODE]тоесть строка в сериализованном формате, полностью идентичная части строки в базе, проблема в том что в ней содержатся кавычки и getlist разбивает её по ним, в итоге запрос вместо
[CODE](upper(FPV0.VALUE) like upper('%s:9:"sportsman";s:2:"46"%') and FPV0.VALUE is not null)[/CODE]составляется как
[CODE](upper(FPV0.VALUE) like upper('%s:9:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%sportsman%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%;s:2:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%46%') and FPV0.VALUE is not null))[/CODE]которое находит лишние значения. Я проследил исполнение метода до метода который проводит разбиение, CAllFilterQuery::CutKav и вот собственно код который проводит разбиение:
[CODE]while (preg_match("/\"([^\"]*)\"/",$query,$pt))
{
$res = $pt[1];
if(strlen(trim($pt[1]))>0)
{
$trimpt = $bdcnt."cut5";
$this->m_kav[$trimpt] = $res;
$query = str_replace("\"".$pt[1]."\"", " ".$trimpt." ", $query);
}
else
{
$query = str_replace("\"".$pt[1]."\"", " ", $query);
}
$bdcnt++;
if($bdcnt>100) break;
}[/CODE]я не вижу никакого способа его обойти без редактирования системных файлов, может кто-то сталкивался с подобным и знает обходной путь? Все что я придумал пока что, только послать запрос в базу непосредственно к `b_iblock_element_property` с правильным where, выбрать id элементов, и уже их передать GetList-у.
[CODE]a:6:{s:9:"sportsman";s:2:"22";s:4:"team";s:2:"43";s:5:"try_1";s:6:"765756";s:5:"try_2";s:6:"678678";s:9:"semifinal";s:8:"34534543";s:5:"final";s:8:"65756756";}
[/CODE]Когда я хочу получить все результаты определенного спортсмена я передаю в CIBlockElement::GetList фильтр
[CODE]array('IBLOCK_ID' =>9,'?PROPERTY_RESULTS'=>$sportsman_db_value)[/CODE]где
[CODE]$sportsman_db_value='s:9:"sportsman";s:'.strlen($arResult['ID']).':"'.$arResult['ID'].'"';[/CODE]тоесть строка в сериализованном формате, полностью идентичная части строки в базе, проблема в том что в ней содержатся кавычки и getlist разбивает её по ним, в итоге запрос вместо
[CODE](upper(FPV0.VALUE) like upper('%s:9:"sportsman";s:2:"46"%') and FPV0.VALUE is not null)[/CODE]составляется как
[CODE](upper(FPV0.VALUE) like upper('%s:9:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%sportsman%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%;s:2:%') and FPV0.VALUE is not null)
AND
(upper(FPV0.VALUE) like upper('%46%') and FPV0.VALUE is not null))[/CODE]которое находит лишние значения. Я проследил исполнение метода до метода который проводит разбиение, CAllFilterQuery::CutKav и вот собственно код который проводит разбиение:
[CODE]while (preg_match("/\"([^\"]*)\"/",$query,$pt))
{
$res = $pt[1];
if(strlen(trim($pt[1]))>0)
{
$trimpt = $bdcnt."cut5";
$this->m_kav[$trimpt] = $res;
$query = str_replace("\"".$pt[1]."\"", " ".$trimpt." ", $query);
}
else
{
$query = str_replace("\"".$pt[1]."\"", " ", $query);
}
$bdcnt++;
if($bdcnt>100) break;
}[/CODE]я не вижу никакого способа его обойти без редактирования системных файлов, может кто-то сталкивался с подобным и знает обходной путь? Все что я придумал пока что, только послать запрос в базу непосредственно к `b_iblock_element_property` с правильным where, выбрать id элементов, и уже их передать GetList-у.