|
|
|
| Замороченный постраничный ввывод
Есть две таблицы: в одной хранятся названия категорий, во второй, например, анекдоты
Так вот: как организовать постраничный вывод так, чтобы при переходе в категорию не вываливался список всех страниц?
А выдавались только страницы присущие данной категории? Например, в категории Анекдоты 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">
»»» '.$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> ';
for ($i=1; $i<=$count_pages; $i++)
{
if($entry==$i and $i!=1)
{
echo ' <span class="navtext"> [ '.$i.' ] </span> ';
}
elseif ($entry==$i and $i==1)
{
echo ' <span class="navtext"> [ 1 ] </span> ';
}
elseif($i==1 and $entry!=$i)
{
echo ' <a class="navlink" href="?page='.$pagename.'&entry='.$i.'"> '.$i.' </a> ';
}
elseif($i!=1 and $entry!=$i)
{
echo ' <a class="navlink" href="?page='.$pagename.'&entry='.$i.'"> '.$i.' </a> ';
}
}
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Clocker
(12.11.2005 в 01:59)
| | А какова структура таблиц tbl1 и tbl2 и какая из них к чему относится?
PS Вопросы, посвящённые MySQL лучше сразу размещать в разделе MySQL | |
|
|
|
|
|
|
|
для: cheops
(12.11.2005 в 02:10)
| | Структура:
таблица tbl1
id
name
description
таблица tbl2
id
cid
name
text
published
cid таблицы tbl2 относится к id таблицы tbl1
p.s. я долго ломал голову где разместить вопрос... на будцщее запомню | |
|
|
|
|
|
|
|
для: 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");
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(12.11.2005 в 11:53)
| | Все замечательно, но навигационная строка рисуется во всех категориях и подсчитывает ВСЕ записи, котрые выводит на всех страницахт.е.:
Например,
в Категории 01 - всего один элемент, а в Категории 02 таких элементов 3. Если сделать вывод по два элемента на страницу, то в Категории 02 отобразится ссылка на вторую страницу, что по себе работает. Но такая же строка, со ссылкой на вторую (уже несуществующию страницу) рисуется и в Категории 01 где один элемент. Как избежать этого?
Надеюсь не запутал | |
|
|
|
|
|
|
|
для: Clocker
(12.11.2005 в 13:51)
| | Чего-то не очень понятно :))) Может вы на пример приведёте: что выводится и что должно выводится. | |
|
|
|
|
|
|
|
для: cheops
(12.11.2005 в 22:41)
| | пример-)
есть категория 1, этой категории принадлежит 1 элемент. Есть и Категория 2, которой принадлежит 10 элементов. (структура таблиц выше)
Так вот, попадая в категорию 1 ( с одним элементом) вываливается навигационная строка, точно такая же, как вываливается на странице с Категорией 2. Чего не должно быть
Должно быть, в приципе, так: навигационная строка рисуется только для элементов присущих выбранной категории.
т.е.
в категории 1 всего один элемент - навигационной строки не будет
в категории 2 - 10 элементов - соответственно, навигационная строка будет | |
|
|
|
|
|
|
|
для: Clocker
(13.11.2005 в 00:38)
| | Я так понимаю навигация отображается при помощи функции DisplayNav()? А почему нигде вызова не видно, как она отображается? | |
|
|
|
|
|
|
|
для: 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">
»»» '.$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();
?>
|
| |
|
|
|
|
|
|
|
для: Clocker
(14.11.2005 в 00:11)
| | Хм... так сейчас $cid учитывается функцией DisplayRows()?
PS Длинные листинги лучше прикреплять в виде файла. | |
|
|
|
|
|
|
|
для: cheops
(14.11.2005 в 14:16)
| | Учитывается
Хотя как понять "учитывается"? Если смысл в том, что $cid передается, то да
>>PS Длинные листинги лучше прикреплять в виде файла.
Хорошо, запомню. | |
|
|
|
|
|
|
|
для: Clocker
(14.11.2005 в 20:57)
| | А число строк в проекте $all_lines - корректное или равно числу всех позиций в базе без учёта каталога? Попробуйте вывести
<?php
echo $all_lines;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(15.11.2005 в 00:26)
| |
<?php
echo $all_lines;
?>
|
Равно числу всех позиций в базе без учёта каталога | |
|
|
|
|
|
|
|
для: Clocker
(15.11.2005 в 01:18)
| | Т.е. функция DisplayRows() возвращает неправильное число позиций? Приведите её плиз как она сейчас выглядит, после того, как к ней прикручен новый параметр? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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)
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(15.11.2005 в 13:36)
| | Warning: Missing argument 6 for displayrows() in как раз на той линии, где вставил в параметры $cid.
Что я не так сделал? | |
|
|
|
|
|
|
|
для: 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);
?>
|
необходимо исправить список параметров... | |
|
|
|
|
|
|
|
для: cheops
(15.11.2005 в 21:58)
| | Просто поторопился с ответом. Все получилось. Спасибо за помощь.
Благодарю Cheops. | |
|
|
|