- Модуль: support
- Путь к файлу: ~/bitrix/modules/support/classes/general/search.php
- Класс: CSupportSearch
- Вызов: CSupportSearch::PrepareQuery
function PrepareQuery($q, $idName, $titleName, $messageName, &$error)
{
global $DB;
$state = 0;
$sRes = "";
$n = 0;
$error = "";
$errorno = 0;
$i = 0;
$quote = "";
$inQuoteS = "";
$arrQ = explode(" ", $q);
foreach($arrQ as $k => $t)
{
$t = trim($t);
if(strlen($t) <= 0)
{
continue;
}
switch ($state)
{
case 0:
if(($t == "||") || ($t == "&&") || ($t == ")"))
{
$error = GetMessage("FILTER_ERROR2") . " " . $t;
$errorno = 2;
break 2;
}
elseif($t == "!")
{
$state = 0;
$sRes .= " NOT";
}
elseif($t == "(")
{
$n++;
$state = 0;
$sRes .= " (";
}
elseif(($t == '"') || ($t == "'"))
{
$quote = $t;
$state = 2;
}
else
{
$state = 1;
$sRes .= self::GetSQLfilter($t, $idName, $titleName, $messageName);
}
break;
case 1:
if(($t == "||") || ($t == "&&"))
{
$state = 0;
if($t == "||") $sRes .= " OR";
else $sRes .= " AND";
}
elseif($t == ")")
{
$n--;
$state = 1;
$sRes .= ")";
}
else
{
$error = GetMessage("FILTER_ERROR2") . " " . $t;
$errorno = 2;
break 2;
}
break;
case 2:
if($t == $quote)
{
$state = 1;
$inQuoteS = "%" . str_replace("^", " ", $inQuoteS) . "%";
$sRes .= "n ($titleName LIKE '" . $DB->ForSql($inQuoteS) . "' OR $messageName LIKE '" . $DB->ForSql($inQuoteS) . "')";
$inQuoteS = "";
$quote = "";
}
elseif(($t != "'") && ($t != '"'))
{
$inQuoteS .= $t;
}
break;
}
}
if(($errorno == 0) && ($n != 0))
{
$error = GetMessage("FILTER_ERROR1");
$errorno = 1;
}
if(($errorno == 0) && ($quote != ""))
{
$error = GetMessage("FILTER_ERROR4");
$errorno = 3;
}
if($errorno > 0)
{
return null;
}
return $sRes;
}