Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не срабатывает return в классе
 
 автор: dimon   (20.04.2011 в 14:56)   письмо автору
 
 

Здравствуйте!
Написал свой первый класс, который должен выводить ссылки на смежные записи (т.е. ближайшие по ID к текущей). Написал класс небольшой:

class Controls {
    private $Next = 'Следующая новость';
    private $Prev = 'Предыдущая новость';
    
    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();
    }
    
    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")) $this->FindID($id_val, 0);
                elseif($currentID == $this->GetPoles("DESC")) $this->FindID($id_val);
                else $this->FindID($id_val, $flag);
            }
            else {
                return mysql_result($q, 0);
            }
        }
        else echo mysql_error();
    }
    
    function putControls($ID){
    
        if($ID != $this->GetPoles("DESC")) echo '<span class="prev">'."<a href=\"news_1_".$this->FindID($ID, 1).".htm\">&lt;&lt;&lt;".$this->Next."</a>".'</span>';
        if($ID != $this->GetPoles("ASC")) echo '<span class="next">'."<a href=\"news_1_".$this->FindID($ID, 0).".htm\">".$this->Prev."&gt;&gt;&gt;</a>".'</span>';
    }
}
//назначаем класс
$controls = new Controls();
$controls->putControls(63);

Загвозтка происходит в методе FindID. Суть там в том, чтобы определить, является ли текущий ID первым или последним, а также, существует ли смежный ID вообще (бывает же так, что запись удаляют, а база продолжает свой ауто_инкремент), и если не существует, то попробовать еще +1. И вот, когда ближайший по значению ID найден, значение не возвращается через return, хотя если радом поставить какое-нибудь echo, то всё нормально направляется на экран. Как-то коряво объяснил, но надеюсь сторожилы поймуть :) Подскажите, пожалуйста, в чем может быть дело. может return не работает рекурсивно???
Спасибо!

  Ответить  
 
 автор: cheops   (20.04.2011 в 17:20)   письмо автору
 
   для: dimon   (20.04.2011 в 14:56)
 

А почему в блоке
if(mysql_num_rows($q) == 0){
...
} else {
...
}
у вас только один return, в else? Вы используете этот метод для возвращаения значения, return нужно указать для всех случаев.

  Ответить  
 
 автор: dimon   (20.04.2011 в 17:22)   письмо автору
 
   для: cheops   (20.04.2011 в 17:20)
 

да, я вот как раз почти сам до этого дошёл! спасибо!

  Ответить  
 
 автор: dimon   (20.04.2011 в 17:21)   письмо автору
 
   для: dimon   (20.04.2011 в 14:56)
 

спасибо. тему можно закрыть :) не сделал выхода из рекурсивной функции:
...
if(mysql_num_rows($q) == 0){ 
                if($currentID == $this->GetPoles("ASC")) $this->FindID($id_val, 0); 
                elseif($currentID == $this->GetPoles("DESC")) $this->FindID($id_val); 
                else return $this->FindID($id_val, $flag); 
            } 
...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования