partyzanx
@partyzanx

Как мне лучше сделать пагинацию для foreach?

В bd записан код:

// Получение всех статей
function get_all_bookmarks() {
    global $db;
    $bookmarks = $db->query("SELECT * FROM entries");
    return $bookmarks;
}


В контенте записан код
<div class="content is-home">
    
<?php
$bookmarks = get_all_bookmarks();
foreach ($bookmarks as $bookmarks): ?>

<?php $short_category_name = get_category_by_id($bookmarks["category_id"]); ?>
<?php $book = get_book_by_id($bookmarks["id_of_book"]); ?>

  
<div class="minientry"><a href="/i_lesson.php?id=<?php echo $bookmarks["id"];?>" class="adiv">

<span class="bookmark" id="bookmark">

<span class="title"><?php echo $bookmarks["title"];?>
</span>

<span class="structure">
<?php echo $bookmarks["structure"];?>
</span>

<span class="example">
<?php echo $bookmarks["example"];?>
</span>
</span>
</span>


</a>

<span class="sectcat"><a href="/i_book.php?id=<?php echo $book["id"];?>" class="sect"> 
    <?php echo $book["short_book_name"];?>
    
    </a><a href="/i_category.php?id=<?php echo $short_category_name["id"];?>" class="cat"> 
        
    <?php echo $short_category_name["short_category_name"];?>
    
    </a></span>

<span class="comments" onclick="location.href = '/i_lesson.php?id=<?php echo $bookmarks["id"];?>#Comments';"><span class="commentnumber">
    
    <?php echo $bookmarks["comments"];?></span></span>


<span class="datepubl"><?php echo date("m.d.Y в H:i", strtotime($bookmarks["date"]));?></span>


</div>

<?php endforeach ?>
    
   
</div>
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
$bookmarks = $db->query("SELECT * FROM entries");
foreach ($bookmarks as $bookmarks) {
  ...
  get_category_by_id()
  get_book_by_id()
  ...
}

Предположим, у вас в базе 100 закладок. Тогда вы первым запросом вытаскиваете их все, а потом запускаете перебор (foreach) и для КАЖДОЙ закладки делаете get_category_by_id() и get_book_by_id().
В итоге у вас 201 запрос. Сервер не умер, скорее всего, но ему уже поплохело.
Если закладок будет несколько тысяч - сдохнет (или прибъет этот запрос по таймауту, например).

Все это можно заменить на один запрос с join-ами (рандомный гайд), чтобы сразу получить закладки с категорией и книгой.
И можно не выбирать select * а указать limit и offset (рандомный гайд).

В итоге выборка с пагинацией выглядит как-то так:
select что-то-там from таблица
   left join другая-таблица on что-то-там
   left join еще-таблица on что-то-там
   limit 10 -- десять записей
   offset 30 -- после тридцатой

то есть будут выбраны записи с 31 по 40
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы