Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> return в рекурсивной функции не работает 
V
    Опции темы
Master_
  Дата 12.1.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Код

    function find_all_parent($cat)
    {
        $query = mysql_query_lis("SELECT parent_id, dir FROM gallery_cats WHERE id='" . $cat . "'");
        if ( mysql_num_rows($query) )
        {
            $row = mysql_fetch_array($query);
            if ( $row['parent_id'] == '0' )
            {
                return $row['dir'];
            }
            else 
            {
                $this->find_all_parent($row['parent_id']);
            }
        }    
    }

Пробовал разными способами, но нужное значение мне так и не возвращается.
В примере выше ничего не возвращается..

Функция берет значение поля dir у категории раздела или категории подраздела.

ПОдскажиет как исправить чтобы return нужный выдавался :(
Если написать на месте return echo $row['dir'], то выводит то что надо...
PM   Вверх
onsql
Дата 12.1.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



Наверное надо так:
Код

           else 
            {
                return $this->find_all_parent($row['parent_id']);
            }


И, кстати, неплохо бы определитьсяЮ что же делать если num_rows() вернула 0
PM MAIL   Вверх
Master_
Дата 12.1.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Ничего не выводит если писать как вы посоветовали.
PM   Вверх
onsql
Дата 12.1.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



Ну тогда попробую угадать

Вот дамп тестовой базы которую я завел:
Код

-- 
-- Структура таблицы `gallery_cats`
-- 

CREATE TABLE `gallery_cats` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `dir` varchar(200) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

-- 
-- Дамп данных таблицы `gallery_cats`
-- 

INSERT INTO `gallery_cats` (`id`, `parent_id`, `dir`) VALUES (1, 0, 'root'),
(2, 1, 'cat1'),
(3, 2, 'cat2');


Вот тестовый пример:
Код

<?php

function find_all_parent($cat, $db)
{
  $query = mysql_query("SELECT parent_id, dir FROM gallery_cats WHERE id='" . $cat . "'", $db);
  if (!$query)
    die('query');

  if ( mysql_num_rows($query) )
    {
      $row = mysql_fetch_array($query);
      if ( $row['parent_id'] == '0' )
    {
      return $row['dir'];
    }
      else 
    {
      return find_all_parent($row['parent_id'], $db);
    }
    }    
  else
    die('num_rows');
}


$db = mysql_connect('localhost', 'root', '******');
if (!$db)
  die('connect');

if (!mysql_select_db('test'))
  die('select_db');

echo 'res='.find_all_parent(3, $db);



Выводит:
Код

php requrs1.php
res=root


Может попечатать что функции возвращают внутри вашего примера?
PM MAIL   Вверх
GeneralElectric
Дата 12.1.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Master_, тебе же написали. Если логика твоей программы такова, что в некоторых случаях return не выполняется (а у тебя аж ДВА условия, по которым return не выполнится), то, разумеется, функция ничего не вернёт. 

Попробуй прочесть не только тот код, который тебе написал onsql, но и то, что он написал словами: 
Цитата

неплохо бы определиться, что же делать если num_rows() вернула 0 

код он тебе дал для одного условия. и написал, что надо сделать для второго.

PM MAIL   Вверх
Master_
Дата 12.1.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Спасибо, теперь понял в чем был подвох smile
Код поправил smile
PM   Вверх
Master_
Дата 12.1.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Не стал создавать новую тему..
вопрос по этой жей функции
Код

    function find_all_parent($cat)

    {

        $query = mysql_query_lis("SELECT parent_id, dir FROM gallery_cats WHERE id='" . $cat . "'");

        if ( mysql_num_rows($query) )

        {

            $row = mysql_fetch_array($query);

            //$upload_path = array();

            $upload_path[] = $row['dir'];

            //print_r($upload_path);

            if ( !$row['parent_id'] )

            {

                return $upload_path;

                //$row['dir'];

            }

            else 

            {

                return find_all_parent($row['parent_id']);

            }

        }    

        else

        {

            return FALSE;

        }

    }

Хочу помещать в массив все найденные парренты, но при рекурсии массив все время создается заново... Может есть способы создать массив, чтобы в нго вписывались поочередно данные?

Это сообщение отредактировал(а) Master_ - 12.1.2008, 16:04
PM   Вверх
SqueeZe
Дата 12.1.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: 1
Всего: 1



По идее нужно сделать у функции второй параметр и при рекурсии передавать этот массив.
PM MAIL ICQ   Вверх
Master_
Дата 12.1.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



пробовал $i вставлять, но все равно массив заново создавался..
PM   Вверх
SqueeZe
Дата 12.1.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Вот так по идее должно работать. 

Код

function find_all_parent($cat, $upload_path=null)
    {
       

        $query = mysql_query_lis("SELECT parent_id, dir FROM gallery_cats WHERE id='" . $cat . "'");
        if ( mysql_num_rows($query) )
        {
            #############################
            if ($upload_path == null) {
                $upload_path = array();
            }
            #############################
            
            $row = mysql_fetch_array($query);
            //$upload_path = array();
            $upload_path[] = $row['dir'];
            //print_r($upload_path);
            if ( !$row['parent_id'] )
            {
                return $upload_path;
                //$row['dir'];
            }
            else 
            {
                return find_all_parent($row['parent_id'], $upload_path);
            }
        }    
        else
        {
            return FALSE;
        }
    }

PM MAIL ICQ   Вверх
onsql
Дата 12.1.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



А я бы передавал массив по ссылке, чтобы не делать каждый раз его копирование
Код

    function  walk_parents($cat, & $arr)
    {
        $query = mysql_query_lis("SELECT parent_id, dir FROM gallery_cats WHERE id='" . $cat . "'");
        if (!$query || !mysql_num_rows($query) )
            return false;

        $row = mysql_fetch_array($query);
        $arr[] = $row['dir'];

        return ( ! $row['parent_id'] ) ? true : walk_parents($row['parent_id'], $arr);
    }

    function find_all_parent($cat)
    {
          $arr = array();
          return walk_parents($cat, $arr) ? $arr : false;
    }


PM MAIL   Вверх
SqueeZe
Дата 12.1.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Да. Безусловно это правильнее.
PM MAIL ICQ   Вверх
onsql
Дата 12.1.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



SqeeZe, спасибо на добром слове smile

Master_ и ещё, не стоит подставлять значение $cat прямо в запрос, если не уверен точно что в нем численное значение, проще всего заменить на 
Код

        $query = mysql_query_lis("SELECT parent_id, dir FROM gallery_cats WHERE id='" . (int) $cat . "'");


PM MAIL   Вверх
Master_
Дата 12.1.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Спасибо, на втором примере работает как надо.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.