Антикварная функция создания SQL-запроса

<?php
//получаем список ID объектов по url - на выходе плоский массив
function get_obj_list_id($url,$all=FALSE,$sort_by_attr=0) {
	global $main_url, $main_langs, $debugger, $main, $main_acts;
	$main['profiler']['get_obj_list_id']['count']++;
	$main['profiler']['get_obj_list_id']['time']-=microtime(true);
	//парсим (или нет) url
	if ( !is_array($url) )	$url=get_parsed_url($url);
	//а вдруг этот список идентичен тому, что уже получен?
	if ($url===$main_url && isset($main['objects']) ) {
		$ret = $main['objects'];		
	//а вдруг в кеше список этих объектов остался?
	} else {
		$all2=$all;
		$memkey=md5(serialize($url)).(int)$all.$sort_by_attr;
		$ret=get_var_from_cache($memkey,MEMCACHE_OBJ_LIST_TTL);	
		if ( !is_array($ret) ) {	
			if( !defined("DEBIL_MODE") ) { define('DEBIL_MODE',FALSE); }
			settype($sort_by_attr,"int");
			$objects=array();
			$pagelink='';
			$a_group='';
			$ret=array();
			if ( (string)$url['id']!='' ) {
				//<если в url есть имя(id) объекта - запихиваем в выходной массив и отваливаемся>
				$objects[(int)$url['id']]=(int)$url['id'];
			} else {
				//тип, баннеры исключаем  //&& $url['type']!='banner'
				if ( $url['type']!='' ) {
					$wt=" AND o.type='".$url['type']."' ";
				} else {
					$wt=" AND o.type NOT LIKE 'banner'";
				}
				//год
				if ( $url['year']!='' ) {
					$wy=" AND YEAR(o.created)=".$url['year']." ";
				//дата полностью
				} elseif ($url['date']!='') {
					$wy=" AND DATE(o.created)='".$url['date']."' ";
				} else {
					$wy='';
				}
				//ключи
				$countkeys=count($url['keys']);
				//урезаем количество ключей
				$wk=''; $m_t='';
				$i=0;
				foreach($url['keys'] as $id_key=>$key) {
					$i++;
					if ($i>MAX_KEYS_IN_URL) continue;
					$m_t.="\n LEFT JOIN `".T_MATRIX."` as m".$i." ON o.id=m".$i.".id_obj ";
					$wk.="\n AND ( m".$i.".id_key='".$id_key."'";
						if( DEBIL_MODE==FALSE ) {
							$in=array_flip(get_in_keys($id_key,4));
						} else {
							$in=array();
						}
						if ( count($in)>0 ) $wk.=" OR m".$i.".id_key='".implode("' OR m".$i.".id_key='",$in)."'";
						$wk.=")";
				}
				//поиск по атрибуту здесь не используется
				$wa='';
				//<берём только активные объекты если переменная $all на входе FALSE>
				//администратору раздела и админу показываем всё
				if(!isset($_SESSION['show_hidden_obj'])) $_SESSION['show_hidden_obj']=FALSE;
				if ( $all==TRUE || $_SESSION['show_hidden_obj']==TRUE ) {
					$w_active="o.active>=-1 ";
				} else {
					$w_active="o.active>0";
				}
				//для каталога ищем по наименованию (пока это только на child может быть использовано
				if ( $url['type']=='catalog' && defined('ATTR_CATALOG_NAME' && !$all) )  {
					$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
					$wa=" AND a.id_attr='".ATTR_CATALOG_NAME."' AND a.id_lang=".$url['id_lang'];
					$a_order=", a.value_".$main['attr_types'][ATTR_CATALOG_NAME]." ASC";
				//для словаря ищем по наименованию (пока это только на alba может быть использовано
				} elseif ( $sort_by_attr>0 )  {
					settype($sort_by_attr,"int");
					$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
					$wa=" AND a.id_attr='".$sort_by_attr."' AND a.id_lang=".$url['id_lang'];
					$a_order=", a.value_".$main['attr_types'][$sort_by_attr]." ASC";
				//если включён индекс по атрибуту - сортируем по значению этого атрибута
				//пока только по возрастанию реализовано
				} elseif ( $url['iattr']>0 )  {
					//echo"[ 5 sort_by_attr=".$url['iattr']." ]";
					$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
					$wa=" AND a.id_attr='".$url['iattr']."' AND a.id_lang=".$url['id_lang'];
					$a_order=", a.value_".$main['attr_types'][$url['iattr']]." ASC";
					$a_group=" GROUP BY a.value_".$main['attr_types'][$url['iattr']]." ";
				} else {
					//echo"[ 6 sort_by_attr=$sort_by_attr ]";
					$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
					$wa="  AND a.id_lang=".$url['id_lang'];
					$a_order="";
				}
				//условия по дате создания
				if ( SITE=='messe' && $url['type']=='catalog' ) {
					$ocreated=", o.created ASC";
					$wcreated="AND o.created > NOW()";
				//события, костыль для спочана
				} elseif ( $url['type']=='events' && $url['year']=='' && SITE=='spochan' ) {
					$wcreated=' ';
					if ( $url['old']==0 ) {
						$ocreated=", o.created DESC";
					} else {
						$ocreated=", o.created DESC";
					}
				//события, нормальный вариант
				} elseif ( $url['type']=='events' && $url['year']=='' ) {
					if ( $url['old']==0 ) {
						$ocreated=", o.created ASC";
						$wcreated=" AND o.created > ( NOW() - INTERVAL 1 DAY ) ";
					} else {
						$ocreated=", o.created DESC";
						$wcreated=" AND o.created < NOW() ";
					}
				} elseif ( $url['type']=='events' && $url['year']!='' ) {
					$ocreated=", o.created DESC";
					$wcreated=" ";
				} else {
					$ocreated=", o.created DESC";
					$wcreated=" ";
				}
				//выборка по автору
				$w_author='';
				if( $url['iauthor']>0 ) {
					$w_author.=" AND o.author = '".$url['iauthor']."'";
				}
				//собираем запрос, пока без LIMIT постраничного
				$query="SELECT o.id FROM `".T_OBJ."` as o".$m_t.$a_t."
				WHERE 		
				".$w_active."
				".$wt."
				".$wy."
				".$wk."
				".$wa."
				".$wcreated."
				".$w_author."
				AND o.id>0
				".$a_group."
				ORDER BY   o.weight DESC ".$a_order." ".$ocreated." 
				";
				$res=db_query($query);
				$count=db_num_rows($res);
				if ($count==0) {
					//если ничего не нашли - вываливаемся
				} else {
					while($row=db_fetch_array($res)) {
						array_push($objects,$row[0]);
					}
					$ret=$objects; 
				}
				db_free_result($res);
			}
			set_var_to_cache($memkey,$ret,MEMCACHE_OBJ_LIST_TTL);
		}
	}
	$main['profiler']['get_obj_list_id']['time']+=microtime(true);
	return array_unique($ret);
}

Добавить комментарий Отменить ответ