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

Форум MySQL

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

 

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

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

тема: Постраничный вывод из базы данных
 
 автор: mjc66   (01.09.2007 в 17:25)   письмо автору
 
 

Добрый день! У меня возникла проблема, помогите решить ее!
Пишу сайт, дошел до постраничной навигации и здесь заглох. Использую для написания 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 полный дуб.

   
 
 автор: lifead   (01.09.2007 в 19:42)   письмо автору
 
   для: 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;?>
            '>&lt;10&lt;</a>&nbsp;&nbsp;
            <?php
    
}
    
// проверяем можно ли перелистать на 1 страницу влево
    
if(($var)>0){
            
$ad1=$adress.($var-1);
            
?>
            <a href='
            <?php echo $ad1;?>
            '>&lt;&lt;</a>&nbsp;&nbsp;
            <?php
    
}
    else { 
?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<?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>&nbsp;&nbsp;
        <?php
    
}
    
// проверяем можно ли перелистать на 1 страницу вправо
        
if($var<($st-1)){
        
$ad3=$adress.($var+1);
        
?>
        <a href='
        <?php echo $ad3;?>
        '>&gt;&gt;</a>&nbsp;&nbsp;
        <?php
        
}
    
// проверяем можно ли перелистать на 10 страницу вправо
    
if(($var+10)<=($st-1)){
        
$ad4=$adress.($var+10);
            
?>
            <a href='
            <?php echo $ad4;?>
            '>&gt;10&gt;</a>&nbsp;&nbsp;
            <?php
    
}
    
?>
    </div>
    <?php
 
}


не знаю на сколько это Вам поможет...

   
 
 автор: mjc66   (01.09.2007 в 20:01)   письмо автору
 
   для: 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 0$page2left ' <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a> | ';  
if(
$page 0$page1left '<a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a> | ';  
if(
$page <= $total$page2right ' | <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a>';  
if(
$page <= $total$page1right ' | <a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a>'

// Вывод меню  
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;  

?> 
и далее вставить Ваш вариант?

   
 
 автор: lifead   (01.09.2007 в 20:35)   письмо автору
 
   для: mjc66   (01.09.2007 в 20:01)
 

Не знаю, заметили ли Вы или нет, но при "листании" страниц появляется одна небольшая проблемка: как правильнго оформить запрос к БД, чтоб из базы доставались именно те данные, которые соответствуют следующей странице в хронологическом порядке. В связи с этим, одной функции, которую я привел, мало - необходимо написать корректно функцию вывода данных, которая будет синхронизированна с приведенной выше функцией.

> Я правильно понял, что из....
да, только не это не блок, а функция, которую можно вынестри вообще в отдельный файл. Если надо, могу подробно объяснить что и как работает, но только завтра.

   
 
 автор: mjc66   (02.09.2007 в 00:24)   письмо автору
 
   для: lifead   (01.09.2007 в 20:35)
 

Пиши завтра, я надеюсь, что проблема решится!!!

   
 
 автор: lifead   (02.09.2007 в 08:33)   письмо автору
 
   для: mjc66   (02.09.2007 в 00:24)
 

Выбираете столбец по которому будет происходить сортировка и вывод данных, у меня было 2 столбца, 'idnum' и 'id'. вот функция выборки данных из БД:

<?php
function outquery($query1$query2$kolmax$st)
//$query1 и $query2 -запросы в БД
//$kolmax - число комментариев на странице
//$st - номер страницы (для 1й страницы необходимо указать 0)
 
{
    
// отправтяем запрос в БД
    
$index_poemmysql_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_poemmysql_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";

?>

Будут вопросы по скриптам пишите

   
 
 автор: mjc66   (02.09.2007 в 16:04)   письмо автору
 
   для: 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.

   
 
 автор: lifead   (03.09.2007 в 04:19)   письмо автору
 
   для: 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)
?>

   
 
 автор: mjc66   (03.09.2007 в 05:02)   письмо автору
 
   для: lifead   (03.09.2007 в 04:19)
 

Да, я крайне заинтересован в Вашей помощи! А что же касается вывода данных то они должны выводится в хронологическом порядке.

   
 
 автор: lifead   (03.09.2007 в 07:20)   письмо автору
 
   для: mjc66   (01.09.2007 в 17:25)
 

так всетаки, первой строкой будет выводитя последняя запись или самая первая запись - самая древняя?

   
 
 автор: mjc66   (03.09.2007 в 07:26)   письмо автору
 
   для: lifead   (03.09.2007 в 07:20)
 

Самая первая с наименьшим id

   
 
 автор: mjc66   (03.09.2007 в 16:30)   письмо автору
 
   для: mjc66   (03.09.2007 в 07:26)
 

Все таму можно закрывать , проблема была в этой строке:

$page = (isset($_GET['page']));
заменил ее на эту:

$page = isset($_GET['page']) ? $_GET['page'] : 1; 
и все заработало как надо

   
 
 автор: lifead   (03.09.2007 в 20:06)   письмо автору
 
   для: mjc66   (03.09.2007 в 16:30)
 

Ну это замечательно, в принципе даже и помощь не понадобилась. :)

   
Rambler's Top100
вверх

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