PDA

Просмотр полной версии : Проблема с разбивкой табличных данных постранично (PHP и MySQL)


lol2006
25.06.2007, 21:44
Постараюсь передать всю суть проблемы. Имееться страница на которой отображена таблица с данными
<?php

$link = mysql_connect("localhost", "***", "***");
mysql_select_db("pomnim");

$query = "select * from shapka";
$result = mysql_query($query);
echo "<table border=1 bgcolor=#DED4C4>";
while ($row = mysql_fetch_array($result))
echo "<tr align=center><td><B>", $row["fname"], "</B></td><td><B>", $row["name"], "</B></td><td><B>", $row["lname"], "</B></td><td><B>", $row["data_sm"], "</B></td><td><B>", $row["vozrast"], "</B></td><td><B>", $row["gorod"], "</B></td></tr>";
$query2 = "select * from name_d order by binary(fname)";
$result = mysql_query($query2);
while ($row = mysql_fetch_array($result))
echo "<tr bgcolor=#F3F0E9><td>", $row["fname"], "</td><td>", $row["name"], "</td><td>", $row["lname"], "</td><td align=center>", $row["data_sm"], "</td><td align=center>", $row["vozrast"], "</td><td align=center>", $row["gorod"], "</td></tr>";
echo "</table>";


//Разбивка на страницы//
// количество записей, выводимых на странице
$per_page=10;
// получаем номер страницы
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$q="SELECT * FROM `name_d` ORDER BY id LIMIT $start,$per_page";
$res=mysql_query($q);
while($row=mysql_fetch_array($res)) {
echo ++$start.". ".$row['fname']."<br>\n";
}

// дальше выводим ссылки на страницы:
$q="SELECT count(*) FROM `name_d`";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];

$num_pages=ceil($total_rows/$per_page);

for($i=1;$i<=$num_pages;$i++) {
if ($i-1 == $page) {
echo $i." ";
} else {
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
}
}
?>

Отображаеться таблица, а ниже еще список:
1. fname = id=1
2. fname = id=2
и так до
10. fname = id=10

потом ссылка на другую страницу (в данном случае 2)
в ней отображаеться таже таблица ( с выводом всех данных) и соответственно ниже:

11. fname = id=11
12. fname = id=12
и т.п.

Как заставить таблицу делиться на страницы, и отображать их в ссылках на стр.?????

Плиз помогите, начинающему!

GoreMaster
25.06.2007, 21:58
http://phpfaq.ru/paginator
Check this out!
З.Ы.:неплохо было бы,если ты юзал тег пхп для подсветки синтаксиса ;)

lol2006
25.06.2007, 22:02
http://phpfaq.ru/paginator
Check this out!
Если ты не заметил, вторая половина и есть имеено этот прием! Он не работает так как мне надо!!!

ENFIX
25.06.2007, 23:10
на скорую руку =) Попробуй...

<?php

@mysql_connect("localhost", "***", "***");
@mysql_select_db("pomnim");

$query = "select * from shapka;";
$result = mysql_query($query);
echo "<table border=1 bgcolor=#DED4C4>";

while ($row = mysql_fetch_array($result))
{
echo "<tr align=center><td><B>".$row['fname']."</B></td><td><B>".$row['name']."</B></td>
<td><B>".$row['lname']."</B></td><td><B>".$row['data_sm']."</B></td><td><B>".$row['vozrast']."</B></td>
<td><B>".$row['gorod']."</B></td></tr>";
}
$query2 = "select * from name_d order by binary(fname)";
$result = mysql_query($query2);
while ($row = mysql_fetch_array($result))
{
echo "<tr bgcolor=#F3F0E9><td>".$row['fname']."</td>
<td>".$row['name']."</td><td>".$row['lname']."</td>
<td align=center>".$row['data_sm']."</td>
<td align=center>".$row['vozrast']."</td>
<td align=center>".$row['gorod']."</td></tr>";
}

echo "</table>";



//Разбивка на страницы//
// количество записей, выводимых на странице
$per_page=10;
// получаем номер страницы
$page=isset($_GET['page']):$_GET['page']?0;
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$q="SELECT * FROM `name_d` ORDER BY id LIMIT {$start},{$per_page};";
$res=mysql_query($q);

while($row=mysql_fetch_array($res))
{
echo ++$start.". ".$row['fname']."<br/>";
}

// дальше выводим ссылки на страницы:
$q="SELECT count(*) FROM `name_d`;";
$res=mysql_query($q);
$total_rows=mysql_num_rows($q);
$num_pages=ceil($total_rows/$per_page);

for($i=1;$i<=$num_pages;$i++)
{
echo "<a href=".$_SERVER['PHP_SELF']."?page=".$i.">".$i."</a> ";
}
?>

lol2006
25.06.2007, 23:58
Дошол вот до чего, вроде логичнее, но неполучается
<?php

$link = mysql_connect("localhost", "***", "***");
mysql_select_db("pomnim");


//Разбивка на страницы//
// количество записей, выводимых на странице
$per_page=10;
// получаем номер страницы
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.


$query = "select * from shapka";
$result = mysql_query($query);
echo "<table border=1 bgcolor=#DED4C4>";
while ($row = mysql_fetch_array($result))
echo "<tr align=center><td><B>", $row["fname"], "</B></td><td><B>", $row["name"], "</B></td><td><B>", $row["lname"], "</B></td><td><B>", $row["data_sm"], "</B></td><td><B>", $row["vozrast"], "</B></td><td><B>", $row["gorod"], "</B></td></tr>";

$q="SELECT * FROM `name_d` ORDER BY fname LIMIT $start,$per_page";
$res=mysql_query($q);
while($row=mysql_fetch_array($res))

$query2 = "select * from name_d order by binary(fname)";
$result = mysql_query($query2);
while ($row = mysql_fetch_array($result))

echo "<tr bgcolor=#F3F0E9><td>", $row["fname"], "</td><td>", $row["name"], "</td><td>", $row["lname"], "</td><td align=center>", $row["data_sm"], "</td><td align=center>", $row["vozrast"], "</td><td align=center>", $row["gorod"], "</td></tr>";
echo "</table>";


// дальше выводим ссылки на страницы:
$q="SELECT count(*) FROM `name_d`";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];

$num_pages=ceil($total_rows/$per_page);

for($i=1;$i<=$num_pages;$i++) {
if ($i-1 == $page) {
echo $i." ";
} else {
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
}
}
?>

Помогите плиз!

Helios
26.06.2007, 03:58
Че за муть? о_О

while($row=mysql_fetch_array($res);
$query2 = "select * from name_d order by binary(fname)";



Куда лимит делся?

$query2 = "select * from name_d order by binary(fname)";



P.S. Учись оформлять код.
P.P.S: используй [.php] а не [.code]

ENFIX
26.06.2007, 04:15
lol2006, ты мой пробовал? Что выдало?

lol2006
26.06.2007, 08:57
Че за муть? о_О

while($row=mysql_fetch_array($res);
$query2 = "select * from name_d order by binary(fname)";


Это не муть, это сортировка пoля fname по алфавиту!
lol2006, ты мой пробовал? Что выдало?
Выдало пустую страницу!

hhover
26.06.2007, 15:10
1) $start=abs($page*$per_page);
Почему так? Боишься получить отрицательный limit?
Замени
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
на
$page=(isset($_GET['page']) and is_numeric($_GET['page']) and $_GET['page'] >= 0) : $_GET['page'] ? 0;
Так будет честнее.
2) Нафиг в примере выводить шапку? Ее вывод как-то влияет на остальной скрипт? Нет. Ну и убери ее.
3) В последнем твоем коде нету { } после while, поэтому я так и не понял, зачем тебе 2 запроса к одной и той же таблице, когда у тебя уже есть массив _всех_ ее элементов.
4) Нет такого понятия, как пустая страница. Во-первых, посмотри сорс, во-вторых вруби
error_reporting(E_ALL);
ini_set('display_errors', '1');
5) Вынеси в отдельную страницу запрос с limit и всеми относящимися к нему данными/вычислениями. Добейся, чтобы ?page=X выдавало нужные тебе результаты.
6) Венеси в отдельную страницу запрос с count(*), сделай тоже самое, что и с limit.
7) Когда и то и то будет работать совместить их не составит особого труда.
8) Формулировка "Не работает" никак не помогает понять, где именно ошибка и в каком месте что-то неверно. Учись охарактеризовывать действия скрипта точнее.
9) http://www.phpfaq.ru/debug

Abra
26.06.2007, 15:23
А теперь все что сказал выше hhover одним словом: "отладка".
:)

siw
26.06.2007, 21:42
$page=isset($_GET['page']):$_GET['page']?0;

Разве это не ошибка в коде lol'a? (выделил жирным голубым)

Я бы сменил на:


$page=intval($_GET['page']);
$page=((!$page)==false)? $page:0;

lol2006
27.06.2007, 14:42
echo ++$start.". ".$row['fname']."<br>\n";
Как здесь вывисти вот это:
echo "<tr bgcolor=#F3F0E9><td>", $row["fname"], "</td><td>", $row["name"], "</td><td>", $row["lname"], "</td><td align=center>", $row["data_sm"], "</td><td align=center>", $row["vozrast"], "</td><td align=center>", $row["gorod"], "</td></tr>";
echo "</table>";

ENFIX
27.06.2007, 15:24
echo "<tr bgcolor=#F3F0E9><td>".$row['fname']."</td>
<td>".$row['name']."</td><td>".$row['lname']."</td>
<td align=center>".$row['data_sm']."</td>
<td align=center>".$row['vozrast']."</td>
<td align=center>".$row['gorod']."</td></tr>";
echo "</table>";

lol2006
28.06.2007, 23:37
Всем огромное спасибо, все получилось, теперь прошу помощьи чуть-чуть в другом русле (уж простите решил научиться php).
Мне нежно вывести данные из таблицы так что-бы, поле data_sm (поле дата) на странице отображало - "сегодня на нашем сайте Антон, Егор 1 месяц!" Т.Е. что бы отображал список юзеров которые зарегистрировались 1 месяц назад, полгода, год.

Как мне это сделать?

ENFIX
29.06.2007, 05:32
lol2006, читай про if() и функции для работы с mysql
А вообще бы не плохо купить книгу по пхп Желательно не наших авторов.
Если увидишь книгу: "PHP для начинающих" авторов: Дэйв У. Мерсер, Аллан Кент, Стивен Д. Новицки, Дэвид Мерсер, Дэн Скуайер, Ван Кью Чой; Обязательно возьми ;)

lol2006
29.06.2007, 09:16
http://www.internet-technologies.ru/books/book_122.html

Вот нашел:
Авторы: Луис Аргерих, Ванкиу Чой, Джон Коггсхол

Размер: 74.42 Mb

# ISBN: 5-93286-049-9, 1-861006-91-8;
# Издательство: Символ-Плюс, 2003 г.;
# Серия: Программист - программисту / Programmer to Programmer;
# Мягкая обложка, 1048 стр.;
# Тираж: 2000 экз.;
# Формат: 70x100/16;

О чем эта книга и для кого она? О языке РНР, его истории, задачах, достоинствах и недостатках. О том, как, для чего и в каких ОС применяется этот язык. Если говорить подробнее, то об установке РНР на платформах UNIX, Windows и Mac OS X, о сеансах и cookies, клиентах FTP, о функциях для работы в сети и службе каталогов. Кроме того, рассматриваются поддержка LDAP в РНР, разработка многозвенных приложений в РНР, интеграция РНР с XML, средства, предоставляемые РНР для работы с базами данных (на примере MySQLи Post-greSQL). Обсуждаются безопасность, оптимизация и интернационализация приложений, библиотеки расширений РНР, приводятся примеры системы предоставления прав пользователям и многозвенного приложения корзины покупок для WML. Книга адресована всем РНР-программистам.


Может кому понадобиться.