За последние 24 часа нас посетили 60859 программистов и 1743 робота. Сейчас ищут 989 программистов ...

Листалка

Тема в разделе "MySQL", создана пользователем -Vladimir-, 29 сен 2009.

  1. -Vladimir-

    -Vladimir- Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    139
    Симпатии:
    0
    PHP:
    1. <?php
    2. //Подключение к базе данных
    3. require_once 'db.php';
    4.  
    5. if (isset($_GET['id']) AND !empty($_GET['id']))
    6. {
    7. $view = "SELECT * FROM `info` WHERE id='".mysql_real_escape_string($_GET['id'])."'";
    8. $result = mysql_query($view);
    9. $info = mysql_fetch_array($result);
    10. }
    11.  
    12. else
    13. {
    14. //Количество выводимых записей на страницу
    15. $nums = 25;
    16.  
    17. //Запрос *.php?page=
    18. if (isset($_GET['page']))
    19. {
    20. $page = intval($_GET['page']);
    21. }
    22. else
    23. {
    24. $page = 1;
    25. }
    26.  
    27. $query = "SELECT COUNT(*) AS `id` FROM `info`";
    28. $sql = mysql_query($query) or die(mysql_error());
    29. $row = mysql_fetch_assoc($sql);
    30.  
    31. //Подсчёт количества записей, выводимых из базы
    32. $elements = $row['id'];
    33.  
    34. //Количество страниц с записями
    35. $pages = ceil($elements/$nums);
    36.  
    37. if ($page < 1)
    38. {
    39. $page = 1;
    40. }
    41. elseif ($page > $pages)
    42. {
    43. $page = $pages;
    44. }
    45.  
    46. $start = ($page-1) * $nums;
    47.  
    48. if ($start < 0) $start = 0;
    49.  
    50. //ORDER BY category DESC LIMIT - по какой переменной сортировать
    51. $query = "SELECT * FROM `info` WHERE category = '".$_GET['cat']."' ORDER BY id DESC LIMIT {$start}, {$nums}";
    52. $sql = mysql_query($query) or die(mysql_error());
    53. $con = mysql_num_rows($sql);
    54.  
    55. for ($i=0; $i<$con; $i++)
    56. {
    57. $row = mysql_fetch_assoc($sql);
    58.  
    59. //Дизайн одной записи
    60. echo " ".$row['id']." ".$row['title']." ".$row['text']." ".$row['id']." ";
    61. }
    62. ?>
    63.  
    64. Листалка страниц (здесь всё ОК)
    65. <center>
    66. <?php
    67. //Номер категории
    68. $getcat=$category;
    69.  
    70. // Вывод листалки
    71. $neighbours = 6;
    72. $left_neighbour = $page - $neighbours;
    73. if ($left_neighbour < 1) $left_neighbour = 1;
    74.  
    75. $right_neighbour = $page + $neighbours;
    76. if ($right_neighbour > $pages) $right_neighbour = $pages;
    77.  
    78. if ($page > 1) {
    79. print ' <a href="?page=1&cat=' . ($getcat) . '">Начало</a> ... <a href="?page=' . ($page-1) . '&cat=' . ($getcat) . '">Предыдущая страница</a> ';
    80. }
    81.  
    82. for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
    83. if ($i != $page) {
    84. print ' <a href="?page=' . $i . '&cat=' . ($getcat) . '">' . $i . '</a> ';
    85. }
    86. else {
    87. // выбранная страница
    88. print ' <b>' . $i . '</b> ';
    89. }
    90. }
    91.  
    92. if ($page < $pages) {
    93. print ' <a href="?page=' . ($page+1) . '&cat=' . ($getcat) . '">Следующая страница</a> ... <a href="?page=' . $pages . '&cat=' . ($getcat) . '">Конец</a> ';
    94. }
    95. }
    96. ?>
    $nums = 25; - это количество элементов, выводимых на страницу.

    $elements = $row['id']; - подсчитывает количество элементов в категории.

    $pages = ceil($elements/$nums); - подсчитаывает количество страниц для листалки.

    Но получается так, что количество страниц для определённой категории не подсчитывается, а листалка отображается исходя из общего количества данных в базе. То есть, если в общем в базе материала на 100 страниц, а в определённой категории - на 4, то листалка будет отображать 4-х нужных страницы с инфой, и 6 пустых.

    Если вместо $elements = $row['id']; подставить, например, $elements = 95;, то тогда пустых страниц нет (95/25).
    Тут вся проблема в подсчёте $elements.

    Что здесь можно придумать для подсчета элементов с определённым значением нужной переменной? (например, если $row['category'] равно 7)
     
  2. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    SELECT COUNT(*) AS `id` FROM `info` WHERE category = '".$_GET['cat']."'
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [sql]SELECT SQL_CALC_FOUND_ROWS * FROM `info` WHERE category = .... [/sql]

    [sql]SELECT FOUND_ROWS()[/sql]
     
  4. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в чем профит перед COUNT?
     
  5. -Vladimir-

    -Vladimir- Активный пользователь

    С нами с:
    20 сен 2009
    Сообщения:
    139
    Симпатии:
    0
    Спасибо, работает!
     
  6. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    работает сквозь лимиты
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    не-не, стоп. Все равно нужно же 2 запроса делать: получить по лимиту а потом все?
     
  8. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    FOUND_ROWS()

    теоретически на больших таблицах будет прирост скорости, и думаю что стоит уже сейчас рассматривать систему именно в этом ключе, а не 2 полноценных запроса!
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    на кластере не работает
    =)