2010-03-08 60 views
4

我是新手,對導航有疑問。 什麼是各種方法,可以實現「第一個」,「上一個」,「下一個」和「最後」導航,如在文章或漫畫網站中看到的? (誠​​然,「第一」鏈接不會讓人困惑,因爲它可以保持靜態,但其他鏈接怎麼樣?) 例如,在第50頁上,鏈接將適當地導向第49和第51(如果它存在,如果不存在它會不起作用,但當這樣的頁面存在時,它會自動變爲活動狀態 在大多數這樣的例子中,我看到的URL以「.php?id = 50」結尾,但我不確定它是如何實現的,使用數據庫? Any幫助將是非常讚賞,感謝實現第一次,上一次,下一次和最後一次導航的方法

回答

4

URL末尾的位稱爲GET變量。當用戶進入到一個頁面與一個在末端,例如:

example.org/comics/myawesomecomic.php?page=50 

服務器進入該網頁,(通常)的服務器端腳本的頁面輸出給用戶之前都會做一些工作。在PHP中,GET變量是一個全局變量(與其他人一樣,大的變量是POST和COOKIE),php腳本可以通過從服務器傳遞給腳本來獲取值,在本例中爲$_GET['page']

因此,假設您有一個腳本來處理漫畫故事情節「My Awesome Comic」的所有請求並將其分解爲60頁,則用戶必須執行的任何操作才能將頁面的GET變量更改爲頁面數。您的腳本可能會執行一些非常簡單的操作,例如獲取名爲myawesomecomic/的目錄的內容並獲取名爲50.html的文件,然後將其輸出給用戶。但有可能的是,自從遇到這種麻煩以後,您希望有更復雜的東西,所以它會從數據庫中抓取第50頁並更新所有的導航,甚至可能會在頂部引發一個時尚的50 - 60

現在,這裏是簡單的部分,也就是你的問題的答案。現在你知道如何GET變量工作和服務器腳本做他們的東西,你必須做的,使導航像你描述的是:

$current_page = $_GET['page']; 
$next_page = $current_page + 1; 
$prev_page = $current_page - 1; 
$first_page = 1; 
$last_page = 

這最後一部分將是由你來已經知道了。您可以始終擁有相同數量的頁面,也可以在拉起當前頁面的同時查詢數據庫,等等。假設您在獲取當前頁面時曾查詢數據庫的總頁數。它返回60(和我們假設,只是爲了避免頭疼的是60的頁面數從1開始,而不是0),所以回導航...

$last_page = 60; 

現在,你有你的第一個,最後一個,prev和下一個。假設你知道你周圍的HTML的方式,所有剩下的(除了使這個看起來很漂亮)是:

echo " 
<a href='myawesomecomic.php?page=$first_page'>First Page</a> 
<a href='myawesomecomic.php?page=$prev_page'>Previous Page</a> 
<a href='myawesomecomic.php?page=$next_page'>Next Page</a> 
<a href='myawesomecomic.php?page=$last_page'>Last Page</a> 
"; 

而且還有您的導航。顯然你會想要安排他們適合你的網站,不要讓他們像這樣一起跑,使用酷箭頭等等。但即使你沒有做任何事情,鏈接也能工作。

但是!

我剛給你真正好,「我第一次玩PHP」的版本。事情我離開了(你應該問更多的還是做一些認真的研究):

  • 由於GET變量包括對URL,他們不是很難搞清楚。我可以很容易地將?page=50更改爲?page=1=1,根據您獲取內容的方式,我可能只是要求提供數據庫的所有內容。 永不將用戶輸入(甚至URL)直接插入到變量中。如果你知道這是頁碼,那麼你知道這是一個數字。在通過腳本和數據庫運行之前檢查輸入以確保它是一個數字。

  • 如果用戶輸入數字並且超出範圍,您需要有一個系統。一些簡單的「對不起,頁面未找到」,甚至「從一開始就沒有找到頁面」,然後將它們發送回第1頁,無論如何。如果你只輸出一些東西,它看起來很糟糕,你會發現你的腳本中可能被操縱的邏輯部分。

  • 當您對GET變量感到滿意時,我建議將它們切換爲mod_rewrite(假設您位於apache服務器上)。現在不要跳進來,但是當你掌握它的時候,你可以開始製作URL:example.org/comics/myawesomecomic/page50example.org/comics/myawesomecomic/page/50或你有什麼。真正發生的是該目錄中的所有頁面都被重定向到同一個腳本,然後該腳本檢查URL的結尾以找出從DB中拉出的內容。但對最終用戶來說,它看起來只有一個網頁。這看起來更乾淨(我認爲),並且更多地涵蓋了腳本的邏輯。但我要說的是等待它,因爲它還會爲您提供其他可能難以預測的風險,直到您習慣於消除用戶輸入和處理標準頁面錯誤(如「找不到頁面」)爲止。

不管怎麼說,找出東西,比如一週增加當前日期和添加頁碼,當前頁面完全是我如何進入PHP和Web應用程序的開發,所以我希望這是有益的和直接的。

+0

這是一個非常好的答案,將它書籤爲未來askers,但如果我在記錄31和記錄30被刪除?你將不得不做一些檢查,至少我會提到這一點。 – 2010-03-09 13:41:59

1

我假設你不是在談論分頁(即將一個大的記錄分成多個頁面),而是關於具有記錄的詳細視圖,以及預測「下一個」/「前一個」鏈接到下一個和之前的記錄

如果你沒有找到前一個和最後一個鄰居的固定方式(所以你不能只說「當前ID -1」和「+1」),你將不得不按照你的標準進行數據庫查詢,並找出以前和下一個成員。

也許這是深入到問題中,而不是你需要開始,但我最近問了一個問題最近有關優化問題和不同的方法,以快速和有效的方式做這個「neghbor查找」。 Caching the results of a 「next」/「previous element」 query

1

這裏有很多方法可以做到這一點,從複雜到簡單。 (在谷歌搜索PHP分頁)。

某些網址中的?id = 50是確定要開始的項目。

例如在sql中,您使用SELECT * FROM tbl LIMIT 0,10確定要選擇的項目範圍,這將選擇記錄0-10。那麼SELECT * FROM tbl LIMIT 11,10將選擇11到20.

+0

實際上,'LIMIT 11,20'會選擇記錄11-30,因爲'LIMIT'中的第二個參數是持續時間,而不是終點。 – 2010-03-08 17:42:36

+0

是啊,很好的發現,只是在那裏犯了一個錯字,現在編輯:) – cast01 2010-03-08 17:50:48

2

這種導航稱爲分頁。有跡象表明,影響一個特定網頁上分頁三個變量:

  • 項目總數
  • 每頁項目
  • 當前頁

的數量通常可以得到總數從一個數據庫容易,使用這樣的查詢:

$query = "SELECT COUNT(*) FROM tbl"; 
$count = mysql_result($query, 0); 

而且如你所知的數字每頁和當前頁面的項目,你能找出多少頁總數:

$perpage = 10; // This you can define yourself 

$pages_count = ceil($count/$perpage); 

之後,很容易做一些簡單的if語句,看看應該顯示什麼樣的導航:

// Get the current page or set default if not given 
$page = isset($_GET['page']) ? $_GET['page'] : 1; 

$pages_count = ceil($count/$perpage); 

$is_first = $page == 1; 
$is_last = $page == $pages_count; 

// Prev cannot be less than one 
$prev = max(1, $page - 1); 
// Next cannot be larger than $pages_count 
$next = min($pages_count , $page + 1); 

// If we are on page 2 or higher 
if(!$is_first) { 
    echo '<a href="index.php?page=1">First</a>'; 
    echo '<a href="index.php?page='.$prev.'">Previous</a>'; 
} 

echo '<span>Page '.$page.'/'.$pages_count.'</span>'; 

// If we are not at the last page 
if(!$is_last) { 
    echo '<a href="index.php?page='.$next.'">Next</a>'; 
    echo '<a href="index.php?page='.$pages_count.'">Last</a>'; 
} 

要選擇針對給定的網頁數據庫中正確的結果,你可以使用這樣的查詢:

$query = "SELECT * FROM tbl LIMIT ".(int)($page - 1)." ".(int)$perpage; 

這真的有進去。希望這可以幫助。

相關問題