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

Форум MySQL

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

 

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

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

тема: Сложный постраничный ввывод
 
 автор: Clocker   (12.11.2005 в 01:59)   письмо автору
 
 

Замороченный постраничный ввывод

Есть две таблицы: в одной хранятся названия категорий, во второй, например, анекдоты

Так вот: как организовать постраничный вывод так, чтобы при переходе в категорию не вываливался список всех страниц?
А выдавались только страницы присущие данной категории? Например, в категории Анекдоты 13 элементов, в категории Истории - 20 элементов.

Вот код страницы:

<?php

if (!eregi("index.php"$PHP_SELF)) { die ("Access denied"); }
$page_title "Humor";

$pagename0 'humor';

$tbl '_humortext';

$tbl1 '_humorcats';
$tbl2 '_humortext';

$p_records 5;

if(!
$db->open()) 
    {
    die(
$db->error());
    }

list(
$all_lines$entry$page_for_query$page_for_query2,  $p_start) = DisplayRows($tbl$db$entry$page$p_records);


if(isset(
$_GET['cid']) and !empty($_GET['cid']))
    {
    
    
$cid = (int)$_GET['cid'];

$db->query("
        SELECT 
        id, 
        cid, 
        name,
        text, 
        published  
        FROM "
.$tbl2."
        WHERE cid="
.$cid."
        ORDER by name ASC 
        LIMIT "
.$p_start." , ".$p_records."
            "
);        
            
echo 
'<p>
<table border="0" bgcolor="#f1f1f1" cellpadding="2" cellspacing="1" width="100%">
    <tr>'
;
while (
$row $db->fetchAssoc())
    {
    if(
$row['published'] !=0)
        {
        echo 
'
        <tr>
        <td bgcolor="#ffffff" width="100%" height="30">
        &raquo;&raquo;&raquo;&nbsp;&nbsp;'
.$row['name'].'</br>
       <p>'
.$row['text'].'</p>';
        }
    }
echo 
'</table>';

    }
    else
        {
$db->query("SELECT A.id, A.name, A.description, B.cid, count(B.id) as newCount FROM $tbl1 A LEFT JOIN $tbl2 B ON A.id=B.cid GROUP BY B.cid ORDER by id");

echo 
'
<p><table border="0" cellpadding="2" cellspacing="0" width="100%">'
;
        while (
$row $db->fetchAssoc())
            {
        if(
$row['newCount'] !=0)
        {
    echo 
'
    <tr>
        <td><a class="textlink" href="?page='
.$pagename0.'&cid='$row['id']. '">'$row['name']. '</a></td>
    </tr>
    <tr>
        <td>'
$row['description']. '</td>
    </tr>
    <tr>
        <td>Количество элементов: '
$row['newCount'].'</td>
    </tr>
    <tr>
        <td><hr></td>
    </tr>'
;
        }
            }
echo 
'</table>';
        }

$db->freeResult();
$db->close();

?>


Функция на постраничный вывод

<?php

function DisplayRows($tbl$db$entry$page$p_records)
    {
        
$db->query("SELECT * FROM $tbl WHERE published=1");
        
$result $db->FetchArray();

        
$all_lines $db->numRows($result);

        if (!isset(
$entry) or empty($page) or $entry<=0$entry=1;
        else 
$entry=(int)$entry;

        
$page_for_query $entry-1;
        
$page_for_query2 $entry+1;

        
$p_start $page_for_query $p_records;

        return array(
$all_lines$entry$page_for_query$page_for_query2,  $p_start);
    }

function 
DisplayNav($all_lines$p_records$entry$pagename)
    {
     
$count_pages ceil($all_lines $p_records);
          if (
$_GET['entry'] > $count_pages)
              {
                  echo 
'<div align="center">Нет такой страницы!</div>';
                  echo 
'<br /><br />';
                  echo 
'<div align="center"><a href="?page='.$pagename.'">Вернуться назад</a></div>';
              }
          else
              {
            if (
$count_pages>1)
                  {
                       echo 
' <b>Страницы</b>&nbsp;&nbsp;&nbsp; ';
                        for (
$i=1$i<=$count_pages$i++)
                        {
                            if(
$entry==$i and $i!=1)
                                {
                                    echo 
' <span class="navtext"> [ '.$i.' ] </span>&nbsp; ';
                                }
                            elseif (
$entry==$i and $i==1)
                                {
                                    echo 
' <span class="navtext"> [ 1 ] </span>&nbsp;&nbsp; ';
                                }
                            elseif(
$i==and $entry!=$i)
                                {
                                    echo 
' <a class="navlink" href="?page='.$pagename.'&entry='.$i.'"> '.$i.' </a>&nbsp; ';
                                }
                            elseif(
$i!=and $entry!=$i)
                                {
                                echo 
' <a class="navlink" href="?page='.$pagename.'&entry='.$i.'"> '.$i.' </a>&nbsp;&nbsp; ';
                                }
                        }
                    }
                }
    }
    
?>

   
 
 автор: cheops   (12.11.2005 в 02:10)   письмо автору
 
   для: Clocker   (12.11.2005 в 01:59)
 

А какова структура таблиц tbl1 и tbl2 и какая из них к чему относится?

PS Вопросы, посвящённые MySQL лучше сразу размещать в разделе MySQL

   
 
 автор: Clocker   (12.11.2005 в 02:32)   письмо автору
 
   для: cheops   (12.11.2005 в 02:10)
 

Структура:

таблица tbl1
id
name
description

таблица tbl2
id
cid
name
text
published

cid таблицы tbl2 относится к id таблицы tbl1

p.s. я долго ломал голову где разместить вопрос... на будцщее запомню

   
 
 автор: cheops   (12.11.2005 в 11:53)   письмо автору
 
   для: Clocker   (12.11.2005 в 02:32)
 

Необходимо $cid передать в качестве параметра в функцию DisplayRows(), а в SQL-запрос внутри функции добавить условие AND cid = $cid
"SELECT * FROM $tbl WHERE published=1 AND cid = $cid"

вернее даже условие поставить, если $cid не пуст, то этот запрос, если пуст, то старый
<?php
  
if(!empty($cid))
  {
     
$db->query("SELECT * FROM $tbl WHERE published=1 AND cid = $cid");
  }
  else
  {
     
$db->query("SELECT * FROM $tbl WHERE published=1");
  }
?>

   
 
 автор: Clocker   (12.11.2005 в 13:51)   письмо автору
 
   для: cheops   (12.11.2005 в 11:53)
 

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

Например,
в Категории 01 - всего один элемент, а в Категории 02 таких элементов 3. Если сделать вывод по два элемента на страницу, то в Категории 02 отобразится ссылка на вторую страницу, что по себе работает. Но такая же строка, со ссылкой на вторую (уже несуществующию страницу) рисуется и в Категории 01 где один элемент. Как избежать этого?

Надеюсь не запутал

   
 
 автор: cheops   (12.11.2005 в 22:41)   письмо автору
 
   для: Clocker   (12.11.2005 в 13:51)
 

Чего-то не очень понятно :))) Может вы на пример приведёте: что выводится и что должно выводится.

   
 
 автор: Clocker   (13.11.2005 в 00:38)   письмо автору
 
   для: cheops   (12.11.2005 в 22:41)
 

пример-)

есть категория 1, этой категории принадлежит 1 элемент. Есть и Категория 2, которой принадлежит 10 элементов. (структура таблиц выше)

Так вот, попадая в категорию 1 ( с одним элементом) вываливается навигационная строка, точно такая же, как вываливается на странице с Категорией 2. Чего не должно быть

Должно быть, в приципе, так: навигационная строка рисуется только для элементов присущих выбранной категории.

т.е.
в категории 1 всего один элемент - навигационной строки не будет

в категории 2 - 10 элементов - соответственно, навигационная строка будет

   
 
 автор: cheops   (13.11.2005 в 13:37)   письмо автору
 
   для: Clocker   (13.11.2005 в 00:38)
 

Я так понимаю навигация отображается при помощи функции DisplayNav()? А почему нигде вызова не видно, как она отображается?

   
 
 автор: Clocker   (14.11.2005 в 00:11)   письмо автору
 
   для: cheops   (13.11.2005 в 13:37)
 

Интересно скопировалось, что немаловажная часть потерялась...

<?php 

if (!eregi("index.php"$PHP_SELF)) { die ("Access denied"); } 
$page_title "Humor"

$pagename0 'humor'

$tbl '_humortext'

$tbl1 '_humorcats'
$tbl2 '_humortext'

$p_records 5

if(!
$db->open()) 
    { 
    die(
$db->error()); 
    } 

list(
$all_lines$entry$page_for_query$page_for_query2,  $p_start) = DisplayRows($tbl$db$entry$page$p_records); 


if(isset(
$_GET['cid']) and !empty($_GET['cid'])) 
    { 
     
    
$cid = (int)$_GET['cid']; 

$db->query(
        SELECT 
        id, 
        cid, 
        name, 
        text, 
        published   
        FROM "
.$tbl2.
        WHERE cid="
.$cid.
        ORDER by name ASC 
        LIMIT "
.$p_start." , ".$p_records.
            "
);         
             
echo 
'<p> 
<table border="0" bgcolor="#f1f1f1" cellpadding="2" cellspacing="1" width="100%"> 
    <tr>'

while (
$row $db->fetchAssoc()) 
    { 
    if(
$row['published'] !=0
        { 
        echo 

        <tr> 
        <td bgcolor="#ffffff" width="100%" height="30"> 
        &raquo;&raquo;&raquo;&nbsp;&nbsp;'
.$row['name'].'</br> 
       <p>'
.$row['text'].'</p>'
        } 
    } 
echo 
'</table>'

DisplayNav($all_lines$p_records$entry$pagename);

    } 
    else 
        { 
$db->query("SELECT A.id, A.name, A.description, B.cid, count(B.id) as newCount FROM $tbl1 A LEFT JOIN $tbl2 B ON A.id=B.cid GROUP BY B.cid ORDER by id"); 

echo 

<p><table border="0" cellpadding="2" cellspacing="0" width="100%">'

        while (
$row $db->fetchAssoc()) 
            { 
        if(
$row['newCount'] !=0
        { 
    echo 

    <tr> 
        <td><a class="textlink" href="?page='
.$pagename0.'&cid='$row['id']. '">'$row['name']. '</a></td> 
    </tr> 
    <tr> 
        <td>'
$row['description']. '</td> 
    </tr> 
    <tr> 
        <td>Количество элементов: '
$row['newCount'].'</td> 
    </tr> 
    <tr> 
        <td><hr></td> 
    </tr>'

        } 
            } 
echo 
'</table>'
        } 

$db->freeResult(); 
$db->close(); 

?> 

   
 
 автор: cheops   (14.11.2005 в 14:16)   письмо автору
 
   для: Clocker   (14.11.2005 в 00:11)
 

Хм... так сейчас $cid учитывается функцией DisplayRows()?

PS Длинные листинги лучше прикреплять в виде файла.

   
 
 автор: Clocker   (14.11.2005 в 20:57)   письмо автору
 
   для: cheops   (14.11.2005 в 14:16)
 

Учитывается
Хотя как понять "учитывается"? Если смысл в том, что $cid передается, то да

>>PS Длинные листинги лучше прикреплять в виде файла.
Хорошо, запомню.

   
 
 автор: cheops   (15.11.2005 в 00:26)   письмо автору
 
   для: Clocker   (14.11.2005 в 20:57)
 

А число строк в проекте $all_lines - корректное или равно числу всех позиций в базе без учёта каталога? Попробуйте вывести
<?php
  
echo $all_lines;
?>

   
 
 автор: Clocker   (15.11.2005 в 01:18)   письмо автору
 
   для: cheops   (15.11.2005 в 00:26)
 


<?php 
  
echo $all_lines
?> 


Равно числу всех позиций в базе без учёта каталога

   
 
 автор: cheops   (15.11.2005 в 03:23)   письмо автору
 
   для: Clocker   (15.11.2005 в 01:18)
 

Т.е. функция DisplayRows() возвращает неправильное число позиций? Приведите её плиз как она сейчас выглядит, после того, как к ней прикручен новый параметр?

   
 
 автор: Clocker   (15.11.2005 в 12:16)   письмо автору
 
   для: cheops   (15.11.2005 в 03:23)
 


function DisplayRows($tbl, $db, $entry, $page, $p_records)
    {
    if(!empty($cid)) 
    { 
        $db->query("SELECT * FROM $tbl WHERE published=1 AND cid = $cid"); 
    } 
    else 
        { 
        $db->query("SELECT * FROM $tbl WHERE published=1"); 
        } 
        
        $result = $db->FetchArray();

        $all_lines = $db->numRows($result);

        if (!isset($entry) or empty($page) or $entry<=0) $entry=1;
        else $entry=(int)$entry;

        $page_for_query = $entry-1;
        $page_for_query2 = $entry+1;

        $p_start = $page_for_query * $p_records;

        return array($all_lines, $entry, $page_for_query, $page_for_query2,  $p_start);
    }



Функция возвращает все элементы хранящииеся в таблице $tbl2

   
 
 автор: cheops   (15.11.2005 в 13:36)   письмо автору
 
   для: Clocker   (15.11.2005 в 12:16)
 

Погодите, а почему у вас $cid в параметрах нет? В этом случае $cid всегда будет пустым и будет срабатывать второй запрос... Необходимо
<?php
function DisplayRows($tbl$db$entry$page$p_records)
?>

исправить на
<?php
function DisplayRows($tbl$db$entry$page$p_records$cid)
?>

   
 
 автор: Clocker   (15.11.2005 в 21:33)   письмо автору
 
   для: cheops   (15.11.2005 в 13:36)
 

Warning: Missing argument 6 for displayrows() in как раз на той линии, где вставил в параметры $cid.
Что я не так сделал?

   
 
 автор: cheops   (15.11.2005 в 21:58)   письмо автору
 
   для: Clocker   (15.11.2005 в 21:33)
 

Ещё при вызове функции
<?php
list($all_lines$entry$page_for_query$page_for_query2,  $p_start) = DisplayRows($tbl$db$entry$page$p_records$cis);
?>

необходимо исправить список параметров...

   
 
 автор: Clocker   (15.11.2005 в 22:21)   письмо автору
 
   для: cheops   (15.11.2005 в 21:58)
 

Просто поторопился с ответом. Все получилось. Спасибо за помощь.

Благодарю Cheops.

   
Rambler's Top100
вверх

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