2013-07-25 30 views
3

PHP/MySQLi中分頁的最小值是多少?我在網上搜索過,並試圖學習如何做分頁,但所有的例子都很大,所以我想知道最低是什麼,所以我可以從那裏開始,然後以我的方式理解它們。先謝謝了。最小的分頁?

我試過的地方(例子不是我看過的所有例子); https://github.com/BenGriffiths/pdo-mysqli-pagination; http://bluedogwebservices.com/php-pagination-with-mysqli/;

第一個是非常長的(看起來),但它對我來說是有意義的,第二個是短,但對我來說沒有意義,我還沒有尋找視頻教程,所以我要去也搜索這些。

+0

好的分頁不是一個難題,它只是相當複雜,因此任何教程都會感覺很大。你能鏈接到你發現的一些你感興趣的特定文章/教程嗎?這可能會讓人們更容易幫助完善答案。 – AgmLauncher

+0

我添加了兩個我看過的例子。 – user2565624

回答

2

分頁比較簡單,我會嘗試用最簡單的方式描述它。

要開始與這裏有5項或短語(或參數),你將在大多數分頁情況下遇到:

  • 限制(或每頁結果)
  • 偏移(從哪裏開始設置從結果/記錄)
  • 當前頁
  • 總結果頁

以下面的例子中查詢:

SELECT * FROM products WHERE active = 1 LIMIT 0 , 25 

在上面的SQL(它應該的mysqli工作):

  • 25 =>是限制(或每頁的結果)
  • 0 =>偏移量(i。E從結果或記錄0)

換算成開始,

give me the results 0 - 24, i.e. the first 25 results 

因此,假設你有一個產品表1000分的記錄,你需要在網頁上只顯示25條記錄顯示這些每頁:關於第一個頁面這些將是5個以上方面的值:

  • 限制(每頁的結果)=> 25
  • 偏移=> 0
  • 當前頁面=> 1
  • 總計結果=> 1000
  • 頁數=>總結果/極限=> 40

一般的偏移量來計算動態基於當前頁和限制上,所以第1頁您的產品的結果,偏移將等於:

offset = (current page * limit) - limit 
i.e. (1 * 25) - 25 = 0 

所以你mysqli的查詢是:

SELECT * FROM products WHERE active = 1 LIMIT [OFFSET] , [LIMIT] 

i.e. SELECT * FROM products WHERE active = 1 LIMIT 0 , 25 

使用相同的原則,爲您的產品的結果的第2頁,偏移(或者開始從結果)將是:

offset = (current page * limit) - limit 
i.e. (2 * 25) - 25 = 25 

所以你mysqli的查詢是:

SELECT * FROM products WHERE active = 1 LIMIT [OFFSET] , [LIMIT] 

i.e. SELECT * FROM products WHERE active = 1 LIMIT 25 , 25 

它轉換成,

give me the results 25 - 49, i.e. the next 25 results starting from record 25 

其他條款將具有以下值:

  • 限制(每頁或結果)=> 25
  • 當前頁=> 2
  • 總計結果=> 1000
  • 頁數=> 40

在大多數簡單的用 - 分頁的情況下,唯一改變的參數是偏移量和當前頁面。如果您在查詢中引入了過濾器,那麼除了前者2之外,總結果和頁數也可以更改。

我希望上面的解釋有助於爲您提供對分頁的基本理解。

+0

謝謝。我相信在網上使用這個和一個例子,我可以爲我的網站創建自己的分頁。這是非常感謝,正是我所期待的。 – user2565624

+0

沒問題。很高興我能幫上忙... – newbie

-2

我們將使用$ _GET腳本中的頁面信息。

<? 
if(isset($_GET['page'])) { 
$page = htmlspecialchars(mysql_real_escape_string($_GET['page'])); 
} 
else { 
$page = 1; //We'll assume that if the $_GET isn't present, the first page will be shown. 
} 
$perpage = 25; //Number of items per page 
$first = (($page-1)*$perpage); //Basically gets the first row of the page. 
$q = mysql_query("SELECT * FROM table ORDER BY id ASC LIMIT $first, $perpage"); 
while($row = mysql_fetch_array($q)) { 
//Put your output here 
} 

//Now, we can put our page navigator 

$i = 1; 
$count = mysql_num_rows(mysql_query("SELECT `id` FROM table")); 
$num = ceil($count/$perpage); 
while($i <= $num) { 
echo "<a href='/page/".$i."'>".$i."</a> "; 
$i++; 
?> 
+0

爲什麼每個人都在使用MySQL?我認爲這是貶值?我確實說過MySQLI,所以請不要放一個MySQL的答案,謝謝。並感謝你試圖幫助我。 – user2565624

3

由於事實上,數據庫已經沒有太大的做分頁算法。無論使用哪種數據庫或數據庫驅動程序,或者甚至根本不涉及數據庫,這都是一樣的。如你將在下面看到的,數據庫操作只需要2次調用,使用safeMysql abstraction library(儘管你可以使用任何你喜歡的東西)。
從數據庫中我們將需要數據本身和記錄總數。

爲了獲得這些,我們將使用兩個MySQL功能:

  • SQL_CALC_FOUND_ROWS/FOUND_ROWS()獲得行的總數
  • LIMIT子句來限制選擇的數據量,

要顯示頁面的鏈接,您需要知道當前頁面和總頁數。

<?php 
include 'safemysql.class.php'; 
$db = new safeMysql(); 

$per_page = 10; 

//let's get the page number 
$cur_page = 1; 
if (isset($_GET['page']) && $_GET['page'] > 0) 
{ 
    $cur_page = $_GET['page']; 
} 

// then define starting record 
$start = ($cur_page - 1) * $per_page; 

//now let's get the data and total number of rows 
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM Board LIMIT ?i, ?i"; 
$data = $db->getAll($sql, $start, $per_page); 
$rows = $db->getOne("SELECT FOUND_ROWS()"); 

//and total number of pages. 
$num_pages = ceil($rows/$per_page); 

//we have to define this variable to display list of pages 
$page = 0; 
include 'template.tpl.php'; 

現在,只要我們有我們所有的數據準備好了,我們可以讓出來,使用本機PHP作爲模板

Records found: <b><?=$rows?></b><br><br> 
<? foreach ($data as $row): ?> 
    <?=++$start?>. 
    <a href="?id=<?=$row['id']?>"> 
     <?=$row['title']?> 
    </a> 
    <br> 
<? endforeach ?> 

<br> 
Pages: 
<? while ($page++ < $num_pages): ?> 
    <? if ($page == $cur_page): ?> 
     <b><?=$page?></b> 
    <? else: ?> 
     <a href="?page=<?=$page?>"><?=$page?></a> 
    <? endif ?> 
<? endwhile ?> 

然而,這確實是最低限度的,包括沒有像減少顯示的頁面數量和支持額外的WHERE參數這樣的基本部分。