我是新手,對導航有疑問。 什麼是各種方法,可以實現「第一個」,「上一個」,「下一個」和「最後」導航,如在文章或漫畫網站中看到的? (誠然,「第一」鏈接不會讓人困惑,因爲它可以保持靜態,但其他鏈接怎麼樣?) 例如,在第50頁上,鏈接將適當地導向第49和第51(如果它存在,如果不存在它會不起作用,但當這樣的頁面存在時,它會自動變爲活動狀態 在大多數這樣的例子中,我看到的URL以「.php?id = 50」結尾,但我不確定它是如何實現的,使用數據庫? Any幫助將是非常讚賞,感謝實現第一次,上一次,下一次和最後一次導航的方法
回答
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/page50
或example.org/comics/myawesomecomic/page/50
或你有什麼。真正發生的是該目錄中的所有頁面都被重定向到同一個腳本,然後該腳本檢查URL的結尾以找出從DB中拉出的內容。但對最終用戶來說,它看起來只有一個網頁。這看起來更乾淨(我認爲),並且更多地涵蓋了腳本的邏輯。但我要說的是等待它,因爲它還會爲您提供其他可能難以預測的風險,直到您習慣於消除用戶輸入和處理標準頁面錯誤(如「找不到頁面」)爲止。
不管怎麼說,找出東西,比如一週增加當前日期和添加頁碼,當前頁面完全是我如何進入PHP和Web應用程序的開發,所以我希望這是有益的和直接的。
也許
this tutorial
或this one將幫助您
編輯:。MEH,第一個是一個非常討厭的網站上發現的其他。 :)
我假設你不是在談論分頁(即將一個大的記錄分成多個頁面),而是關於具有記錄的詳細視圖,以及預測「下一個」/「前一個」鏈接到下一個和之前的記錄。
如果你沒有找到前一個和最後一個鄰居的固定方式(所以你不能只說「當前ID -1」和「+1」),你將不得不按照你的標準進行數據庫查詢,並找出以前和下一個成員。
也許這是深入到問題中,而不是你需要開始,但我最近問了一個問題最近有關優化問題和不同的方法,以快速和有效的方式做這個「neghbor查找」。 Caching the results of a 「next」/「previous element」 query
這裏有很多方法可以做到這一點,從複雜到簡單。 (在谷歌搜索PHP分頁)。
某些網址中的?id = 50是確定要開始的項目。
例如在sql中,您使用SELECT * FROM tbl LIMIT 0,10
確定要選擇的項目範圍,這將選擇記錄0-10。那麼SELECT * FROM tbl LIMIT 11,10
將選擇11到20.
實際上,'LIMIT 11,20'會選擇記錄11-30,因爲'LIMIT'中的第二個參數是持續時間,而不是終點。 – 2010-03-08 17:42:36
是啊,很好的發現,只是在那裏犯了一個錯字,現在編輯:) – cast01 2010-03-08 17:50:48
這種導航稱爲分頁。有跡象表明,影響一個特定網頁上分頁三個變量:
- 項目總數
- 每頁項目
- 當前頁
的數量通常可以得到總數從一個數據庫容易,使用這樣的查詢:
$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;
這真的有進去。希望這可以幫助。
- 1. 導航第二次點擊後第一次工作
- 2. SSRS第一次和最後一次輸入的數據標籤
- 3. OLEDB查詢選擇ID的第一次和最後一次
- 4. Stata的第一次和最後一次發生
- 5. 第一次和最後一次刪除雙引號失敗
- 6. 獲取第一次和最後一次每天postgres
- 7. 如何比較第一次約會和最後一次約會?
- 8. 每一次循環的第一次和第三次迭代
- 9. 第一次輸入時按下第一次從下一次追加2brs追加?
- 10. 如何查找data.frame中元素的第一次和最後一次出現?
- 11. 替換json字符串的第一次和最後一次出現
- 12. 方法一次又一次調用
- 13. 註冊替換文本塊第一次出現+最後一次出現
- 14. 第一次實現和使用ace
- 15. 使用hg log -l和-r的第一次和最後一次更改集
- 16. 代碼第一次無法正確執行。下一次它
- 17. 第一次完成後執行方法
- 18. 第一次導航至右側
- 19. 啓用第二次微調一次第一次微調 - Android
- 20. 重複最後一次輸入兩次
- 21. 第一次multithreader
- 22. 第一次找到Cookies後,他們第一次設置
- 23. 第一次「for循環」在第一次迭代後停止python
- 24. 如果您一次點擊一次或一次點擊一次
- 25. uitableview第一次和最後一次可見的單元格顏色變化
- 26. 刪除空間中的空間第一次和最後一次android?
- 27. 最多運行一次IntentService一次
- 28. 第一次刷卡後禁用刷卡,然後重置一次?
- 29. C#一次(一次火)活動實施
- 30. 第一次出現分割
這是一個非常好的答案,將它書籤爲未來askers,但如果我在記錄31和記錄30被刪除?你將不得不做一些檢查,至少我會提到這一點。 – 2010-03-09 13:41:59