Разбивка на страницы в пользовательских блогах, управляемых базой данных?

#php #mysql #sql #pagination #blogs

#php #mysql #sql #разбивка на страницы #Блоги

Вопрос:

В последнее время я возился с PHP и хотел создать свой собственный код блога. Я знаю, как выбрать из базы данных, где у меня будет таблица, предназначенная для записей.

Я просто хочу знать, как выбрать только определенные разделы таблицы на основе page переменной GET.

Извините за отсутствие какого-либо кода, но это довольно широкий вопрос, и я чувствую, что текущий код на самом деле не нужен для ответа на этот вопрос.

РЕДАКТИРОВАТЬ: я использую MySQL.

Комментарии:

1. @Purmou просто скажите нам, какую базу данных вы используете: MySQL, PostgreSQL, SQLite, … — есть небольшие различия в синтаксисе. Я выбрал MySQL, потому что он популярен.

2. @stivlo: Да, я использую MySQL.

Ответ №1:

В MySQL вы можете использовать предложение LIMIT. Предположим, что нумерация вашей страницы начинается с 1:

 $pageSize = 10;
$page = abs(intval($_GET["page"]));
if ($page < 1) {
    $page = 1;
}
$startResult = ($page - 1) * $pageSize;
$sql = "SELECT * FROM `tableName` LIMIT $startResult, $pageSize";
  

Одна очень важная вещь, которую нужно сделать при получении параметров из внешней (враждебной) среды, — это очистить ваши входные данные. Если вы не являетесь злоумышленником или веб-ботом, можете вставить любую строку в свою переменную GET page и изменить свой запрос. Это называется SQL-инъекцией. Просто загуглите это, вы найдете множество объяснений.

Теперь, поскольку мы знаем, что наша переменная страницы должна быть положительным целым числом, я сначала обработал ее с помощью intval (получение целочисленного значения переменной), а затем с помощью abs (абсолютное значение), поскольку нам нужны только положительные значения. Альтернативой является использование подготовленных инструкций (ищите PDO).

Комментарии:

1. Спасибо! Но не могли бы вы объяснить, abs() и intval() ? Я новичок в PHP, поэтому я хотел бы понять, что я изучаю.

2. @Purmou: abs возвращает абсолютное значение его ввода. intval преобразует его аргумент в целое число.

3. Что, если $_GET['page'] это 0 ? В конечном итоге вы получите результаты, начинающиеся с -10.

4. @stivlo: Спасибо за код, я попробую его завтра. Итак, вы рекомендуете мне переносить все мои GETs в intval() (пока я извлекаю номера)?

5. безусловно, и mysql_real_escape() строки, которые необходимо использовать в запросе.

Ответ №2:

     I will be like below. You have to do changes according to your code style

<?php
        /*
            Place code to connect to your DB here.
        */
        include('config.php');  // include your code to connect to DB.

        $tbl_name="";       //your table name
        // How many adjacent pages should be shown on each side?
        $adjacents = 3;

        /* 
           First get total number of rows in data table. 
           If you have a WHERE clause in your query, make sure you mirror it here.
        */
        $query = "SELECT COUNT(*) as num FROM $tbl_name";
        $total_pages = mysql_fetch_array(mysql_query($query));
        $total_pages = $total_pages[num];

        /* Setup vars for query. */
        $targetpage = "filename.php";   //your file name  (the name of this file)
        $limit = 2;                                 //how many items to show per page
        $page = $_GET['page'];
        if($page) 
            $start = ($page - 1) * $limit;          //first item to display on this page
        else
            $start = 0;                             //if no page var is given, set start to 0

        /* Get data. */
        $sql = "SELECT column_name FROM $tbl_name LIMIT $start, $limit";
        $result = mysql_query($sql);

        /* Setup page vars for display. */
        if ($page == 0) $page = 1;                  //if no page var is given, default to 1.
        $prev = $page - 1;                          //previous page is page - 1
        $next = $page   1;                          //next page is page   1
        $lastpage = ceil($total_pages/$limit);      //lastpage is = total pages / items per page, rounded up.
        $lpm1 = $lastpage - 1;                      //last page minus 1

        /* 
            Now we apply our rules and draw the pagination object. 
            We're actually saving the code to a variable in case we want to draw it more than once.
        */
        $pagination = "";
        if($lastpage > 1)
        {   
            $pagination .= "<div class="pagination">";
            //previous button
            if ($page > 1) 
                $pagination.= "<a href="$targetpage?page=$prev">« previous</a>";
            else
                $pagination.= "<span class="disabled">« previous</span>"; 

            //pages 
            if ($lastpage < 7   ($adjacents * 2))   //not enough pages to bother breaking it up
            {   
                for ($counter = 1; $counter <= $lastpage; $counter  )
                {
                    if ($counter == $page)
                        $pagination.= "<span class="current">$counter</span>";
                    else
                        $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";                 
                }
            }
            elseif($lastpage > 5   ($adjacents * 2))    //enough pages to hide some
            {
                //close to beginning; only hide later pages
                if($page < 1   ($adjacents * 2))        
                {
                    for ($counter = 1; $counter < 4   ($adjacents * 2); $counter  )
                    {
                        if ($counter == $page)
                            $pagination.= "<span class="current">$counter</span>";
                        else
                            $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";                 
                    }
                    $pagination.= "...";
                    $pagination.= "<a href="$targetpage?page=$lpm1">$lpm1</a>";
                    $pagination.= "<a href="$targetpage?page=$lastpage">$lastpage</a>";       
                }
                //in middle; hide some front and some back
                elseif($lastpage - ($adjacents * 2) > $page amp;amp; $page > ($adjacents * 2))
                {
                    $pagination.= "<a href="$targetpage?page=1">1</a>";
                    $pagination.= "<a href="$targetpage?page=2">2</a>";
                    $pagination.= "...";
                    for ($counter = $page - $adjacents; $counter <= $page   $adjacents; $counter  )
                    {
                        if ($counter == $page)
                            $pagination.= "<span class="current">$counter</span>";
                        else
                            $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";                 
                    }
                    $pagination.= "...";
                    $pagination.= "<a href="$targetpage?page=$lpm1">$lpm1</a>";
                    $pagination.= "<a href="$targetpage?page=$lastpage">$lastpage</a>";       
                }
                //close to end; only hide early pages
                else
                {
                    $pagination.= "<a href="$targetpage?page=1">1</a>";
                    $pagination.= "<a href="$targetpage?page=2">2</a>";
                    $pagination.= "...";
                    for ($counter = $lastpage - (2   ($adjacents * 2)); $counter <= $lastpage; $counter  )
                    {
                        if ($counter == $page)
                            $pagination.= "<span class="current">$counter</span>";
                        else
                            $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";                 
                    }
                }
            }

            //next button
            if ($page < $counter - 1) 
                $pagination.= "<a href="$targetpage?page=$next">next »</a>";
            else
                $pagination.= "<span class="disabled">next »</span>";
            $pagination.= "</div>n";       
        }
    ?>

        <?php
            while($row = mysql_fetch_array($result))
            {

            // Your while loop here

            }
        ?>

    <?=$pagination?>


Please make changes according to your code style
  

Комментарии:

1. Нет ли способа сократить это?

2. проверьте другой ответ, опубликованный мной

Ответ №3:

Пожалуйста, внесите изменения по мере необходимости. вы можете легко изменить стиль навигации по странице.

 <?php 
if(!empty($_GET["start"])){
    $start = $_GET['start'];// To take care global variable if OFF
}else{
    $start  = 0;
}
if(!($start > 0)) { // This variable is set to zero for the first page
    $start = 0;
}

$eu = ($start - 0);
$limit           = 5; // No of records to be shown per page.
$whathis      = $eu   $limit;
$back          = $eu - $limit;
$next          = $eu   $limit;

// to check the total number of records
$query         = mysql_query(" SELECT * FROM <tablename> ") or die (mysql_error());
$total_rows     = mysql_num_rows($query);

//select the record with limitation
$query         = mysql_query(" SELECT * FROM <tablename> limit $eu, $limit ") or die (mysql_error());

//code for previous
if($back >=0) {
echo "<a href='yourpage.php?start=$back'><font face='Verdana' size='2'>PREV</font></a>amp;nbsp;amp;nbsp;";
}

//code for the number of page with links
$i     = 0;
$x    = 1;
for($i=0;$i < $total_rows;$i=$i $limit){
if($i != $eu){
    echo "<a href='yourpage.php?start=$i'><font face='Verdana' size='2'>$x</font></a> ";
}else { 
    echo "<font face='Verdana' size='4' color=red>$x</font>";
} // Current page is not displayed as link and given font color red

$x    = $x 1;
}
//code for next
if($whathis < $total_rows) {
echo "<a href='yourpage.php?start=$next'><font face='Verdana' size='2'>NEXT</font></a>";
}    
?>