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

Форум PHP

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

 

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

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

тема: Функция возвращает не то значение
 
 автор: P@Sol   (03.10.2006 в 17:23)   письмо автору
 
 

<?
function subdirbd2($id_catalog,$dir)
{
        
$query "SELECT * FROM libcat
                  WHERE id_catalog = '
$id_catalog'";

        
$ctg mysql_query($query);
        if(
mysql_num_rows($ctg)>0)
        {
                
$cat mysql_fetch_array($ctg);

                
$dir $cat['name']."/".$dir;
                 if (
$cat['id_parent'] != 0subdirbd2($cat['id_parent'],$dir);

        }
        echo 
$dir;
        return 
$dir;
}

вызываю функцию
<?
 
echo subdirbd2($id_catalog,"")."^^<br>"// возвращает ОСТ/^^ 

на экране
<?
Стандарты
/ОСТ//то что мне надо  //выдает echo из function
ОСТ/    //выдает echo из function
ОСТ/^^ //то что выдает echo subdirbd2():(

   
 
 автор: komex   (03.10.2006 в 17:29)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:23)
 

Просто надо убрать в функции строчку:

echo $dir;

Как минимум на одну строчку меньше будет на экране. А насчет второй строчки, может это из-за рекурсии?!

   
 
 автор: P@Sol   (03.10.2006 в 17:35)   письмо автору
 
   для: komex   (03.10.2006 в 17:29)
 


echo $dir; 

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

Подправил первый пост

   
 
 автор: komex   (03.10.2006 в 17:40)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:35)
 

Странно! По идее первые 2 строки должны быть одинаковые! А зачем нужен редирект?

   
 
 автор: P@Sol   (03.10.2006 в 17:49)   письмо автору
 
   для: komex   (03.10.2006 в 17:40)
 

они будут разные из-за рекурсии...но почему именно так у меня происходит не понятно...
сначало из бд достаетс ОСТ, потом Стандарт.

а где вы редирект нашли?

   
 
 автор: komex   (03.10.2006 в 17:51)   письмо автору
 
   для: komex   (03.10.2006 в 17:40)
 

Извиняюсь, не ридерект, а рекурсия, конечно! Почему-то не могу сообщение отредактировать! =(

   
 
 автор: komex   (03.10.2006 в 17:49)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:35)
 

У тебя ведь как происходит?! Сначала при вызове функции происходит обращение к БД, потом что-то там выводится с помощью echo, а далее это же значение возвращается фуекцией, и опять выводится (echo subdirbd2($id_catalog,"")."^^<br>";). Значит 2 строчки должны совпасть! По идее это 2 и 3 строчки! А вот первая не понятно откуда берется (скорее всего из-за рекурсии)! Закоментируй рекурсию и посмотри что выведет?

   
 
 автор: P@Sol   (03.10.2006 в 17:51)   письмо автору
 
   для: komex   (03.10.2006 в 17:49)
 

без рекурсии выведет "ОСТ/^^"

   
 
 автор: komex   (03.10.2006 в 17:53)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:51)
 

А надо что бы что выводило? Для чего этот скрипт вообще?

   
 
 автор: P@Sol   (03.10.2006 в 17:55)   письмо автору
 
   для: komex   (03.10.2006 в 17:49)
 

и еще разок
заходим в функцию, выбираем из бд сначало по id_catalog и получаю dir = "ОСТ/", захожу второй раз в функцию и получаю dir = "Стандарты/ОСТ/" - это мне и нужно вывести на экран...но он возвращает первый дир, хотя видно, что нужный мне dir тоже существует

составляю полный путь к каталогу, если известно его id

   
 
 автор: komex   (03.10.2006 в 18:01)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:23)
 

Я кажется понял! Попробуй так:

<? 
function subdirbd2($id_catalog,$dir

        
$query "SELECT * FROM libcat 
                  WHERE id_catalog = '
$id_catalog'"

        
$ctg mysql_query($query); 
        if(
mysql_num_rows($ctg)>0
        { 
                
//Можно попробовать заменить на
                  //$cat = mysql_result($ctg); раз выбирается 1 строка.
                
$cat mysql_fetch_array($ctg); 
                
$dir $cat['name']."/".$dir
                 if (
$cat['id_parent'] != 0$dir subdirbd2($cat['id_parent'],$dir); 

        } 
        return 
$dir;
}
?>


А вызавать также:

<? 
echo subdirbd2($id_catalog,"")."^^<br>";
?>

   
 
 автор: P@Sol   (04.10.2006 в 09:58)   письмо автору
 
   для: komex   (03.10.2006 в 18:01)
 

cheops help

   
 
 автор: komex   (04.10.2006 в 11:08)   письмо автору
 
   для: P@Sol   (04.10.2006 в 09:58)
 

Что, не работает как я написал что ли? =(

   
 
 автор: P@Sol   (04.10.2006 в 11:19)   письмо автору
 
   для: komex   (04.10.2006 в 11:08)
 

я даже не проверял...я не заметил изменений логических...а из бд все и так достается нормально...но return возвращает не последний $dir, а первый
использую первый листинг, но с 3 уровня

1Стандарты/ГОСТ/ОСТ/  //должен вернуть
2ГОСТ/ОСТ/
3ОСТ/  // вовращает
ОСТ/^^

1,2,3 - id каталогов, т.е. сначало в функцию заходит id=3, потом id=2 и последним id=1

   
 
 автор: komex   (04.10.2006 в 11:20)   письмо автору
 
   для: P@Sol   (04.10.2006 в 11:19)
 

А по моему все должно работать как надо! Ты проверь!

   
 
 автор: P@Sol   (04.10.2006 в 11:26)   письмо автору
 
   для: komex   (04.10.2006 в 11:20)
 

1. ты пропустил 1обязательный параметр и 1 необязательный
2. даже если вписать обязательный параметр, ошибок будет еще больше, я проверил

   
 
 автор: P@Sol   (05.10.2006 в 13:28)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:23)
 

help

   
 
 автор: P@Sol   (13.10.2006 в 13:24)   письмо автору
 
   для: P@Sol   (03.10.2006 в 17:23)
 

Следует исправить строку

<?php 
   
if ($cat['id_parent'] != 0subdirbd2($cat['id_parent'],$dir); 
?>  

следующим образом

<?php 
   
if ($cat['id_parent'] != 0$dir subdirbd2($cat['id_parent'],$dir); 
?>  

   
Rambler's Top100
вверх

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