|
|
|
| Добрый день! У меня возникла проблема, помогите решить ее!
Пишу сайт, дошел до постраничной навигации и здесь заглох. Использую для написания PHP и MySQL. Суть такая: имею базу данных, из нее нужно вигрузить например 50 строк и внести на страницу, потом еще 50 и внести на вторую страницу и так далее. Должно выйти что-то подобное: << <1|2|3...|n> >>
Нашел готовый скрипт, запустил работает, выводит страницу на ней 50 строк и внизу 1|2|3...|n> >>. Но когда я перехожу на 2 страницу то мне сообщает что такой страницы нету. Так вот вопрос как сделать чтобы эта страница автоматически создавалась и на ней выводились следующие 50 пунктов базы данних? Заранее благодарный, помогите новичку!
Источник из которого брал скрипт:http://softtime.ru/info/articlephp.php?id_article=33
P.S. Думаю, что последний блок этого скрипта нужно подстроить под себя, а не тупо скопировать, но что и где конкретно надо поменять незнаю т.к. в PHP полный дуб. | |
|
|
|
|
|
|
|
для: mjc66
(01.09.2007 в 17:25)
| | я эту проблему для себя решил следующим образом:
<?php
function listing($id,$ad,$st,$var,$kolmax)
//$id- номер произведения
//$ad- путь файла
//$st- сколько всего коментариев в шт.
//$var- указатель положения "бегунка"
{ //составляем адресную строку к которой в дальнейшем будет дополнение
$adress=$ad."?id=".$id."&var=";
//формируем строку отображающую "листатель"
?>
<div align=left>
Страница комментариев:
<?php
// проверяем можно ли перелистать на 10 страниц влево
if(($var-10)>=0){
$ad=$adress.($var-10);
?>
<a href='
<?php echo $ad;?>
'><10<</a>
<?php
}
// проверяем можно ли перелистать на 1 страницу влево
if(($var)>0){
$ad1=$adress.($var-1);
?>
<a href='
<?php echo $ad1;?>
'><<</a>
<?php
}
else { ?> <?php }
//смотрим на сколько страниц можно сдвинуть "листатель" вправо
switch ($var) {
case 0:$s=0;break;
case 1:$s=0;break;
case 2:$s=0;break;
case 3:$s=0;break;
case 4:$s=0;break;
case 5:$s=1;break;
default:$s=$var-4;break;
}
//определяем диапазон выводимых страниц комментария
$st1=($st-1)%$kolmax;
$st=$st-$st1;
$st=(int)($st/$kolmax);
//выводим список допустимых страниц
for ($i=$s;(($i<=$st)and($i<=$s+$st));)
{
$ad2=$adress.$i;
?>
<a href='
<?php echo $ad2;?>
'><?php echo(++$i);?></a>
<?php
}
// проверяем можно ли перелистать на 1 страницу вправо
if($var<($st-1)){
$ad3=$adress.($var+1);
?>
<a href='
<?php echo $ad3;?>
'>>></a>
<?php
}
// проверяем можно ли перелистать на 10 страницу вправо
if(($var+10)<=($st-1)){
$ad4=$adress.($var+10);
?>
<a href='
<?php echo $ad4;?>
'>>10></a>
<?php
}
?>
</div>
<?php
}
|
не знаю на сколько это Вам поможет... | |
|
|
|
|
|
|
|
для: lifead
(01.09.2007 в 19:42)
| | Я правильно понял, что из первоначального скрипта нужно вырезать этот блок:
<?php
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
| и далее вставить Ваш вариант? | |
|
|
|
|
|
|
|
для: mjc66
(01.09.2007 в 20:01)
| | Не знаю, заметили ли Вы или нет, но при "листании" страниц появляется одна небольшая проблемка: как правильнго оформить запрос к БД, чтоб из базы доставались именно те данные, которые соответствуют следующей странице в хронологическом порядке. В связи с этим, одной функции, которую я привел, мало - необходимо написать корректно функцию вывода данных, которая будет синхронизированна с приведенной выше функцией.
> Я правильно понял, что из....
да, только не это не блок, а функция, которую можно вынестри вообще в отдельный файл. Если надо, могу подробно объяснить что и как работает, но только завтра. | |
|
|
|
|
|
|
|
для: lifead
(01.09.2007 в 20:35)
| | Пиши завтра, я надеюсь, что проблема решится!!! | |
|
|
|
|
|
|
|
для: mjc66
(02.09.2007 в 00:24)
| | Выбираете столбец по которому будет происходить сортировка и вывод данных, у меня было 2 столбца, 'idnum' и 'id'. вот функция выборки данных из БД:
<?php
function outquery($query1, $query2, $kolmax, $st)
//$query1 и $query2 -запросы в БД
//$kolmax - число комментариев на странице
//$st - номер страницы (для 1й страницы необходимо указать 0)
{
// отправтяем запрос в БД
$index_poem= mysql_query($query1);
$num = mysql_num_rows ($index_poem) ;
if ($num>0)
{
//выведение номеров комментариев в массив
for ($i=0; $i<$num; $i++)
{
$row = mysql_fetch_array($index_poem);
//записываем все номера комметарие соответствующих заданному id
$id_number[]=$row['idnum'];
}
//Определение длины массива в переменную $k1
$k1=count($id_number);
//$i=0; do{ if (isset($id_number[$i])==true){ $k1=$i;}$i++;}while ($i<1000);
//обратная сортировка массива
rsort($id_number);
//============= формируем вывод данных================
///отправляем запрос в БД для поиска необходимых комметариев
////определяем диапазон выводимых комментариев
//определяем первый комментарий в диапазоне
$kol1=(int)$kolmax*$st;
//составляем запрос в БД
$str=" idnum=".$id_number[$kol1];
for ($i=(1+$kol1);($i<($kolmax+$kol1))and($i<($k1)); )
{$str=$str." or "."idnum=".$id_number[$i];$i++;}
$query2=$query2.$str;
//отправляем сформированный запрос в БД
$index_poem= mysql_query($query2);
//определяем колличество строк выданных запросом
$num = mysql_num_rows ($index_poem) ;
//формируем двоичный массив для вывода
//(это необходимо чтобы отображались комментарии сверху вниз)
for ($i=0; $i<=$num;)
{
$row = mysql_fetch_array($index_poem);
$m['name_kom'][$i]=$row['name_kom'];
$m['name_kom'][$i]=StripSlashes($m['name_kom'][$i]);
$m['komment'][$i]=$row['komment'];
$m['komment'][$i]=StripSlashes($m['komment'][$i]);
$m['email_kom'][$i]=$row['email_kom'];
$m['email_kom'][$i]=StripSlashes($m['email_kom'][$i]);
$m['date_kom'][$i]=$row['date_kom'];
$i++;
}
//формируем таблицу для комментарием
?>
<table border=0 width=100%>
<?php
//формируем запрос к вышеобразованному массиву
for ($i=$num; $i>=0;$i--)
{ //Выводим данные на экран в виде таблицы
?> <tr>
<td width=15%><?php echo $m['name_kom'][$i]; ?></td>
<td colspan=2><?php echo $m['komment'][$i];?></td>
</tr>
<tr>
<td> </td>
<td> <h6> <?php echo $m['email_kom'][$i]; ?> </h6></td>
<td> <h6><?php echo $m['date_kom'][$i];?> </h6></td>
<tr><td colspan=3 width=70%> <HR SIZE=1 WIDTH=100%> </td></tr>
</tr>
<?php
}
?> </table><?php
}
}
?>
|
сами запросы к БД у меня выглядят:
<?php
$query1="SELECT `id_poem`,`idnum` FROM `имя_таблицы` WHERE id_poem=".$_GET['id'];
$query2="SELECT * FROM `имя_таблицы` WHERE";
?>
|
Будут вопросы по скриптам пишите | |
|
|
|
|
|
|
|
для: lifead
(02.09.2007 в 08:33)
| | Хочу внести некоторую ясность в то как у меня в настоящий момент обстоит дело. Вот код файла conclusion_sss.php который осуществляет вывод из БД:
<?php
// Устанавливаем соединение с базой данных
include "config_mysql.php";
//переменная
$group_production = (isset($_GET['group_production']))?$_GET['group_production']:'ГСО(Государственные Стандартные Образцы)';
?>
<style>
.cell_1{background:99FFCC}
.cell_2{background:FFFFCC}
</style>
<table border='1' cellspacing='1' cellpadding='1' class='3'>
<tr>
<td class='3' align='center'>
<b>Наименование товара</b>
</td>
</tr>
<?php
// Переменная хранит число товарных позиций выводимых на странице
$num = 50;
// Извлекаем из URL текущую страницу
$page = (isset($_GET['page']));
// Определяем общее число товарных позиций в базе данных
$result = mysql_query("SELECT COUNT(*) FROM tovary");
$result = mysql_fetch_row($result);
// Находим общее число страниц
$total = intval(($result[0] - 1) / $num) + 1;
// Определяем начало товарных позиций для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить товарные позиции
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM tovary WHERE group_production = 'ГСО(Государственные Стандартные Образцы)' LIMIT $start,$num");
// В цикле переносим результаты запроса в массив
$i = 0;
while ($arResult = mysql_fetch_array($result)):
$i++;
?>
<tr class='cell_<?=($i%2)+1;?>'>
<td>
<?=$arResult['name'];?>
</td>
</tr>
<?endwhile;?>
</table>
<?php
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page?page=><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page='>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
|
Как видно запрос ведется к одному столбцу 'group_production' . Т.е. при наличие свыше 250 строк в этом столбце (но менее 300) и при условии по 50 строк на страницу должно получиться 6 страниц. Эти страницы у меня имеются:
/State_Standard_Samples.php
/State_Standard_Samples2.php
/State_Standard_Samples3.php
/State_Standard_Samples4.php
/State_Standard_Samples5.php
/State_Standard_Samples6.php
Так вот при подключении conclusion_sss.php на каждую из них я имею результат-везде первые 50 строк столбца 'group_production' и плюс к этому одинаковую панель навигации 1|2|3|> >>, где активна только 1страница.
Меня терзают смутные сомнения относительно необходимости наличия:
/State_Standard_Samples2.php
/State_Standard_Samples3.php
/State_Standard_Samples4.php
/State_Standard_Samples5.php
/State_Standard_Samples6.php
Но в таком случае надо что-то изменить в блоке
<?php
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page?page=><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page='>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
|
Но что? Я слабо понимаю в php. | |
|
|
|
|
|
|
|
для: mjc66
(02.09.2007 в 16:04)
| | Написано все хорошо, с несколькими но:
1) php плохо работает с функцией деления "/", что может являтся причиной многих недаразумений, может изза этого у Вас и не работал скрип.
2) у меня вызывают вопросы в правильности написания подойбной строки, там кавычки неправильно расставлены, но это не суть важно
<?php // Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page='>>></a>'; ?>
|
3)> Меня терзают смутные сомнения относительно необходимости наличия:
Вы правы, нет надобности создавать такое большое число страниц/
Но если честно легче написать новый скрипт который будет ормировать запросы и выводить их на страницу.
Если желаете могу поэтапно объяснить, что зачем следует в написании скрипта.
Для начала необходимо уточнить в каком порядке Вам необходим вывод данных в хронологическом порядке (на первой странице должны отображаться записа с 1й по 50ю или с последней - n по (n-50)).
Предлагаю попробовать использовать мою функция со следующими параметрами
<?php
$st=270;//это сколько всего поззиций;
$kolmax=50; //сколько позиций на одной странице
/*переменная $ad отвечающая за адрес на которую будет перенаправлена страниза после нажатия ссылки*/
/* переменная $var берется из массива $_GET['']
например в строке http://www.имя_сайта.ru?var=1 $ad='http://www.имя_сайта.ru'; а $var=$_GET['var'] */
listing(1,$ad,$st,$var,$kolmax)
?>
|
| |
|
|
|
|
|
|
|
для: lifead
(03.09.2007 в 04:19)
| | Да, я крайне заинтересован в Вашей помощи! А что же касается вывода данных то они должны выводится в хронологическом порядке. | |
|
|
|
|
|
|
|
для: mjc66
(01.09.2007 в 17:25)
| | так всетаки, первой строкой будет выводитя последняя запись или самая первая запись - самая древняя? | |
|
|
|
|
|
|
|
для: lifead
(03.09.2007 в 07:20)
| | Самая первая с наименьшим id | |
|
|
|
|
|
|
|
для: mjc66
(03.09.2007 в 07:26)
| | Все таму можно закрывать , проблема была в этой строке:
$page = (isset($_GET['page']));
| заменил ее на эту:
$page = isset($_GET['page']) ? $_GET['page'] : 1;
| и все заработало как надо | |
|
|
|
|
|
|
|
для: mjc66
(03.09.2007 в 16:30)
| | Ну это замечательно, в принципе даже и помощь не понадобилась. :) | |
|
|
|