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

Discussion in 'PHP' started by lol2006, 25 Jun 2007.

  1. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    Постараюсь передать всю суть проблемы. Имееться страница на которой отображена таблица с данными
    PHP:
    <?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-== $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
    и т.п.

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

    Плиз помогите, начинающему!
     
    #1 lol2006, 25 Jun 2007
    Last edited: 26 Jun 2007
  2. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    http://phpfaq.ru/paginator
    Check this out!
    З.Ы.:неплохо было бы,если ты юзал тег пхп для подсветки синтаксиса ;)
     
    #2 GoreMaster, 25 Jun 2007
    Last edited: 25 Jun 2007
  3. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    Если ты не заметил, вторая половина и есть имеено этот прием! Он не работает так как мне надо!!!
     
  4. ENFIX

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    на скорую руку =) Попробуй...
    PHP:
    <?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> ";
           }
    ?>
     
    2 people like this.
  5. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    Дошол вот до чего, вроде логичнее, но неполучается
    PHP:
    <?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-== $page) {
        echo 
    $i." ";
      } else {
        echo 
    '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
      }
    }
    ?>
    Помогите плиз!
     
    #5 lol2006, 25 Jun 2007
    Last edited: 26 Jun 2007
  6. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Че за муть? о_О
    PHP:
    while($row=mysql_fetch_array($res);
       
    $query2 "select * from name_d order by binary(fname)";

    Куда лимит делся?
    PHP:
    $query2 "select * from name_d order by binary(fname)";

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

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    lol2006, ты мой пробовал? Что выдало?
     
    1 person likes this.
  8. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    Это не муть, это сортировка пoля fname по алфавиту!
    Выдало пустую страницу!
     
    #8 lol2006, 26 Jun 2007
    Last edited: 26 Jun 2007
    1 person likes this.
  9. hhover

    hhover Elder - Старейшина

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

    Abra Member

    Joined:
    17 Sep 2005
    Messages:
    278
    Likes Received:
    51
    Reputations:
    29
    А теперь все что сказал выше hhover одним словом: "отладка".
    :)
     
  11. siw

    siw Member

    Joined:
    7 May 2007
    Messages:
    22
    Likes Received:
    10
    Reputations:
    0
    $page=isset($_GET['page']):$_GET['page']?0;

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

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

    PHP:
    $page=intval($_GET['page']);
    $page=((!$page)==false)? $page:0;
     
    1 person likes this.
  12. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    PHP:
    echo ++$start.". ".$row['fname']."<br>\n";
    Как здесь вывисти вот это:
    PHP:
    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>";
     
  13. ENFIX

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    PHP:
    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>"
     
  14. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    Всем огромное спасибо, все получилось, теперь прошу помощьи чуть-чуть в другом русле (уж простите решил научиться php).
    Мне нежно вывести данные из таблицы так что-бы, поле data_sm (поле дата) на странице отображало - "сегодня на нашем сайте Антон, Егор 1 месяц!" Т.Е. что бы отображал список юзеров которые зарегистрировались 1 месяц назад, полгода, год.

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

    ENFIX Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    lol2006, читай про if() и функции для работы с mysql
    А вообще бы не плохо купить книгу по пхп Желательно не наших авторов.
    Если увидишь книгу: "PHP для начинающих" авторов: Дэйв У. Мерсер, Аллан Кент, Стивен Д. Новицки, Дэвид Мерсер, Дэн Скуайер, Ван Кью Чой; Обязательно возьми ;)
     
  16. lol2006

    lol2006 Elder - Старейшина

    Joined:
    25 May 2006
    Messages:
    75
    Likes Received:
    16
    Reputations:
    0
    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. Книга адресована всем РНР-программистам.


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