2012-12-31 32 views
1

我很難理解即使是互聯網上的「簡單」分頁教程。如何爲特定查詢分頁?

我正在爲我的公司創建一個Intranet站點,並且爲了完成它的唯一步驟是對所有查詢進行分頁,因爲它們都包含數千個結果,尤其是搜索結果。

我的問題是我將能夠分頁查詢的方式是如下:

SELECT * FROM hdticket WHERE id = 22; 
+3

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – ThiefMaster

+3

讓我成爲許多人的第一個說法:不要將'$ _GET ['anything']'直接放入您的查詢中。這是一場災難。谷歌「SQL注入」瞭解爲什麼。 – glomad

+0

好分頁意味着使用LIMIT子句獲取數據,我在您的查詢中沒有看到......根據您的樣式問題,您可以使用表或CSS或任何您喜歡的東西 –

回答

2

您需要爲您的MySQL查詢添加LIMIT子句。這是簡單的:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 0, 10 

這將從頭開始(想象你的記錄是零索引)獲取10條記錄。第一個數字是從何時開始提取,第二個數字是此後要提取的數量。所以從0開始,它會獲取接下來的10條記錄。這將是第1頁。

要獲得記錄的後續頁面,您只需要增加第一個數字。因此,要獲得第二頁,您需要從10開始計數,並獲取下10條記錄。該查詢應該是這樣的:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 10, 10 

然後第3頁:

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 20, 10 

等。希望你能看到新出現的模式。

由於您使用的是$_GET參數,因此您可以只修改您的URL來尋找記錄。所以的URL http://intranet/index.php頁= 2會給:

<?php 

$page = intval($_GET['page']); 
$limit = 10; 
$offset = (($page - 1) * $limit); 

$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT $offset, $limit"; 

希望這有助於。

此外,一些旁白。不要使用mysql_函數,因爲它們已被棄用。你可以從官方手冊頁面看到這個:http://php.net/manual/en/function.mysql-query.php

此外,您的代碼容易受到SQL注入攻擊,因爲您正在使用URL中的內容並直接在SQL查詢中使用它。如果你在那裏把分頁數字放在那裏,這很好,但是如果有人邪惡的把SQL放在URL中,他們可以做各種事情,比如截斷你的表或者你的整個數據庫,這會發生,因爲你只是通過它而不檢查它。

要解決這個問題,您可以使用mysql_函數的替代函數(如PDO)在SQL語句中準備變量。您的代碼會是這個樣子:

<?php 

$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT :offset, :limit"; 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(':ticknum', $ticknum, PDO::PARAM_INT); 
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); 
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 
$stmt->execute(); 

這可以確保傳遞給你的SQL字符串的數據是你所期望的,並且自動轉義,以防止SQL注入。

+3

同意您需要LIMIT來執行服務器端分頁。但是,如果使用LIMIT,則應始終包含ORDER BY子句。這將確保每次以相同的順序返回行,這對於一致的分頁是必需的。在實踐中,無論如何,MySQL可能會以一致的順序返回行,但最好不要依賴它。 – jfrank

+0

@jfrank借調。是要記下這一點,但忘了摔倒自己來警告SQL注入漏洞! –

+0

謝謝Martin和每個人的貢獻!這完美地回答了我的問題!我知道已棄用的mysql_函數,儘管我一次只學習一次OOP,儘管當我非常綠的時候我開始了這個。此外,由於這是一個內部網站,我正在爲一臺安全的網絡上的計算機文盲開發,我並不太擔心打針,但我一定會在將來的項目中牢記這一點!謝謝大家! –

-2

您可以使用頂部/限制這樣做..

,如果你想只頂10則:

select top 10,* from table; 

或 如果你想去的網頁,然後:

select * from table limit 10 , 20;