%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/main/classes/general/sql_util.php |
<?php
/*
* SQL Helper
*/
class CSqlUtil
{
public static function GetCount($tableName, $tableAlias, &$arFields, &$arFilter)
{
$tableName = strval($tableName);
if($tableName === '')
{
return false;
}
global $DB;
$isOracle = strtoupper($DB->type) === 'ORACLE';
$sql = $isOracle
? "SELECT COUNT(1) AS QTY FROM {$tableName}"
: "SELECT COUNT(*) AS QTY FROM {$tableName}";
if(is_array($arFilter) && !empty($arFilter))
{
if(!is_array($arFields))
{
return false;
}
$arJoins = array();
$condition = self::PrepareWhere($arFields, $arFilter, $arJoins);
if($condition !== '')
{
$tableAlias = strval($tableAlias);
if($tableAlias !== '')
{
//ORA-00933 overwise
$sql .= $isOracle ? " {$tableAlias}" : " AS {$tableAlias}";
}
$sql .= " WHERE {$condition}";
}
}
$dbResult = $DB->Query($sql, false, 'File: '.__FILE__.'<br/>Line: '.__LINE__);
$arResult = $dbResult ? $dbResult->Fetch() : null;
return $arResult !== null && isset($arResult['QTY']) ? intval($arResult['QTY']) : 0;
}
public static function GetFilterOperation($key)
{
$strNegative = "N";
if (substr($key, 0, 1)=="!")
{
$key = substr($key, 1);
$strNegative = "Y";
}
$strOrNull = "N";
if (substr($key, 0, 1)=="+")
{
$key = substr($key, 1);
$strOrNull = "Y";
}
if (substr($key, 0, 2)==">=")
{
$key = substr($key, 2);
$strOperation = ">=";
}
elseif (substr($key, 0, 1)==">")
{
$key = substr($key, 1);
$strOperation = ">";
}
elseif (substr($key, 0, 2)=="<=")
{
$key = substr($key, 2);
$strOperation = "<=";
}
elseif (substr($key, 0, 1)=="<")
{
$key = substr($key, 1);
$strOperation = "<";
}
elseif (substr($key, 0, 1)=="@")
{
$key = substr($key, 1);
$strOperation = "IN";
}
elseif (substr($key, 0, 2)=="=%")
{
$key = substr($key, 2);
$strOperation = "RLIKE";
}
elseif (substr($key, 0, 2)=="%=")
{
$key = substr($key, 2);
$strOperation = "LLIKE";
}
elseif (substr($key, 0, 1)=="%")
{
$key = substr($key, 1);
$strOperation = "LIKE";
}
elseif (substr($key, 0, 1)=="?")
{
$key = substr($key, 1);
$strOperation = "QUERY";
}
elseif (substr($key, 0, 2)=="*=")
{
$key = substr($key, 2);
$strOperation = "FTI";
}
elseif (substr($key, 0, 2)=="*%")
{
$key = substr($key, 2);
$strOperation = "FTL";
}
elseif (substr($key, 0, 1)=="*")
{
$key = substr($key, 1);
$strOperation = "FT";
}
elseif (substr($key, 0, 1)=="=")
{
$key = substr($key, 1);
$strOperation = "=";
}
else
{
$strOperation = "=";
}
return array("FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull);
}
private static function AddToSelect(&$fieldKey, &$arField, &$arOrder, &$strSqlSelect)
{
global $DB;
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
// ORACLE AND MSSQL require datetime/date field in select list if it present in order list
if ($arField["TYPE"] == "datetime")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($fieldKey, $arOrder)))
$strSqlSelect .= $arField["FIELD"]." as ".$fieldKey."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arField["FIELD"], "FULL")." as ".$fieldKey;
}
elseif ($arField["TYPE"] == "date")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($fieldKey, $arOrder)))
$strSqlSelect .= $arField["FIELD"]." as ".$fieldKey."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arField["FIELD"], "SHORT")." as ".$fieldKey;
}
else
$strSqlSelect .= $arField["FIELD"]." as ".$fieldKey;
}
private static function AddToFrom(&$arField, &$arJoined, &$strSqlFrom)
{
if (isset($arField["FROM"])
&& strlen($arField["FROM"]) > 0
&& !in_array($arField["FROM"], $arJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arField["FROM"];
$arJoined[] = $arField["FROM"];
}
}
private static function PrepareDefaultFields(&$arFields, &$arOrder, &$arJoined, &$strSqlSelect, &$strSqlFrom)
{
$arFieldsKeys = array_keys($arFields);
$qty = count($arFieldsKeys);
for ($i = 0; $i < $qty; $i++)
{
if (isset($arFields[$arFieldsKeys[$i]]["WHERE_ONLY"])
&& $arFields[$arFieldsKeys[$i]]["WHERE_ONLY"] == "Y")
{
continue;
}
if (isset($arFields[$arFieldsKeys[$i]]["DEFAULT"])
&& $arFields[$arFieldsKeys[$i]]["DEFAULT"] == "N")
{
continue;
}
self::AddToSelect($arFieldsKeys[$i], $arFields[$arFieldsKeys[$i]], $arOrder, $strSqlSelect);
self::AddToFrom($arFields[$arFieldsKeys[$i]], $arJoined, $strSqlFrom);
}
}
public static function PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $arOptions = array())
{
global $DB;
if(!is_array($arOptions))
{
$arOptions = array();
}
$strSqlSelect = '';
$strSqlFrom = '';
$strSqlFromWhere = '';
$strSqlGroupBy = '';
$arGroupByFunct = array("COUNT", "AVG", "MIN", "MAX", "SUM");
$arAlreadyJoined = array();
// GROUP BY -->
if (is_array($arGroupBy) && count($arGroupBy)>0)
{
$arSelectFields = $arGroupBy;
foreach ($arGroupBy as $key => $val)
{
$val = strtoupper($val);
$key = strtoupper($key);
if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct))
{
if (strlen($strSqlGroupBy) > 0)
$strSqlGroupBy .= ", ";
$strSqlGroupBy .= $arFields[$val]["FIELD"];
if (isset($arFields[$val]["FROM"])
&& strlen($arFields[$val]["FROM"]) > 0
&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$val]["FROM"];
$arAlreadyJoined[] = $arFields[$val]["FROM"];
}
}
}
}
// <-- GROUP BY
// SELECT -->
$arFieldsKeys = array_keys($arFields);
if (is_array($arGroupBy) && count($arGroupBy)==0)
{
$strSqlSelect = "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT ";
}
else
{
if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && strlen($arSelectFields)>0 && array_key_exists($arSelectFields, $arFields))
$arSelectFields = array($arSelectFields);
if (!isset($arSelectFields)
|| !is_array($arSelectFields)
|| count($arSelectFields) <= 0)
{
self::PrepareDefaultFields($arFields, $arOrder, $arAlreadyJoined, $strSqlSelect, $strSqlFrom);
}
else
{
foreach ($arSelectFields as $key => $val)
{
if($val === '*')
{
self::PrepareDefaultFields($arFields, $arOrder, $arAlreadyJoined, $strSqlSelect, $strSqlFrom);
}
$val = strtoupper($val);
$key = strtoupper($key);
if (!array_key_exists($val, $arFields))
{
continue;
}
if (in_array($key, $arGroupByFunct))
{
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
$strSqlSelect .= $key."(".$arFields[$val]["FIELD"].") as ".$val;
}
else
{
self::AddToSelect($val, $arFields[$val], $arOrder, $strSqlSelect);
}
self::AddToFrom($arFields[$val], $arAlreadyJoined, $strSqlFrom);
}
}
if($strSqlGroupBy === '')
{
$strSqlSelect = "%%_DISTINCT_%% ".$strSqlSelect;
}
elseif(!isset($arOptions['ENABLE_GROUPING_COUNT']) || $arOptions['ENABLE_GROUPING_COUNT'] === true)
{
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
$strSqlSelect .= "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT";
}
}
// <-- SELECT
// WHERE -->
$arJoins = array();
$strSqlWhere = self::PrepareWhere($arFields, $arFilter, $arJoins);
foreach($arJoins as $join)
{
if($join === '')
{
continue;
}
if ($strSqlFromWhere !== '')
{
$strSqlFromWhere .= ' ';
}
$strSqlFromWhere .= $join;
if(!in_array($join, $arAlreadyJoined))
{
if ($strSqlFrom !== '')
{
$strSqlFrom .= ' ';
}
$strSqlFrom .= $join;
$arAlreadyJoined[] = $join;
}
}
// <-- WHERE
// ORDER BY -->
$arSqlOrder = array();
$dbType = strtoupper($DB->type);
$nullsLast = isset($arOptions['NULLS_LAST']) ? (bool)$arOptions['NULLS_LAST'] : false;
foreach ($arOrder as $by => $order)
{
$by = strtoupper($by);
$order = strtoupper($order);
if ($order != "ASC")
$order = "DESC";
if (array_key_exists($by, $arFields))
{
if(!$nullsLast)
{
if($dbType !== "ORACLE")
{
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order;
}
else
{
if($order === 'ASC')
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order." NULLS FIRST";
else
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order." NULLS LAST";
}
}
else
{
if($dbType === "MYSQL")
{
//Use MySql feature for sort in 'NULLS_LAST' mode
if($order === 'ASC')
$arSqlOrder[] = "-".$arFields[$by]["FIELD"]." DESC";
else
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order;
}
elseif($dbType === "MSSQL")
{
if($order === 'ASC')
$arSqlOrder[] = '(CASE WHEN '.$arFields[$by]["FIELD"].' IS NULL THEN 1 ELSE 0 END) '.$order.', '.$arFields[$by]["FIELD"]." ".$order;
else
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order;
}
elseif($dbType === "ORACLE")
{
if($order === 'DESC')
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order." NULLS LAST";
else
$arSqlOrder[] = $arFields[$by]["FIELD"]." ".$order;
}
}
if (isset($arFields[$by]["FROM"])
&& strlen($arFields[$by]["FROM"]) > 0
&& !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$by]["FROM"];
$arAlreadyJoined[] = $arFields[$by]["FROM"];
}
}
}
$strSqlOrderBy = '';
DelDuplicateSort($arSqlOrder);
$sqlOrderQty = count($arSqlOrder);
for ($i = 0; $i < $sqlOrderQty; $i++)
{
if (strlen($strSqlOrderBy) > 0)
$strSqlOrderBy .= ", ";
$strSqlOrderBy .= $arSqlOrder[$i];
}
// <-- ORDER BY
return array(
"SELECT" => $strSqlSelect,
"FROM" => $strSqlFrom,
"WHERE" => $strSqlWhere,
"FROM_WHERE" => $strSqlFromWhere,
"GROUPBY" => $strSqlGroupBy,
"ORDERBY" => $strSqlOrderBy
);
}
public static function PrepareWhere(&$arFields, &$arFilter, &$arJoins)
{
global $DB;
$arSqlSearch = Array();
if (!is_array($arFilter))
$filter_keys = Array();
else
$filter_keys = array_keys($arFilter);
$keyQty = count($filter_keys);
for ($i = 0; $i < $keyQty; $i++)
{
$vals = $arFilter[$filter_keys[$i]];
if (!is_array($vals))
$vals = array($vals);
$filterKey = $filter_keys[$i];
if(strpos($filterKey, '__INNER_FILTER') === 0)
{
$innerFilterSql = self::PrepareWhere($arFields, $vals, $arJoins);
if(is_string($innerFilterSql) && $innerFilterSql !== '')
{
$arSqlSearch[] = '('.$innerFilterSql.')';
}
continue;
}
$key_res = self::GetFilterOperation($filterKey);
$key = $key_res["FIELD"];
$strNegative = $key_res["NEGATIVE"];
$strOperation = $key_res["OPERATION"];
$strOrNull = $key_res["OR_NULL"];
if (array_key_exists($key, $arFields))
{
$arSqlSearch_tmp = array();
if (count($vals) > 0)
{
if ($strOperation == "IN")
{
if (isset($arFields[$key]["WHERE"]))
{
$arSqlSearch_tmp1 = call_user_func_array(
$arFields[$key]["WHERE"],
array($vals, $key, $strOperation, $strNegative, $arFields[$key]["FIELD"], &$arFields, &$arFilter)
);
if ($arSqlSearch_tmp1 !== false)
$arSqlSearch_tmp[] = $arSqlSearch_tmp1;
}
else
{
if ($arFields[$key]["TYPE"] == "int")
{
array_walk($vals, create_function("&\$item", "\$item=IntVal(\$item);"));
$vals = array_unique($vals);
$val = implode(",", $vals);
if (count($vals) <= 0)
$arSqlSearch_tmp[] = "(1 = 2)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " NOT " : "")."(".$arFields[$key]["FIELD"]." IN (".$val."))";
}
elseif ($arFields[$key]["TYPE"] == "double")
{
array_walk($vals, create_function("&\$item", "\$item=DoubleVal(\$item);"));
$vals = array_unique($vals);
$val = implode(",", $vals);
if (count($vals) <= 0)
$arSqlSearch_tmp[] = "(1 = 2)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." (".$val."))";
}
elseif ($arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
{
array_walk($vals, create_function("&\$item", "\$item=\"'\".\$GLOBALS[\"DB\"]->ForSql(\$item).\"'\";"));
$vals = array_unique($vals);
$val = implode(",", $vals);
if (count($vals) <= 0)
$arSqlSearch_tmp[] = "(1 = 2)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." (".$val."))";
}
elseif ($arFields[$key]["TYPE"] == "datetime")
{
array_walk($vals, create_function("&\$item", "\$item=\"'\".\$GLOBALS[\"DB\"]->CharToDateFunction(\$GLOBALS[\"DB\"]->ForSql(\$item), \"FULL\").\"'\";"));
$vals = array_unique($vals);
$val = implode(",", $vals);
if (count($vals) <= 0)
$arSqlSearch_tmp[] = "1 = 2";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." (".$val."))";
}
elseif ($arFields[$key]["TYPE"] == "date")
{
array_walk($vals, create_function("&\$item", "\$item=\"'\".\$GLOBALS[\"DB\"]->CharToDateFunction(\$GLOBALS[\"DB\"]->ForSql(\$item), \"SHORT\").\"'\";"));
$vals = array_unique($vals);
$val = implode(",", $vals);
if (count($vals) <= 0)
$arSqlSearch_tmp[] = "1 = 2";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." (".$val."))";
}
}
}
else
{
foreach ($vals as $val)
{
if (isset($arFields[$key]["WHERE"]))
{
$arSqlSearch_tmp1 = call_user_func_array(
$arFields[$key]["WHERE"],
array($val, $key, $strOperation, $strNegative, $arFields[$key]["FIELD"], &$arFields, &$arFilter)
);
if ($arSqlSearch_tmp1 !== false)
$arSqlSearch_tmp[] = $arSqlSearch_tmp1;
}
else
{
$fieldType = $arFields[$key]["TYPE"];
$fieldName = $arFields[$key]["FIELD"];
if ($strOperation === "QUERY" && $fieldType !== "string" && $fieldType !== "char")
{
// Ignore QUERY operation for not character types - QUERY is supported only for character types.
$strOperation = '=';
}
if (($strOperation === "LIKE" || $strOperation === "RLIKE" || $strOperation === "LLIKE")
&& ($fieldType === "int" || $fieldType === "double"))
{
// Ignore LIKE operation for numeric types.
$strOperation = '=';
}
if ($fieldType === "int")
{
if ((intval($val) === 0) && (strpos($strOperation, "=") !== false))
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND" : "OR")." ".(($strNegative == "Y") ? "NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
else
{
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".intval($val)." )";
}
}
elseif ($fieldType === "double")
{
$val = str_replace(",", ".", $val);
if ((doubleval($val) === 0) && (strpos($strOperation, "=") !== false))
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND" : "OR")." ".(($strNegative == "Y") ? "NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".DoubleVal($val)." )";
}
elseif ($fieldType === "string" || $fieldType === "char")
{
if ($strOperation === "QUERY")
{
$arSqlSearch_tmp[] = GetFilterQuery($fieldName, $val, "Y");
}
else
{
if ((strlen($val) === 0) && (strpos($strOperation, "=") !== false))
$arSqlSearch_tmp[] = "(".$fieldName." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND NOT" : "OR")." (".$DB->Length($fieldName)." <= 0) ".(($strNegative == "Y") ? "AND NOT" : "OR")." (".$fieldName." ".$strOperation." '".$DB->ForSql($val)."' )";
else
{
if($strOperation === "LIKE")
{
if(is_array($val))
$arSqlSearch_tmp[] = "(".$fieldName." LIKE '%".implode("%' ESCAPE '!' OR ".$fieldName." LIKE '%", self::ForLike($val))."%' ESCAPE '!')";
elseif(strlen($val)<=0)
$arSqlSearch_tmp[] = $fieldName;
else
$arSqlSearch_tmp[] = $fieldName." LIKE '%".self::ForLike($val)."%' ESCAPE '!'";
}
elseif($strOperation === "RLIKE" || $strOperation === "LLIKE")
{
if(is_array($val))
$arSqlSearch_tmp[] = "(".$fieldName." LIKE '".implode("' OR ". $fieldName." LIKE '", $DB->ForSql($val))."')";
elseif(strlen($val)<=0)
$arSqlSearch_tmp[] = $fieldName;
else
$arSqlSearch_tmp[] = $fieldName." LIKE '".$DB->ForSql($val)."'";
}
elseif($strOperation === "FT" || $strOperation === "FTI" || $strOperation === "FTL")
{
$queryWhere = new CSQLWhere();
$queryWhere->SetFields(
array(
$key => array(
'FIELD_NAME' => $fieldName,
'FIELD_TYPE' => 'string',
'JOIN' => false
)
)
);
$query = $queryWhere->GetQuery(array($filterKey => $val));
if($query !== '')
{
$arSqlSearch_tmp[] = $query;
}
}
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$fieldName." IS NULL OR NOT " : "")."(".$fieldName." ".$strOperation." '".$DB->ForSql($val)."' )";
}
}
}
elseif ($fieldType === "datetime")
{
if (strlen($val) <= 0)
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
elseif (strtoupper($val) === "NOW")
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->GetNowFunction().")";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
}
elseif ($fieldType === "date")
{
if (strlen($val) <= 0)
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
}
}
}
}
}
if (isset($arFields[$key]["FROM"])
&& strlen($arFields[$key]["FROM"]) > 0
&& !in_array($arFields[$key]["FROM"], $arJoins))
{
$arJoins[] = $arFields[$key]["FROM"];
}
$strSqlSearch_tmp = "";
$sqlSearchQty = count($arSqlSearch_tmp);
for ($j = 0; $j < $sqlSearchQty; $j++)
{
if ($j > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= self::AddBrackets($arSqlSearch_tmp[$j]);
}
if ($strOrNull == "Y")
{
if (strlen($strSqlSearch_tmp) > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." IS ".($strNegative=="Y" ? "NOT " : "")."NULL)";
if ($arFields[$key]["TYPE"] == "int" || $arFields[$key]["TYPE"] == "double")
{
if (strlen($strSqlSearch_tmp) > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" ? "<>" : "=")." 0)";
}
elseif ($arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
{
if (strlen($strSqlSearch_tmp) > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" ? "<>" : "=")." '')";
}
}
if ($strSqlSearch_tmp != "")
{
$arSqlSearch[] = $strSqlSearch_tmp;
}
}
}
$logic = 'AND';
if(isset($arFilter['LOGIC']) && $arFilter['LOGIC'] !== '')
{
$logic = strtoupper($arFilter['LOGIC']);
if($logic !== 'AND' && $logic !== 'OR')
{
$logic = 'AND';
}
}
$strSqlWhere = '';
$logic = " $logic ";
$sqlSearchQty = count($arSqlSearch);
for ($i = 0; $i < $sqlSearchQty; $i++)
{
$searchItem = $arSqlSearch[$i];
if($searchItem === '')
{
continue;
}
if ($strSqlWhere !== '')
$strSqlWhere .= $logic;
$strSqlWhere .= "($searchItem)";
}
return $strSqlWhere;
}
private static function AddBrackets($str)
{
return preg_match('/^\(.*\)$/s', $str) > 0 ? $str : "($str)";
}
public static function GetRowCount(&$arSql, $tableName, $tableAlias = '', $dbType = '')
{
global $DB;
$tableName = strval($tableName);
$tableAlias = strval($tableAlias);
/*$dbType = strval($dbType);
if($dbType === '')
{
$dbType = 'MYSQL';
}
else
{
$dbType = strtoupper($dbType);
}*/
$query = 'SELECT COUNT(\'x\') as CNT FROM '.$tableName;
if($tableAlias !== '')
{
$query .= ' '.$tableAlias;
}
if (isset($arSql['FROM'][0]))
{
$query .= ' '.$arSql['FROM'];
}
if (isset($arSql['WHERE'][0]))
{
$query .= ' WHERE '.$arSql['WHERE'];
}
if (isset($arSql['GROUPBY'][0]))
{
$query .= ' GROUP BY '.$arSql['GROUPBY'];
}
$rs = $DB->Query($query, false, 'File: '.__FILE__.'<br/>Line: '.__LINE__);
//MYSQL, MSSQL, ORACLE
$result = 0;
while($ary = $rs->Fetch())
{
$result += intval($ary['CNT']);
}
return $result;
}
public static function PrepareSelectTop(&$sql, $top, $dbType)
{
$dbType = strval($dbType);
if(!isset($dbType[0]))
{
$dbType = 'MYSQL';
}
$dbType = strtoupper($dbType);
if($dbType === 'MYSQL')
{
$sql .= ' LIMIT '.$top;
}
elseif($dbType === 'MSSQL')
{
if(substr($sql, 0, 7) === 'SELECT ')
{
$sql = 'SELECT TOP '.$top.substr($sql, 6);
}
}
elseif($dbType === 'ORACLE')
{
$sql = 'SELECT * FROM ('.$sql.') WHERE ROWNUM <= '.$top;
}
}
private static function ForLike($str)
{
global $DB;
static $search = array( "!", "_", "%");
static $replace = array("!!", "!_", "!%");
return str_replace($search, $replace, $DB->ForSQL($str));
}
}