在真實(shí)的專案中,我們是將主機(jī)、使用者名稱、密碼、函式庫(kù)都寫在設(shè)定檔當(dāng)中。
如果在程式碼中寫死了,萬(wàn)一資料庫(kù)伺服器的相關(guān)資訊改變了,要把所有程式碼修改一次顯然不符合程式設(shè)計(jì)師的思維。
此外,在每一個(gè)需要連接資料庫(kù)的頁(yè)面中。我們都需要寫上連結(jié)、判斷錯(cuò)誤、設(shè)定字元集、太過於麻煩。並且不利於重複使用這些程式碼。
我們可以用上之前講過的include系列函數(shù)來達(dá)成目標(biāo)。範(fàn)例圖如下:

因此,我們可以做一個(gè)設(shè)定檔config.php。將需要使用到的設(shè)定全部設(shè)定為常數(shù),程式碼如下:
<?php
//數(shù)據(jù)庫(kù)服務(wù)器
define('DB_HOST', 'localhost');
//數(shù)據(jù)庫(kù)用戶名
define('DB_USER', 'root');
//數(shù)據(jù)庫(kù)密碼
define('DB_PWD', 'secret');
//庫(kù)名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
?>
我們將connection.php頁(yè)面抽出出來,以後需要連接資料庫(kù)的時(shí)候只需要包含connection.php檔案即可。程式碼如下:
<?phpinclude 'config.php';$conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);if (mysqli_errno($conn)) { mysqli_error($conn); exit;}mysqli_set_charset($conn, DB_CHARSET);
?>
我們?cè)谝葬崦總€(gè)檔案使用中直接包含connection.php檔案就可以實(shí)作資料庫(kù)連線了:
include 'connection.php';
#把上面的準(zhǔn)備工作完成,接下來完成分頁(yè)。分頁(yè)效果如下:

頁(yè)要實(shí)現(xiàn)分頁(yè)中包含以下幾個(gè)基本元素:
元素 | 說明 | 備註 |
---|
#首頁(yè) | 最開始進(jìn)入到頁(yè)面的第一頁(yè) | 用get傳參才進(jìn)去時(shí)預(yù)設(shè)為1 |
#上一頁(yè) | #目前頁(yè)減1 | #如果頁(yè)碼為第一頁(yè)時(shí)減1,為應(yīng)該為第一頁(yè) |
下一頁(yè) | 目前頁(yè)加1 | 如果為最後一 |
尾頁(yè) | 最後一頁(yè) | 總條數(shù)除以每頁(yè)顯示數(shù)得到總頁(yè)數(shù) |
#目前頁(yè) | 目前所在的頁(yè)碼 | 就是目前的頁(yè)碼 |
總頁(yè)數(shù) | 一共有多少個(gè)頁(yè)面 | 總條數(shù)除以每頁(yè)顯示數(shù)字 |
#
我們?cè)诳刂祈?yè)碼的時(shí)候,都是透過URL網(wǎng)址列傳入頁(yè)碼值來實(shí)現(xiàn)的頁(yè)碼控制。在page.php後面接上頁(yè)碼的相關(guān)訊息,我們就能夠算出更多的有效資訊。 url控制分頁(yè)的效果如下:

在程式碼實(shí)作中,是透過limit後的偏移量(offset)和數(shù)量(num),這兩個(gè)值真正實(shí)現(xiàn)的分頁(yè)。
limit offset , num
頁(yè)碼 | url中g(shù)et值 | limit偏移量,數(shù)量 |
---|
第1頁(yè) | 1 | 0,5 |
第2頁(yè) | 2 | 5,5 |
第3頁(yè) | 3 | ##10,5 |
第n頁(yè) | n | (n-1)*5,5 |
假設(shè)每頁(yè)顯示5條。最終得到的分頁(yè)中控制limit公式如下:
offset的值為 (n-1)*5
num 為規(guī)定的5
我們透過程式碼來實(shí)現(xiàn)業(yè)務(wù):
一、計(jì)算出分頁(yè)所需的參數(shù)
總數(shù)
通過查詢user表的count(id),得到總數(shù)$count。
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到總的用戶數(shù)
$count = $data['c'];
目前頁(yè)
剛進(jìn)入page.php頁(yè)時(shí),url為http://www.php.com/page.php,後面是不存在??page=1 頁(yè)面識(shí)別號(hào)碼的。
因此我們需要手動(dòng)建立一個(gè)頁(yè)面識(shí)別號(hào)碼傳給目前頁(yè)碼變數(shù)$page。
我們害怕使用者傳送的頁(yè)面中存在小數(shù)等,所以我們做一次強(qiáng)制的型別轉(zhuǎn)換:(int) $_GET['page']。
第一種寫法:
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
第二種寫法
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
最後一頁(yè)
每一頁(yè)一定是整數(shù)。就跟小學(xué)的時(shí)候數(shù)學(xué)一樣。平均有5.6個(gè)人應(yīng)該準(zhǔn)備幾顆蘋果。答案一定是6個(gè)。
如果頁(yè)面出來了20.3個(gè)頁(yè)面,一定是用進(jìn)一法取整函數(shù)ceil。讓分頁(yè)數(shù)變成21。
我們用總數(shù)除以每頁(yè)顯示的資料條數(shù),就得到了總頁(yè)數(shù)了。
//每頁(yè)顯示數(shù)
$num = 5;
$total = ceil($count / $num);
上一頁(yè)、下一頁(yè)異常狀況控制
如果使用者的在第一頁(yè)點(diǎn)擊了上一頁(yè),在最後一頁(yè)點(diǎn)擊了下一頁(yè)怎麼辦呢?
這樣的話數(shù)據(jù)會(huì)超出範(fàn)圍,而造成我們分頁(yè)時(shí)無(wú)數(shù)據(jù)顯示。
顯然這種異常情況需要考慮。因此,如果在分頁(yè)時(shí)在第一頁(yè)減一時(shí),我們就讓他為第一頁(yè)。
在最後一頁(yè)加一時(shí),我們就讓他為最後一頁(yè),即完成了異常控制。
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
二、SQL語(yǔ)句
我們之前說過分頁(yè)的核心是透過SQL語(yǔ)句中的offset和num來控制每頁(yè)顯示數(shù)。
我們?cè)谏厦嬉擦辛司唧w的公式,我們將公司轉(zhuǎn)換為程式碼如下:
$num = 5;
$offset = ($page - 1) * $num;
我們將$num和$offset套用到SQL語(yǔ)句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
控制好URI中的分頁(yè)值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首頁(yè)</a>
<a href="page.php?page=' . ($page - 1) . '">上一頁(yè)</a>
<a href="page.php?page=' . ($page + 1) . '">下一頁(yè)</a>
<a href="page.php?page=' . $total . '">尾頁(yè)</a>
當(dāng)前是第 ' . $page . '頁(yè) 共' . $total . '頁(yè)
</td>
</tr>';
我們最後將整體業(yè)務(wù)串連起來實(shí)現(xiàn)最終效果,程式碼如下:
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到總的用戶數(shù)
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每頁(yè)顯示數(shù)
$num = 5;
//得到總頁(yè)數(shù)
$total = ceil($count / $num);
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
$offset = ($page - 1) * $num;
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
//存在數(shù)據(jù)則循環(huán)將數(shù)據(jù)顯示出來
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">編輯用戶</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">刪除用戶</a></td>';
echo '</tr>';
}
echo '<tr><td colspan="5"><a href="page.php?page=1">首頁(yè)</a> <a href="page.php?page=' . ($page - 1) . '">上一頁(yè)</a> <a href="page.php?page=' . ($page + 1) . '">下一頁(yè)</a> <a href="page.php?page=' . $total . '">尾頁(yè)</a> 當(dāng)前是第 ' . $page . '頁(yè) 共' . $total . '頁(yè) </td></tr>';
echo '</table>';
} else {
echo '沒有數(shù)據(jù)';
}
mysqli_close($conn);
<?php
$num = 5;
$offset = ($page - 1) * $num;
//我們將$num和$offset應(yīng)用于SQL語(yǔ)句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
//控制好URI中的分頁(yè)值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首頁(yè)</a>
<a href="page.php?page=' . ($page - 1) . '">上一頁(yè)</a>
<a href="page.php?page=' . ($page + 1) . '">下一頁(yè)</a>
<a href="page.php?page=' . $total . '">尾頁(yè)</a>
當(dāng)前是第 ' . $page . '頁(yè) 共' . $total . '頁(yè)
</td>
</tr>';
//我們最后將整體業(yè)務(wù)串聯(lián)起來實(shí)現(xiàn)最終效果,代碼如下:
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到總的用戶數(shù)
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每頁(yè)顯示數(shù)
$num = 5;
//得到總頁(yè)數(shù)
$total = ceil($count / $num);
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
$offset = ($page - 1) * $num;
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
//存在數(shù)據(jù)則循環(huán)將數(shù)據(jù)顯示出來
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">編輯用戶</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">刪除用戶</a></td>';
echo '</tr>';
}
echo '<tr><td colspan="5"><a href="page.php?page=1">首頁(yè)</a> <a href="page.php?page=' . ($page - 1) . '">上一頁(yè)</a> <a href="page.php?page=' . ($page + 1) . '">下一頁(yè)</a> <a href="page.php?page=' . $total . '">尾頁(yè)</a> 當(dāng)前是第 ' . $page . '頁(yè) 共' . $total . '頁(yè) </td></tr>';
echo '</table>';
} else {
echo '沒有數(shù)據(jù)';
}
mysqli_close($conn);
?>
課件暫不提供下載,工作人員正在整理中,後期請(qǐng)多關(guān)注該課程~
看過本課程的同學(xué)也在學(xué)習(xí)