• Модуль: 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;
}