За последние 24 часа нас посетили 21600 программистов и 1017 роботов. Сейчас ищут 675 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Дато, 30 сен 2022.

  1. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    Добрый день всем. подскажите первый раз делаю постраничный вывод и не совсем соображу как это сделать код следующий:
    PHP:
    1. $link = new mysqli("localhost", "root", "", "rbphp");
    2.        if (!$link) {
    3.            die('Ошибка соединения: ' . mysql_error());
    4.        }
    5.        echo "успешно";
    6.  
    7. // Получаем запрос поиска
    8. $inputSearch = $_POST["name"];
    9.  
    10. // Создаём SQL запрос
    11. $title = "SELECT * FROM catalog WHERE type = '$inputSearch'";
    12. $result = $link -> query($title);
    13.  
    14.  
    15.  
    16.  
    17. //----------------------------------------//
    18. foreach ($result as $item){
    19.   echo '<tr>';
    20.   echo '<th scope="row">'.$item['title'].'</th>';
    21.   echo '<td>'.$item['size'].'</td>';
    22.   echo '<td colspan="3">'.$item['stamp'].'</td>';
    23.   echo '<td><a type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap"">Заказать<i class="fa fa-shopping-cart"></i></a></td>';
    24.   echo '</tr>';
    25. }
    вывод работает, из базы данных, все четко, но как сделать постраничный вывод?
    соединение с html идет средством ajax. Буду благодарен если подскажите как это сделать или даже ссылку где почитать, ничего похожего в инете я не нашел.
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Пагинатор, это не простое задание, я сделал с помощью limit и offset и и потом уже сформировал его с помощью php
    https://github.com/Div-Man/simple-crud-mvc-php/blob/master/src/MyProject/Services/Pagination.php
    --- Добавлено ---
    Сначала научись выводить определённое количество записей из БД и потом уже придумать, как сделать страницы.
     
  3. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    PHP:
    1. $title = "SELECT * FROM catalog WHERE type = '$inputSearch' LIMIT 4";
    2. // или так
    3. $limit = 6;
    4. $title = "SELECT * FROM catalog WHERE type = '$inputSearch' LIMIT $limit";
    вот и вывод 4 или 6 записей из бд после поиска.
    спасибо конечно
    но вот с ООП не дружу пока.
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    ООП для новичка и не нужно, оно будет только мешать.
     
  5. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    Так весь твой код по ссылке выше такой
     
  6. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
  7. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    От души, спасибо, почитаю.
     
  8. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    там про классы и объекты неплохо рассказано
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    :D

    Основы: Как сделать пагинацию? И что-то похожее на продолжение: Как сделать вывод списка статей?

    Более причесанный вариант с MVC, исключениями и т.п. есть в этой статье: Блог на G-Drive (контроллер оборачиваете в try/catch, а в query генерите исключение).
    --- Добавлено ---
    P.S. На фильтрацию по категории не обращайте внимания. Без фильтрации контроллер будет выглядеть примерно так:
    PHP:
    1. $pp = 5;
    2.  
    3. $pc = articles\pagecount($pp);
    4.  
    5. rotate01();
    6. if ($pn == 0 || $pn > $pc)
    7. {
    8.   error(404);
    9.   return;
    10. }
    11.  
    12. $result = articles\page($pn, $pp, ['date' => ORDER_DESC]);
    Ну, и формулы для $first/$last можно сюда же добавить.
     
  10. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    не знаю правильно или нет получилось следующее
    PHP:
    1.   $title = "SELECT * FROM catalog";
    2.   $result = $link -> query($title);
    3.  
    4.   $limit = 20;
    5.   $page = array();
    6.  
    7.   $page = $_GET['page'];
    8.   $product =array();
    9.  
    10.   foreach ($result as $key) {
    11.       $product[] = $key;
    12.   }
    13.  
    14.   $page_count = floor(count($product)/$limit);
    и вывод страниц тут не могу сообразить как сделать так чтоб после перебора всего массива не выдавал ошибку Warning: Undefined array key 21 in C:\путь.php on line 248
    PHP:
    1. <?php for($i=$page*$limit; $i<($page+1)*$limit; $i++) :?>
    2.                                            <?php if($product[$i] == NULL):?>
    3.                                                <?php break;?>
    4.                                                <?php endif;?>
    5.                                                  <tr>
    6.                                                  <th scope="row"><?php echo $product[$i]["title"];?></th>
    7.                                                  <td><?php echo $product[$i]["size"];?> </td>
    8.                                                  <td colspan="3"> <?php echo $product[$i]["stamp"];?> </td>
    9.                                                  <td><a type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap">Заказать<i class="fa fa-shopping-cart"></i></a></td>
    10.                                                  </tr>
    11.                                                <?php endfor;?>
    и как добавить стили активной кнопке после нажатия
    PHP:
    1. <?php for($p=0; $p<=$page_count; $p++) :?>
    2.                                                 <li class="page-item"><a class="page-link "  href="?page=<?php echo $p;?>"><?php echo $p+1;?></a></li>
    3.                                                   <?php endfor;?>
     
  11. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не совсем.
    Вы извлекаете всю таблицу, Помещаете её в массив. И дальше обрабатываете её как массив
    Тем самым сводя на нет все преимущества базы данных.
    С тем же успехом ваша таблица могла бы храниться и в файле на диске.
    Возможно, стоит сначала потренироваться на файле? Чисто чтобы получить навык.
    Или все таки хотите сразу работать с базой?
     
  12. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    хочется сразу с базой данных работать, ну тут и с циклом for беда. не соображу как тормознуть его в нужный момент))))
     
  13. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Тогда алгоритм примерно такой.
    1. Получить номер страницы из $_GET или $_POST, и сразу отформатировать его в положительное целое число. Если номера нет или он меньше 1, установить его по умолчанию в 1.
    2. С помощью мультизапроса передать через ; два запроса - на извлечение общего количества строк в таблице, и собственно сами строки начиная со смещения(предварительно преобразованного из полученного номера страницы) с заданным лимитом. Как это делается можно посмотреть в phpMyAdmin, просто открыв в нем таблицу. Кстати, рекомендую использовать тот же синтаксис, что и в PMA
    3. Извлечь из первой части мультизапроса общее количество строк в таблице в переменную.
    4. Если вторая часть мультизапроса содержит какие-то данные, то вывести их в нужном формате, если их там нет то выдать сообщение об этом.
    5. С помощью переменной с общим количеством строк и переменной содержащей номер текущей страницы сгенерировать ссылки на соседние страницы, если они есть, и на прочие страницы, если это нужно.

    Если что-то будет непонятно, то задавайте конкретные вопросы.
     
    #13 Drunkenmunky, 4 окт 2022
    Последнее редактирование: 4 окт 2022
  14. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    вот что получилось, все работает. но выводит только первые 20 позиций.
    если убрать из sql запроса LIMIT то показывает все. как правильно сформировать запрос? чтот ни как не пойму
    PHP:
    1. $page = isset($_REQUEST['page']) ? abs($_REQUEST['page']):0;
    2.  
    3. $limit = 20;
    4. $product =array();
    5.  
    6. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    7. $link = mysqli_connect("localhost", "root", "", "rbphp");
    8.  
    9. $query = "SELECT count(*) FROM catalog;";
    10. $query .= "SELECT * FROM catalog LIMIT $page,$limit";
    11.  
    12. mysqli_multi_query($link, $query);
    13. do {
    14.  
    15.     if ($result = mysqli_store_result($link)) {
    16.         while ($row = mysqli_fetch_row($result)) {
    17.          
    18.             $page_c=$row[0];
    19.         }
    20.     }
    21. } while (mysqli_next_result($link));
    22.  
    23. $page_count = floor($page_c/$limit); //колличество страниц
    24.  
    25. foreach ($result as $key) {
    26.              $product[] = $key;
    27.        }
     
  15. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    исправил изминением части кода. получилось следующее
    PHP:
    1. $page = isset($_REQUEST['page']) ? abs($_REQUEST['page']):0;
    2. if($page<1){
    3.   $page=1;
    4. }
    5.  
    6. $limit = 20;
    7. $page_t =($page*$limit)-$limit;
    8.  
    9. $product =array();
    10.  
    11. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    12. $link = mysqli_connect("localhost", "root", "", "rbphp");
    13.  
    14. $query = "SELECT count(*) FROM catalog;";
    15. $query .= "SELECT * FROM catalog LIMIT $page_t,$limit";
     
  16. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это вопрос?
     
  17. Дато

    Дато Новичок

    С нами с:
    11 ноя 2021
    Сообщения:
    47
    Симпатии:
    0
    Больше констатация факта, что все работает. Спасибо за помощь.
    Но если есть ошибки, просьба указать на них.
     
  18. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    А смысл?
    Судя по коду, вы игнорируете выданные рекомендации. Смысл лезть с советами?
    Если что-то конкретное непонятно, то спросите.