Мои достижения в PHP


Класс установки ссылок смежных материалов

Этот класс я соорудил для сайта на работе, для автоматической установки ссылок на следующую и предыдущую новости. Вроде нормально получилось

class Controls {
	private $Next = 'Следующая новость';
	private $Prev = 'Предыдущая новость';
 
	//метод для определения ID первой и последней новостей
	function GetPoles ($way = 'DESC'){
		$q = mysql_query("SELECT `id` FROM `news` ORDER BY `id` ".$way." LIMIT 1");
		if($q){
			if(mysql_num_rows($q) > 0){
				return mysql_result($q, 0);
			}
			else return false;
		}
		else echo mysql_error();
	}
 
	//собственно, метод, который определяет действительный ID смежного материала
	function FindID ($currentID, $flag = 1){
		if($flag == 1) $id_val = $currentID+1;
		else $id_val = $currentID-1;
		$q = mysql_query("SELECT `id` FROM `news` WHERE `id` = ".$id_val);
		if($q){
			if(mysql_num_rows($q) == 0){
				if($currentID == $this->GetPoles("ASC")) {
					return $this->FindID($id_val, 1);
				}
				elseif($currentID == $this->GetPoles("DESC")) {
					return $this->FindID($id_val, 0);
				}
				else {
					return $this->FindID($id_val, $flag);
				}
			}
			else {
				return mysql_result($q, 0);
			}
		}
		else echo mysql_error();
	}
 
	//конструктор HTML
	function putControls($ID){
		if($ID != $this->GetPoles("DESC")) echo '<span class="next">'."<a href=\"news_1_".$this->FindID($ID, 1).".htm\">&lt;&lt;&lt;".$this->Next."</a>".'</span>';
		if($ID != $this->GetPoles("ASC")) echo '<span class="prev">'."<a href=\"news_1_".$this->FindID($ID, 0).".htm\">".$this->Prev."&gt;&gt;&gt;</a>".'</span>';
	}
}

Тут ещё был класс для подключения к базе данных, но это уже совсем просто. Блин, нравится мне программировать (громко как звучит :) ), аж на работу интересно приходить! Представляете, насколько интересно :) !

, , ,

  1. #1 by Александр on 25.09.2011 - 11:28 am

    Привет, я только начинаю учить пхп мог бы ты мне в скайп помоч?

  2. #2 by Alexpts on 04.11.2011 - 12:08 pm

    А по-моему как-то тяжеловато. Сколько запросов в итоге будет выполнено на странице вашим кодом? И что делать, если ID следующий записи отличается не на 1, а на 13 например, т.к. промежуточные записи были удалены или не должны отображаться?

    • #3 by proglammer on 08.11.2011 - 7:20 pm

      возможно тяжеловато, конечно, но мне нравится )) пока лучше не придумал… а если на 13 отличается ID, то там прописано, что если ID+1 или ID-1 не дает результата, то нужно продолжить минусовать или плюсовать единицу, пока результата не будет ;)

  3. #4 by Жека on 24.01.2013 - 7:23 am

    Жёсткий тр*х базы. Если диапазон id`шников отличается на 100? 100 лишних запросов?
    Действительно ли нужно именно следующую по порядку id`шников новость? Если да,
    SELECT `id` FROM `news`; // все id, кидаем в массив $aNewsID
    $id – предположим, что id текущей новости
    Потом берём предыдущий и следующий id`шник
    $prev = isset($aNewsID[$id-1]) ? $aNewsID[$id-1] : NULL;
    $next = isset($aNewsID[$id+1]) ? $aNewsID[$id-1] : NULL;
    Ещё запрос достать текущую новость, итого 2 запроса вместо хз сколько.

    • #5 by proglammer on 24.01.2013 - 4:56 pm

      Согласен, жестко я с базой поступил. Хорошо что сайт у меня маленький. У меня не было опыта работы с крупными проектами на тот момент, поэтому и не задумывался насчет кол-ва обращений к базе. Твое решение действительно элегантнее

      • #6 by Жека on 24.07.2014 - 3:14 pm

        Перечитал что я посоветовал и ужаснулся. Теперь то мы знаем, что получить смежные материалы очень просто (быстрые запросы по PK):
        $next = mysql_query(“SELECT `id` FROM `news` WHERE `id` > “.$id_val.” LIMIT 1);
        $prev = mysql_query(“SELECT `id` FROM `news` WHERE `id` < ".$id_val." LIMIT 1);

(никто не узнает)

Код на картинке: