Jump to content
  • 0

Постраничный вывод из bd


rus
 Share

Question

Добрый день!

При изучении php и попутном создании сайта на php столкнулся с такой проблемой:

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

Собственно сам код:

<?php 
$result = mysql_query("SELECT id,title,date,text FROM lessons ORDER BY id LIMIT 3",$db);
$myrow = mysql_fetch_array($result);

do {

printf ("<table class='tableborder'>
<tr>
<td><p>%s</p></td>
</tr>
<tr>
<td><p>Дата занесения: %s</p>
</td>
</tr>
<tr>
<td><p>%s</p></td>
</tr>
</table>", $myrow ["title"], $myrow ["date"], $myrow ["text"]);
}

while ($myrow = mysql_fetch_array($result));
?>

Как видите свойство limit не дало желаемого результата!

P.S. Вопрос сформирован выше.

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

Покажу кусок своего постраничника - ничего революционного и он сыроват, но общую идею если пойм?те, то думаю заточите его.

<?php
include('../config.php');
MYSQL_CONNECT($hostname,$username,$password) OR DIE("Не могу создать соединение ");
@mysql_select_db("$dbName") or die("Не могу выбрать базу данных ");
$result = mysql_query('SELECT `id` FROM table');
$summatemp = mysql_num_rows($result);
// вот тут должно быть условие, если $summatemp = 0, то выводиться заглушка, а то еррорить будет.
$summa = $summatemp;
$number = 10; // кол-во выводимого контента на страницу
$numberpage = $summa / $number;
$numberpage = ceil ($numberpage);
$page = 1;
$pageget = $_GET['page'];
if($page > $summa/$number + $numberpage) break;
if ($pageget <= 1) {$start_pos = 0;}
else {
$start_pos = $pageget * $number - $number;}
$perpage = $number;
$result = mysql_query('SELECT * FROM table ORDER BY `id` ASC LIMIT '.$start_pos.', '.$perpage) or die('Error!');
while ($row = mysql_fetch_array($result)) {
echo '
<div>
'.$row['id'].'
</div>
';
}
if($pageget <= 1) $pageget = 1;
$i = $pageget * $number - $number;
while ($page <= $numberpage){
echo '<a href="?page='. $page .'">'. $page .'</a>'; // если приложить голову, то сам вовод списка страниц можно сделать любым, насколько фантазии хватит.
$page++;}
//echo "Ошибка базы данных. MySQL пишет: ", mysql_error();
?>

Link to comment
Share on other sites

  • 0

другой вариант - после выбора из БД просто выводить от M до N элементы массива. плюс варианта - проще реализовать. минус - при открытии каждой страницы из БД берется вся инфа полностью.

Link to comment
Share on other sites

  • 0
другой вариант - после выбора из БД просто выводить от M до N элементы массива. плюс варианта - проще реализовать. минус - при открытии каждой страницы из БД берется вся инфа полностью.

Нет, мне нужно чтобы на каждой странице выводились по скажем 3 (например урока) состоящие из 4 ячеек (id,title,date,text), а внизу будут ссылки на страницу со следующими тремя уроками..., вот.

Попробовал такой код:

<?php 
function yandex_link_bar($page, $count, $pages_count, $show_link)
{
// $show_link - это количество отображаемых ссылок;
// нагляднее будет, когда это число будет парное
// Если страница всего одна, то вообще ничего не выводим
if ($pages_count == 1) return false;
$sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками
// Для придания ссылкам стиля
$style = 'style="color: #808000; text-decoration: none;"';
$begin = $page - intval($show_link / 2);
unset($show_dots); // На всякий случай :)
// Сам постраничный вывод
// Если количество отображ. ссылок больше кол. страниц
if ($pages_count <= $show_link + 1) $show_dots = 'no';
// Вывод ссылки на первую страницу
if (($begin > 2) && ($pages_count - $show_link > 2)) {
echo '<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> ';
}
for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок
{
$i = $begin + $j; // Номер ссылки
// Если страница рядом с началом, то увеличить цикл для того,
// чтобы количество ссылок было постоянным
if ($i < 1) continue;
// Подобное находится в верхнем цикле
if (!isset($show_dots) && $begin > 1) {
echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> ';
$show_dots = "no";
}
// Номер ссылки перевалил за возможное количество страниц
if ($i > $pages_count) break;
if ($i == $page) {
echo ' <a '.$style.' ><b>'.$i.'</b></a> ';
} else {
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$i.'>'.$i.'</a> ';
}
// Если номер ссылки не равен кол. страниц и это не последняя ссылка
if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
// Вывод "..." в конце
if (($j == $show_link) && ($i < $pages_count)) {
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.($i+1).'><b>...</b></a> ';
}
}
// Вывод ссылки на последнюю страницу
if ($begin + $show_link + 1 < $pages_count) {
echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$pages_count.'> >| </a>';
}
return true;
} // Конец функции

// Подключение к базе данных
include("bloks/data_base.php");

// Подготовка к постраничному выводу
$perpage = 3; // Количество отображаемых данных из БД
if (empty($_get['id']) || ($_get['id'] <= 0)) {
$id = 1;
} else {
$id = (int) $_get['id']; // Считывание текущей страницы
}
// Общее количество информации
$count = mysql_numrows(mysql_query('select * from lessons')) or die('error! Записей не найдено!');
$pages_count = ceil($count / $perpage); // Количество страниц
// Если номер страницы оказался больше количества страниц
if ($id > $pages_count) $id = $pages_count;
$start_pos = ($id - 1) * $perpage; // Начальная позиция, для запроса к БД
// Вызов функции, для вывода ссылок на экран

yandex_link_bar($id, $count, $pages_count, 3);

// Вывод информации из базы данных
echo '<p><b>Постраничный вывод информации</b></p>';
$result = mysql_query('select * from lessons limit '.$start_pos.', '.$perpage) or die('error!');
while ($row = mysql_fetch_array($result)) {
echo '<p>'.$row['some_field'].'</p>';
}
?>

Но у меня ошибку выводит на последней строке: echo '

'.$row['some_field'].'

';
Link to comment
Share on other sites

  • 0
Дим.. вот понаписал.. народ копипастом займется.. мог просто ведь просто написать что у LIMIT - 2 параметра откуда и сколько брать)

Пусть копипастит, если нравиться - мне такого копипаста в сво? время не хватало.

Link to comment
Share on other sites

  • 0
Но у меня ошибку выводит на последней строке: echo '

'.$row['some_field'].'

';

Я конечно покажусь сейчас гадом, но столбец some_field в таблице lessons есть?

Да нет, почему же! Как раз наоборот, я ведь все понимаю, когда уже многое знаешь тебе кажется что все вокруг тебя начинающие такие грубо говоря "дебилы", или помягче - делитанты, и что лучше им заняться чем-нибудь другим. Это я по себе сужу... :)

Я попробовал вот так переделать:

<?php 
function yandex_link_bar($id, $count, $pages_count, $show_link)
{
// $show_link - это количество отображаемых ссылок;
// нагляднее будет, когда это число будет парное
// Если страница всего одна, то вообще ничего не выводим
if ($pages_count == 1) return false;
$sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками
// Для придания ссылкам стиля
$style = 'style="color: #808000; text-decoration: none;"';
$begin = $id - intval($show_link / 2);
unset($show_dots); // На всякий случай :)
// Сам постраничный вывод
// Если количество отображ. ссылок больше кол. страниц
if ($pages_count <= $show_link + 1) $show_dots = 'no';
// Вывод ссылки на первую страницу
if (($begin > 2) && ($pages_count - $show_link > 2)) {
echo '<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> ';
}
for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок
{
$i = $begin + $j; // Номер ссылки
// Если страница рядом с началом, то увеличить цикл для того,
// чтобы количество ссылок было постоянным
if ($i < 1) continue;
// Подобное находится в верхнем цикле
if (!isset($show_dots) && $begin > 1) {
echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> ';
$show_dots = "no";
}
// Номер ссылки перевалил за возможное количество страниц
if ($i > $pages_count) break;
if ($i == $id) {
echo ' <a '.$style.' ><b>'.$i.'</b></a> ';
} else {
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$i.'>'.$i.'</a> ';
}
// Если номер ссылки не равен кол. страниц и это не последняя ссылка
if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
// Вывод "..." в конце
if (($j == $show_link) && ($i < $pages_count)) {
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.($i+1).'><b>...</b></a> ';
}
}
// Вывод ссылки на последнюю страницу
if ($begin + $show_link + 1 < $pages_count) {
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$pages_count.'> >| </a>';
}
return true;
} // Конец функции

// Подключение к базе данных
include("bloks/data_base.php");

// Подготовка к постраничному выводу
$perpage = 2; // Количество отображаемых данных из БД
if (empty($_GET['id']) || ($_GET['id'] <= 0)) {
$id = 1;
} else {
$id = (int) $_GET['id']; // Считывание текущей страницы
}
// Общее количество информации
$count = mysql_numrows(mysql_query('select * from lessons')) or die('error! Записей не найдено!');
$pages_count = ceil($count / $perpage); // Количество страниц
// Если номер страницы оказался больше количества страниц
if ($id > $pages_count) $id = $pages_count;
$start_pos = ($id - 1) * $perpage; // Начальная позиция, для запроса к БД
// Вызов функции, для вывода ссылок на экран

// Вывод информации из базы данных
$result = mysql_query('select id,title,date,text FROM lessons limit '.$start_pos.', '.$perpage) or die('error!');
$myrow = mysql_fetch_array($result);


do {

printf ("<table class='tableborder'>
<tr>
<td><p>%s</p></td>
</tr>
<tr>
<td><p>Дата занесения: %s</p>
</td>
</tr>
<tr>
<td><p>%s</p></td>
</tr>
</table>", $myrow ["title"], $myrow ["date"], $myrow ["text"]);
}


while ($myrow = mysql_fetch_array($result));

yandex_link_bar($id, $count, $pages_count, 3);
?>

Информация выводится, да и ссылки тоже..., вот только при переходе по этим ссылкам она не меняется.

Link to comment
Share on other sites

  • 0
Нет, мне нужно чтобы на каждой странице выводились по скажем 3 (например урока) состоящие из 4 ячеек

угу. я имел в виду как раз это.

имеем двумерный (или больше) массив

$full = array(

0 => array(id, title, data, text),

1 => array(id, title, data, text),

...

n => array(id, title, data, text),

)

в зависимости от переменной $page при обращении к нему выводим часть этого массива, т.е.

$count = 3; // сколько элементов на странице
for ($i = $page * $count, $i < ($page + 1) * $count, $i++) {
if (empty($full[$i][0]) {break;} // выйдем если последняя страница неполная чтб не создавать пустых строк таблицы
echo('<tr><td>'.$full[$i][0].'</td><td>'.$full[$i][1].'</td><td>'.$full[$i][2].'</td><td>'.$full[$i][3].'</td></tr>');
}

но в чем минус уже сказал - ни к чему на пхп перекладывать то, что быстрее организуется средствами БД. просто это тоже вариант. и я его кстати в галерее использую:) разница заметна только при больших объемах, а когда в массиве меньше 500 элементов, как у меня, проще сделать легким способом

Link to comment
Share on other sites

  • 0

Всем спасибо за помощь, но я в принципе разобрался в своем варианте, т.к. он мне больше приглянулся. :)

Может быть кому-то он пригодится..., вобщем вот:

<?php 
function yandex_link_bar($page, $count, $pages_count, $show_link)
{
if ($pages_count == 1) return false;
$sperator = '|';
$style = 'style="color:#014D8B; font: bold 14px Verdana; margin:20px; padding:20px;"';
$begin = $page - intval($show_link / 2);
unset($show_dots);
if ($pages_count <= $show_link + 1) $show_dots = 'no';
if (($begin > 2) && ($pages_count - $show_link > 2)) {
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page=1> |< </a>';
}
for ($j = 0; $j <= $show_link; $j++)
{
$i = $begin + $j;
if ($i < 1) continue;
if (!isset($show_dots) && $begin > 1) {
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.($i-1).'><b>...</b></a>';
$show_dots = "no";
}
if ($i > $pages_count) break;
if ($i == $page) {
echo '<a '.$style.' ><b>'.$i.'</b></a>';
} else {
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$i.'>'.$i.'</a>';
}
if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
if (($j == $show_link) && ($i < $pages_count)) {
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.($i+1).'><b>...</b></a>';
}
}
if ($begin + $show_link + 1 < $pages_count) {
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$pages_count.'> >| </a>';
}
return true;
}
include("bloks/data_base.php"); //Соединение с базой.
$perpage = 2;
if (empty($_GET['page']) || ($_GET['page'] <= 0)) {
$page = 1;
} else {
$page = (int) $_GET['page'];
}
$count = mysql_numrows(mysql_query('select * from lessons')) or die('error! Записей не найдено!');
$pages_count = ceil($count / $perpage);
if ($page > $pages_count) $page = $pages_count;
$start_pos = ($page - 1) * $perpage;
$result = mysql_query('select id,title,date,text FROM lessons limit '.$start_pos.', '.$perpage) or die('error!');
$myrow = mysql_fetch_array($result);
do {
printf ("<table class='tableborder'>
<tr>
<td><p>%s</p></td>
</tr>
<tr>
<td><p>Дата занесения: %s</p>
</td>
</tr>
<tr>
<td><p>%s</p></td>
</tr>
</table>", $myrow ["title"], $myrow ["date"], $myrow ["text"]);
}
while ($myrow = mysql_fetch_array($result));
yandex_link_bar($page, $count, $pages_count, 3);
?>

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy