2012-03-26 20 views
0

去年我爲一個網站文件創建了一個分頁,我從來沒有真的必須再次使用它。升級PHP分頁功能運行更快

但是現在我需要在更大的應用程序中使用它,並且恐怕它不會在大量的mysql行中表現得很好,我不知道。

我會發佈一個示例波紋管,如果有人能告訴我我是否真的需要升級代碼,我會非常感激。

/* Connection file */ 
include('config.php'); 

/* Get the amount of all rows */ 
$mqc = "SELECT COUNT(*) AS total FROM table"; 
$mqe = mysql_query($mqc); 
$mqn = mysql_fetch_array($mqe); 
$total = $mqn['total']; 


/* Rows per page */ 
$perPage = 10; 

/* Range for the pagination */ 
$range = 5; 

/* Actual page */ 
$page = isset($_GET['page']) && 
      is_numeric($_GET['page']) && 
      !empty($_GET['page']) ? 
      ((int)$_GET['page'] * $range) : 0; 

/* Query */ 
$mqc = "SELECT * FROM table 
      LIMIT " . $page . ", " . $perPage . " "; 
$mqe = mysql_query($mqc); 

/* Show results */ 
while($l = mysql_fetch_object($mqe)) 
{ 
    echo $l->id . ' - ' . $l->title . '<br />'; 
} 

/* Function for pagination */ 
function pages($total = false, $perPage = false, $page = false, $range = false) 
{ 
    /* Number of pages */ 
    $totalPages = (ceil($total/$perPage)) - 1; 
    /* The range * 2 */ 
    $range = $range; 
    /* The real param $_GET['page'] */ 
    $realGetPage = !empty($page) ? ($page/$range) : 0; 

    /* Show the first page */ 
    if($realGetPage >= 7) 
    { 
     echo ' <a href="?page=0"> 1 </a> ... '; 
    } 

    /* Loop to create the range */ 
    for($i = ($realGetPage - $range); $i < ($range + $realGetPage); $i++) 
    { 
     /* Check out if the value isn't outta range */ 
     if($i > 0 && $i < $totalPages) 
     { 
      /* Highlight the actual page */ 
      if(($i - 1) == $realGetPage) 
      { 
       echo ' [ <a href="?page=' . ($i - 1) . '"> ' . $i . ' </a> ] '; 
      } 
      else 
      { 
       echo ' <a href="?page=' . ($i - 1) . '"> ' . $i . ' </a> '; 
      } 
     } 

     /* Store the number of the last page */ 
     $lastPage = ($i + 1); 
    } 

    /* Hack to show 5678910 */ 
    if($lastPage < ($range * 2) + 1) 
    { 
     for($j = $lastPage; $j <= ($range * 2); $j++) 
     { 
      if(($j - 1) == $realGetPage) 
      { 
       echo ' [ <a href="?page=' . ($j - 1) . '"> ' . $j . ' </a> ] '; 
      } 
      else 
      { 
       echo ' <a href="?page=' . ($j - 1) . '"> ' . $j . ' </a> '; 
      } 
     } 

    } 

    /* Last page */ 
    echo ' ... <a href="?page=' . $totalPages . '"> ' . $totalPages . ' </a> '; 
} 

/* Show the pagination */ 
pages($total, $perPage, $page, $range); 

您怎麼看?

+1

這看起來像大多數分頁我見過。你有什麼特別的擔憂嗎? – Tchoupi 2012-03-26 03:01:18

+0

我不知道,我從來沒有用過大量的應用程序......我認爲它會超過一百萬行,還有很多其他的大型表......所以我會一起選擇使用INNER和東西像這樣,你知道.. – Foreba 2012-03-26 03:07:23

回答

1

我看到丟失的主要東西是ORDER BY子句。沒有這個,你的分頁結果(可能)是不可預測的。

添加ORDER BY子句並確保在可排序列上具有適當的數據庫索引。

我還建議使用預處理語句和綁定參數切換到更新的數據庫連接庫。請參閱PDO

+0

我現在正在改變...... – Foreba 2012-03-26 03:34:02

2

根據您在評論中提供的信息,您可能遇到的性能問題將不會來自您的PHP腳本。如果你在巨大的桌子上做多個INNER JOINS,這正是會影響你的表現。一些重要的事情,尋找:

  • 表的索引(如果您使用的過濾器,爲您的加入,如果你不上主鍵連接)
  • 優化您的表/查詢,以減少數量的JOIN的
  • 如果您期望很多流量,請考慮使用緩存進行查詢(例如memcached)
  • 正如Phil提到的,ORDER BY必須用於呈現可預測的結果,並且可以在使用表時減慢查詢速度。你可以預先渲染使用cron作業
  • 有序的表考慮使用非規範化的人數減少的JOINS
+0

好吧,非常感謝......我會記住,當我創建腳本時...... – Foreba 2012-03-26 03:36:16