在真實的專案中,我們是將主機、使用者名稱、密碼、函式庫都寫在設定檔當中。
如果在程式碼中寫死了,萬一資料庫伺服器的相關資訊改變了,要把所有程式碼修改一次顯然不符合程式設計師的思維。
此外,在每一個需要連接資料庫的頁面中。我們都需要寫上連結、判斷錯誤、設定字元集、太過於麻煩。並且不利於重複使用這些程式碼。
我們可以用上之前講過的include系列函數來達成目標。範例圖如下:
因此,我們可以做一個設定檔config.php。將需要使用到的設定全部設定為常數,程式碼如下:
<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
define('DB_PWD', 'secret');
//库名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
?>
我們將connection.php頁面抽出出來,以後需要連接資料庫的時候只需要包含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);
?>
我們在以後每個檔案使用中直接包含connection.php檔案就可以實作資料庫連線了:
include 'connection.php';
#把上面的準備工作完成,接下來完成分頁。分頁效果如下:
頁要實現分頁中包含以下幾個基本元素:
元素 | 說明 | 備註 |
---|
#首頁 | 最開始進入到頁面的第一頁 | 用get傳參才進去時預設為1 |
#上一頁 | #目前頁減1 | #如果頁碼為第一頁時減1,為應該為第一頁 |
下一頁 | 目前頁加1 | 如果為最後一 |
尾頁 | 最後一頁 | 總條數除以每頁顯示數得到總頁數 |
#目前頁 | 目前所在的頁碼 | 就是目前的頁碼 |
總頁數 | 一共有多少個頁面 | 總條數除以每頁顯示數字 |
#
我們在控制頁碼的時候,都是透過URL網址列傳入頁碼值來實現的頁碼控制。在page.php後面接上頁碼的相關訊息,我們就能夠算出更多的有效資訊。 url控制分頁的效果如下:
在程式碼實作中,是透過limit後的偏移量(offset)和數量(num),這兩個值真正實現的分頁。
limit offset , num
頁碼 | url中get值 | limit偏移量,數量 |
---|
第1頁 | 1 | 0,5 |
第2頁 | 2 | 5,5 |
第3頁 | 3 | ##10,5 |
第n頁 | n | (n-1)*5,5 |
假設每頁顯示5條。最終得到的分頁中控制limit公式如下:
offset的值为 (n-1)*5
num 为规定的5
我們透過程式碼來實現業務:
一、計算出分頁所需的參數
總數
通过查询user表的count(id),得到总数$count。
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
目前頁
剛進入page.php頁時,url為http://www.php.com/page.php,後面是不存在 ?page=1 頁面識別號碼的。
因此我們需要手動建立一個頁面識別號碼傳給目前頁碼變數$page。
我們害怕使用者傳送的頁面中存在小數等,所以我們做一次強制的型別轉換:(int) $_GET['page']。
第一種寫法:
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
第二種寫法
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
最後一頁
每一頁一定是整數。就跟小學的時候數學一樣。平均有5.6個人應該準備幾顆蘋果。答案一定是6個。
如果頁面出來了20.3個頁面,一定是用進一法取整函數ceil。讓分頁數變成21。
我們用總數除以每頁顯示的資料條數,就得到了總頁數了。
//每页显示数
$num = 5;
$total = ceil($count / $num);
上一頁、下一頁異常狀況控制
如果使用者的在第一頁點擊了上一頁,在最後一頁點擊了下一頁怎麼辦呢?
這樣的話數據會超出範圍,而造成我們分頁時無數據顯示。
顯然這種異常情況需要考慮。因此,如果在分頁時在第一頁減一時,我們就讓他為第一頁。
在最後一頁加一時,我們就讓他為最後一頁,即完成了異常控制。
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
二、SQL語句
我們之前說過分頁的核心是透過SQL語句中的offset和num來控制每頁顯示數。
我們在上面也列了具體的公式,我們將公司轉換為程式碼如下:
$num = 5;
$offset = ($page - 1) * $num;
我們將$num和$offset套用到SQL語句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
控制好URI中的分頁值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首页</a>
<a href="page.php?page=' . ($page - 1) . '">上一页</a>
<a href="page.php?page=' . ($page + 1) . '">下一页</a>
<a href="page.php?page=' . $total . '">尾页</a>
当前是第 ' . $page . '页 共' . $total . '页
</td>
</tr>';
我們最後將整體業務串連起來實現最終效果,程式碼如下:
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每页显示数
$num = 5;
//得到总页数
$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)) {
//存在数据则循环将数据显示出来
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">首页</a> <a href="page.php?page=' . ($page - 1) . '">上一页</a> <a href="page.php?page=' . ($page + 1) . '">下一页</a> <a href="page.php?page=' . $total . '">尾页</a> 当前是第 ' . $page . '页 共' . $total . '页 </td></tr>';
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
下一節<?php
$num = 5;
$offset = ($page - 1) * $num;
//我们将$num和$offset应用于SQL语句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
//控制好URI中的分页值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首页</a>
<a href="page.php?page=' . ($page - 1) . '">上一页</a>
<a href="page.php?page=' . ($page + 1) . '">下一页</a>
<a href="page.php?page=' . $total . '">尾页</a>
当前是第 ' . $page . '页 共' . $total . '页
</td>
</tr>';
//我们最后将整体业务串联起来实现最终效果,代码如下:
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每页显示数
$num = 5;
//得到总页数
$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)) {
//存在数据则循环将数据显示出来
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">首页</a> <a href="page.php?page=' . ($page - 1) . '">上一页</a> <a href="page.php?page=' . ($page + 1) . '">下一页</a> <a href="page.php?page=' . $total . '">尾页</a> 当前是第 ' . $page . '页 共' . $total . '页 </td></tr>';
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
?>