Господа, прошу помощи, не могу понять почему приведенный ниже скрипт срабатывает не так, как ожидается.
Что он делает - принимает на вход через $_REQUEST два параметра, "ID" - айдишник элемента и "action" - равен либо 1 либо 2.
Забирает из базы элемент с полученным айди, и проверяет, если у него свойство UF_RATING_TYPE не равно полученному в параметре action - меняет значение этого свойства на полученное. Если свойство равно параметру - выводит сообщение на экран.
Но все это дело начинает работать немного странно. Например если запустить скрипт с параметром action=1 и потом сразу action=2, при UF_RATING_TYPE изначально равному 1, он оба раза выведет на экран сообщение already voted, но при втором вызове с action=2 успешно поменяет значение UF_RATING_TYPE на 2. Собственно чего я не могу понять - как при втором вызове одновременно может выполнится и код выводящий сообщение и $hl_review_ratings_entity_data_class::update, не смотря на то, что они находятся во взаимо исключающих местах конструкции if-else.
Код |
---|
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;
$hl_review_ratings = HL\HighloadBlockTable::getById($arParams["REVIEW_RATINGS_HL_ID"])->fetch();
$hl_review_ratings_entity = HL\HighloadBlockTable::compileEntity($hl_review_ratings);
$hl_review_ratings_entity_data_class = $hl_review_ratings_entity->getDataClass();
$hl_review_ratings_query_requests = new Entity\Query($hl_review_ratings_entity_data_class);
$hl_review_ratings_query_requests->setSelect(Array(
"UF_RATING_TYPE",
"ID"
));
$hl_review_ratings_query_requests->setFilter(Array(
"UF_COMMENT" => $_REQUEST["id"],
"UF_USERID" => $USER->GetId()
));
$hl_review_ratings_result = $hl_review_ratings_query_requests->exec();
$hl_review_ratings_result = new CDBResult($hl_review_ratings_result);
$row = $hl_review_ratings_result->GetNext();
if($row["UF_RATING_TYPE"] != $_REQUEST["action"]){
$hl_review_ratings_entity_data_class::update($row["ID"], Array(
"UF_RATING_TYPE" => $_REQUEST["action"]
));
}
else{
echo "already voted " . $_REQUEST["action"];
} |