PHP pagination на сайте

По мере того как данные росли потребность для pagination большого значения. Все работает отлично. У меня есть ограничение в инструкции SELECT и подсчет строк. Цель состоит в том, чтобы иметь разбиение на страницы в нижней части страницы с ограничением 10. Страница содержит последние строки в базе данных. Нужно ли мне иметь

<?php

$servername     = "localhost";
$username       = "";
$password       = "";
$dbname         = "";


$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$nr     = 0;
$count = mysql_query("SELECT count(*) AS TOTAL FROM quotes");
$row = mysql_fetch_array($sum);

$sql = "SELECT * FROM quotes ORDER BY date DESC limit 10";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    $output     = "";
    while($row  = $result->fetch_assoc() ) {
        $topic   = trim($row["topic"]);
        $quote   = trim($row["quote"]);
        $author  = trim($row["author"]);
        $id      = trim($row["id"]);

        $output .= injectNColumnWrapper(3, $nr, "container row", $nr);
        $output .="<div class='col s12 m6 l4 z-depth-1'>";
        $output .="<div class='card-panel grey darken-4 white-text center'>";
        $output .=" <h5>Citat: {$id}</h5>";
        $output .="</div>";
        $output .="<pre class='flow-text black-text' wrap='soft'>";        
        $output .="<p class='flow-text-p citat'>&#34{$quote}&#34</p>";
        $output .="<p style='font-weight:bold; class='flow-text-p author'>{$author}</p>";
        $output .="<p class='flow-text-p topic'>{$topic}</p>";
        $output .="</pre>";
        $output .="<div class='content_wrapper'>";
        $output .="<h4></h4>";
        $output .="<div class='voting_wrapper' id='vote-{$id}'>";
        $output .="<div class='voting_btn'>";
        $output .="<div class='up_button'>&nbsp;</div>";
        $output .="<span class='up_votes'>0</span>";
        $output .="</div>";
        $output .="<div class='voting_btn'>";
        $output .="<div class='down_button'>&nbsp;</div>";
        $output .="<span class='down_votes'>0</span>";
        $output .="</div>";
        $output .="<br>";
        $output .="</div>";
        $output .="</div>";
        $output .="</div>";
        $nr++;

    }
    $output    .= "</div>";
    echo $output;
}else {
    echo "0 results";
}

$conn->close();


function injectNColumnWrapper($cols_per_row, $closePoint, $cssClass="container row", $nthElem=""){
    $blockDisplay       = "";
    if( ($closePoint == 0) ){
        $blockDisplay   = "<div class='" . $cssClass . " container_nr_" . $nthElem . "'>"  . PHP_EOL;
    }else if( ($closePoint % $cols_per_row) == 0 && ($closePoint != 0) ){
        $blockDisplay   = "</div><div class='" . $cssClass . " container_nr_" . $nthElem . "'>"  . PHP_EOL;
    }
    return $blockDisplay;
}
?>

3 ответа

  1. $limit = 10;
    $start = $nr * $limit
    $sql = "SELECT * FROM quotes ORDER BY date DESC limit $start $limit";
    

    Где $nr-номер текущей страницы -1, поэтому если у вас есть страница 1, она должна быть 0,если 2, то 1 и т.д.

    Чтобы получить количество страниц, вы должны взять все результаты подсчета и сделать деление на пределе так например 100/10 = 10 страниц. Simple for loop должен отображать страницы.

  2. Используйте смещение в запросе.

    Вы можете отобразить набор ссылок на странице, затем поймать param из URL и, наконец, построить запрос с правильным смещением.

    Ссылки на страницы:

    // Note: $row['TOTAL'] comes from your counting sql (count(*))
    for ($i = 0; $i< $row['TOTAL']; $i++) {
    echo " <a href='?p=$i'>$i</a> |";
    }
    

    Получить запрошенную страницу в URL:

    $requestedPage = !empty($_GET['p']) ? intval($_GET['p']) : 0;
    

    Построение запроса:

    $pagination = 10 * $requestedPage;
    $sql = "SELECT * FROM quotes ORDER BY date DESC limit 10 OFFSET $pagination"; 
    
  3. Вы должны дать значения начала и длины (смещение), чтобы ограничить данные в MySQL для разбиения на страницы. НАПРИМЕР :

    SELECT * FROM table_name WHERE your_condition LIMIT 0,9 - to fetch first 10 records
    
    SELECT * FROM table_name WHERE your_condition LIMIT 10,19 - to fetch second set of  10 records
    

    См., например. И это дублирующий вопрос