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

Форум MySQL

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

 

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

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

тема: Структурный форум
 
 автор: SS   (11.06.2006 в 22:48)   письмо автору
 
 

Разобрал по косточкам ваш utils.php по части вывода структурного форума, но у меня почему-то ничего не выводится. Подскажите, в чем проблема?


<?php
$idt 
$_GET['idt'];
$idp $_GET['idp'];
// Функция вывода поста на страницу
function post_down($idp,
                   
$idt,
                   
$theme)
{
function 
putpost($idp,$idt,$theme)
{
  
// структурный форум
    // Выводим сообщение с id_post == $id_post
    
$query "SELECT * FROM posts 
              WHERE idp = 
$idp";
    
$psts mysql_query($query);
    if (
$psts)
    {
      
$posts mysql_fetch_array($psts);
      
post_down($idp,
                
$idt,
                
$theme);
      
// Выводим подчинённые сообщения
      
$query "SELECT * FROM posts 
               WHERE parent_post = 
$idp
               ORDER BY idp"
;
      
$psts mysql_query($query);
      if (
$psts)
      {
        
$num_rows=mysql_num_rows($psts);
        while(
$posts mysql_fetch_array($psts))
        {
          
// Рекурсивно вызываем функцию putpost для обработки подчинённых постов
          
putpost($posts['idp'],
                  
$idt);
        }
      } else 
puterror("Ошибка при выборке сообщений темы...1");
    }
    else 
puterror("Ошибка при выборке сообщений темы...");
}
}
?>

   
 
 автор: cheops   (12.06.2006 в 00:16)   письмо автору
 
   для: SS   (11.06.2006 в 22:48)
 

Уберите определение
<?php
function putpost($idp,$idt,$theme
{
?>

Оно не позволяет выполнятся коду и по сути уже является лишним.

   
 
 автор: SS   (12.06.2006 в 01:59)   письмо автору
 
   для: cheops   (12.06.2006 в 00:16)
 

Спасибо.
Подскажите, как сделать сравнение для такой функции?
Задача: если $r['idp'] = $idp, то тему нужно выделить другим цветом.

<?php
$idp 
$_GET['idp']; // id_post
function catalogs($idp

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp"); 
    while(
$r=mysql_fetch_array($result))
    { 
        echo 
"<span style='margin-left : ".$r['level']."px;'> ".$r['theme']."</span><br>"
            
catalogs($r['idp']); 
    } 

catalogs(0); 
?>

   
 
 автор: cheops   (12.06.2006 в 10:44)   письмо автору
 
   для: SS   (12.06.2006 в 01:59)
 

Для этого обычно поступают следующим образом
<?php 
$idp 
$_GET['idp']; // id_post 
function catalogs($idp

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp"); 
    while(
$r=mysql_fetch_array($result)) 
    { 
        if(
$r['idp'] == $idp$style "'margin-left : ".$r['level']."px; color : red'";
        else 
$style "'margin-left : ".$r['level']."px;'";
        echo 
"<span style=$style> ".$r['theme']."</span><br>"
            
catalogs($r['idp']); 
    } 

catalogs(0); 
?>

   
 
 автор: SS   (12.06.2006 в 11:28)   письмо автору
 
   для: cheops   (12.06.2006 в 10:44)
 

Почему-то первое условие не срабатывает, во всех случаях только второе.
И еще вопрос: как поставить второе условие на выборку из таблицы? Таким образом не получается:

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp AND idt = $idt"); 

   
 
 автор: cheops   (12.06.2006 в 21:38)   письмо автору
 
   для: SS   (12.06.2006 в 11:28)
 

1) Хм... выводите значения r['idp'] и $idp в цикле, чтобы выяснить, что не так
<?php
  
echo r['idp']." - ".$idp."<br>";
?>

Есть ли среди них совпадающие пары?
2) А в чём выражается не работа - возникает ошибка или не выводятся нужные записи? Вроде на первый взгляд всё правильно.

   
 
 автор: SS   (13.06.2006 в 00:57)   письмо автору
 
   для: cheops   (12.06.2006 в 21:38)
 

Что-то я ничего не понимаю:
r['idp'] = $idp = ($_GET['idp']), — нормально, а вот
".$idp." получается равным $parent_post
2) Выдает сообщение: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in...

   
 
 автор: cheops   (13.06.2006 в 10:36)   письмо автору
 
   для: SS   (13.06.2006 в 00:57)
 

2) Поставьте проверку
<?php
  $result
=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp")
  if(!
$result) exit(mysql_error());
?>

Что пишет?

   
 
 автор: SS   (13.06.2006 в 10:51)   письмо автору
 
   для: cheops   (13.06.2006 в 10:36)
 

Пишет: Parse error: syntax error, unexpected T_IF in /home/....read.php on line 132

   
 
 автор: cheops   (13.06.2006 в 11:05)   письмо автору
 
   для: SS   (13.06.2006 в 10:51)
 

Есть такое дело... забыли точку с запятой поставить после первого оператора
<?php 
  $result
=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp");
  if(!
$result) exit(mysql_error()); 
?>

   
 
 автор: SS   (13.06.2006 в 19:49)   письмо автору
 
   для: cheops   (13.06.2006 в 11:05)
 

Сообщений об ошибке нет, все нормально.

   
 
 автор: SS   (13.06.2006 в 22:10)   письмо автору
 
   для: cheops   (13.06.2006 в 11:05)
 

Т.е. я хотел сказать не все нормально, а сообщений нет, но проблема осталась. :)

   
 
 автор: cheops   (13.06.2006 в 22:18)   письмо автору
 
   для: SS   (13.06.2006 в 22:10)
 

А выведите запрос
<?php
echo "SELECT * FROM posts WHERE  parent_post = $idp";
?>

Как он выглядит и к чему приводит его выполнение в phpMyAdmin или любом другом клиенте?

   
 
 автор: SS   (13.06.2006 в 23:07)   письмо автору
 
   для: cheops   (13.06.2006 в 22:18)
 

Проверил:
фактически idp ($_GET['idp']) =37, parent_post=33
Пишет (parent_post = $idp): parent_post = 33, при этом ".$r['idp']." = 37, где $idp = $_GET['idp'];
Бред какой-то или у меня уже шарики за ролики...

   
 
 автор: cheops   (14.06.2006 в 23:58)   письмо автору
 
   для: SS   (13.06.2006 в 23:07)
 

Если честно, что-то не очень понял этот пост...

   
 
 автор: SS   (15.06.2006 в 00:24)   письмо автору
 
   для: cheops   (14.06.2006 в 23:58)
 

В этой функции

<?php
$idp 
$_GET['idp'];
$idt $_GET['idt'];
function 
catalogs($idp

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp AND idt = $idt"); 
if(!
$result) exit(mysql_error()); 
    while(
$r=mysql_fetch_array($result)) 
    { 
        if(
$r['idp'] == $idp$style "<span style='margin-left : ".$r['level']."px; color: #00FF00'> ".$r['theme'].""
        else 
$style "<span style='margin-left : ".$r['level']."px; color: #FFFFFF'> <a href=read.htm?idt=".$r['idt']."&idp=".$r['idp'].">".$r['theme']."</a>"
        echo 
"$style <font color='#808080'>— <b>".$r['author']."</b> — ".$r['time']." [to: ".$r['parent_post']."]</span></font>";
            
catalogs($r['idp']); 
    } 

catalogs(0); 
}
?>

две проблемы:
1) не могу добавить второе условие на выборку из таблицы. Как только добавляю к запросу

AND idt = $idt

пишет “You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1”.
2) Не работает условие

<?php
        
if($r['idp'] == $idp$style "<span style='margin-left : ".$r['level']."px; color: #00FF00'> ".$r['theme'].""
        else 
$style "<span style='margin-left : ".$r['level']."px; color: #FFFFFF'> <a href=read.htm?idt=".$r['idt']."&idp=".$r['idp'].">".$r['theme']."</a>"
?>

— всегда только первый вариант. Это неверно. Смысл в том, чтобы в дереве убрать ссылку и выделить другим цветом активное сообщение, чтобы было видно, где находишься.

   
 
 автор: cheops   (15.06.2006 в 11:17)   письмо автору
 
   для: SS   (15.06.2006 в 00:24)
 

1) А откуда берётся переменная $idt - ведь функции передаётся только один параметр: $idp.
2) Т.е. получается, что $idp и $r['idp'] всегда равны друг другу?

   
 
 автор: SS   (15.06.2006 в 18:42)   письмо автору
 
   для: cheops   (15.06.2006 в 11:17)
 

1) Подскажите, как надо сделать?
2) Получается, что они всегда не равны друг другу.

   
 
 автор: cheops   (15.06.2006 в 22:55)   письмо автору
 
   для: SS   (15.06.2006 в 18:42)
 

1) Передать второй параметр, т.е. вместо
<?php
  
function catalogs($idp
  {
?>

писать
<?php
  
function catalogs($idp,$idt
  {
?>

2) Не очень понятно, почему же тогда срабатывает первое условие?

   
 
 автор: SS   (16.06.2006 в 00:37)   письмо автору
 
   для: cheops   (15.06.2006 в 22:55)
 

Я добавил. Ничего не изменилось....................................................
Помогите, пожалуйста мне с этим «деревом» — мне не важно, какая там будет функция. Мне важно - вывести в структурном виде сообщения. В самом начале поста — второй вариант, точнее первый, но он тоже не работает, даже после удаления лишней функции. НЕ выводится ни одно сообщение. У МЕНЯ УЖЕ МОЗГ ПЛАВИТСЯ!!!

   
 
 автор: cheops   (16.06.2006 в 10:32)   письмо автору
 
   для: SS   (16.06.2006 в 00:37)
 

Что означают переменные $idp и $idt?

   
 
 автор: SS   (16.06.2006 в 14:22)   письмо автору
 
   для: cheops   (16.06.2006 в 10:32)
 


TABLE 'posts'
  'idp' int(11) NOT NULL auto_increment,
  'idt' int(11) NOT NULL default '0',
  'parent_post' int(11) NOT NULL default '0',
  PRIMARY KEY  ('idp'),

и т.д.,
где
idp — id_post
idt — id_theme
parent_post — id_post сообщения, на который был этот ответ

   
 
 автор: cheops   (16.06.2006 в 15:20)   письмо автору
 
   для: SS   (16.06.2006 в 14:22)
 

Тогда получается, что проверка "AND idt = $idt" лишняя ведь ответ можно будет восстановить по первому условию, так как поле idp - уникально и двух одинаковых значений быть не может.

   
 
 автор: SS   (16.06.2006 в 22:04)   письмо автору
 
   для: cheops   (16.06.2006 в 15:20)
 

Хорошо. Как должна выглядеть функция? Сейчас она выглядит так:


<?php
function catalogs($idp

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp"); 
if(!
$result) exit(mysql_error()); 
    while(
$r=mysql_fetch_array($result)) 
    { 
        if(
$r['idp'] == $idp$style "<span style='margin-left : ".$r['level']."px; color: #CC0000'> ".$r['theme'].""
        else 
$style "<span style='margin-left : ".$r['level']."px; color: #FFFFFF'> <a href=read.htm?idt=".$r['idt']."&idp=".$r['idp'].">".$r['theme']."</a>"
        echo 
"<b>$style <font color='#996666'>— ".$r['author']."</b></font><font color='#808080'> — ".$r['time']."</font></span>";
            
catalogs($r['idp']); 
    } 

catalogs($idp); 
}
?>


в данный момент она:
1) не выделяет цветом активный пост;
2) показывает только посты, на которые есть ответы уровнем ниже, т.е. для такой схемы:

post1
.....post2
.....post3
..........post4
...............post5

если мы находимся на post1 - оттображается вся ветка, а если находимся на post2 - отображаются только:

..........post4
...............post5

   
 
 автор: cheops   (17.06.2006 в 00:47)   письмо автору
 
   для: SS   (16.06.2006 в 22:04)
 

Активный пост это кто и как он действует? Т.е. всё что выше его не выводится?

   
 
 автор: SS   (17.06.2006 в 01:33)   письмо автору
 
   для: cheops   (17.06.2006 в 00:47)
 

Активный пост — это то сообщение, которые мы смотрим в данный момент.
Т.е. интересует такой вид, как вот здесь: http://www.set.ru/srs/board/read.cgi?user=181&board=1&type=tree&start=0&topic=377&from=0&message=1956

   
 
 автор: cheops   (17.06.2006 в 10:36)   письмо автору
 
   для: SS   (17.06.2006 в 01:33)
 

Тогда вам следует передавать два параметра: первый тот, что есть, а второй номер активного поста. Использовать рабочий параметр рекурсивного спуска в качестве маркера активного поста нельзя, так как он постоянно меняется на каждой итерации рекурсии.

   
 
 автор: SS   (17.06.2006 в 11:31)   письмо автору
 
   для: cheops   (17.06.2006 в 10:36)
 

Я не могу этого проверить, потому что, как писал выше:

2) показывает только посты, на которые есть ответы уровнем ниже, т.е. для такой схемы:

post1
.....post2
.....post3
..........post4
...............post5

если мы находимся на post1 - оттображается вся ветка, а если находимся на post2 - отображаются только:

..........post4
...............post5

   
 
 автор: cheops   (17.06.2006 в 13:21)   письмо автору
 
   для: SS   (17.06.2006 в 11:31)
 

Как вы вызываете функцию catalogs()?

PS Давайте перебираться в новую тему.

   
 
 автор: SS   (17.06.2006 в 15:30)   письмо автору
 
   для: cheops   (17.06.2006 в 13:21)
 

Вы шутите? Я уже два раза код приводил.
Вот весь кусок:

<?php 
function catalogs($idp

$result=mysql_query("SELECT * FROM posts WHERE  parent_post = $idp"); 
if(!
$result) exit(mysql_error()); 
    while(
$r=mysql_fetch_array($result)) 
    { 
        if(
$r['idp'] == $idp$style "<span style='margin-left : ".$r['level']."px; color: #CC0000'> ".$r['theme'].""
        else 
$style "<span style='margin-left : ".$r['level']."px; color: #FFFFFF'> <a href=read.htm?idt=".$r['idt']."&idp=".$r['idp'].">".$r['theme']."</a>"
        echo 
"<b>$style <font color='#996666'>— ".$r['author']."</b></font><font color='#808080'> — ".$r['time']."</font></span>"
            
catalogs($r['idp']); 
    } 

catalogs($idp); 

?> 

   
 
 автор: cheops   (17.06.2006 в 16:22)   письмо автору
 
   для: SS   (17.06.2006 в 15:30)
 

Это определение функции, а как вы её вызывате - в каком контексте, откуда берёте параметр $idp?

   
 
 автор: SS   (17.06.2006 в 16:27)   письмо автору
 
   для: cheops   (17.06.2006 в 16:22)
 

$idp я беру из адресной строки

$idp = $_GET['idp']; 

А как вызываю — не знаю. Я эту функцию у вас на форуме нашел. А как ее надо вызывать?
Я думал, за это отвечает строка функции

catalogs($idp);

Если это не так — то простите мою темноту и подскажите, как надо.

   
 
 автор: cheops   (17.06.2006 в 16:33)   письмо автору
 
   для: SS   (17.06.2006 в 16:27)
 

Продолжение в теме http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=19375.

   
 
 автор: SS   (14.06.2006 в 23:49)   письмо автору
 
   для: cheops   (13.06.2006 в 22:18)
 

Напоминаю про себя.

   
Rambler's Top100
вверх

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