製作分頁
在真實的專案中,我們是將主機(jī)、使用者名稱、密碼、函式庫都寫在設(shè)定檔當(dāng)中。
如果在程式碼中寫死了,萬一資料庫伺服器的相關(guān)資訊改變了,要把所有程式碼修改一次顯然不符合程式設(shè)計師的思考。
此外,在每一個需要連接資料庫的頁面中。我們都需要寫上連結(jié)、判斷錯誤、設(shè)定字元集、太過於麻煩。並且不利於重複使用這些程式碼。
我們可以用上之前講過的include系列函數(shù)來達(dá)成目標(biāo)。範(fàn)例圖如下:
因此,我們可以做一個設(shè)定檔config.php。將需要使用到的設(shè)定全部設(shè)定為常數(shù),程式碼如下:
<?php //數(shù)據(jù)庫服務(wù)器 define('DB_HOST', 'localhost'); //數(shù)據(jù)庫用戶名 define('DB_USER', 'root'); //數(shù)據(jù)庫密碼 define('DB_PWD', 123456789); //庫名 define('DB_NAME', 'book'); //字符集 define('DB_CHARSET', 'utf8'); ?>
我們將connection.php頁面抽出出來,以後需要連接資料庫的時候只需要包含connection.php檔案即可。程式碼如下:
<?php include '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';
#把上面的準(zhǔn)備工作完成,接下來完成分頁。分頁效果如下:
頁要實現(xiàn)分頁中包含以下幾個基本元素:
我們在控制頁碼的時候,都是透過URL網(wǎng)址列傳入頁碼值來實現(xiàn)的頁碼控制。在page.php後面接上頁碼的相關(guān)訊息,我們就能夠算出更多的有效資訊。 url控制分頁的效果如下:
在程式碼實作中,是透過limit後的偏移量(offset)和數(shù)量(num),這兩個值真正實現(xiàn)的分頁。
limit offset , num
假設(shè)每頁顯示5條。最終得到的分頁中控制limit公式如下:
offset的值為(n-1)*5
num 為規(guī)定的5
我們透過程式碼來實現(xiàn)業(yè)務(wù):
一、計算出分頁所需的參數(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'];
目前頁
剛進(jìn)入page.php頁時,url為http://www.phpxy.com/page.php,後面是不存在??page=1 頁面識別號的。
因此我們需要手動建立一個頁面識別號碼傳給目前頁碼變數(shù)$page。
我們害怕使用者傳送的頁面中存在小數(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; }
最後一頁
每一頁一定是整數(shù)。就跟小學(xué)的時候數(shù)學(xué)一樣。平均有5.6個人應(yīng)該準(zhǔn)備幾顆蘋果。答案一定是6個。
如果頁面出來了20.3個頁面,一定是用進(jìn)一法取整函數(shù)ceil。讓分頁數(shù)變成21。
我們用總數(shù)除以每頁顯示的資料條數(shù),就得到了總頁數(shù)了。
//每頁顯示數(shù)字
$num = 5; $total = ceil($count / $num);
上一頁、下一頁異常情況控制
如果用戶的在第一頁點(diǎn)擊了上一頁,在最後一頁點(diǎn)擊了下一頁怎麼辦?
這樣的話資料會超出範(fàn)圍,而造成我們分頁時無資料顯示。
顯然這種異常情況需要考慮。因此,如果在分頁時在第一頁減一時,我們就讓他為第一頁。
在最後一頁加一時,我們就讓他為最後一頁,即完成了異??刂啤?
if ($page <= 1) { $page = 1; } if ($page >= $total) { $page = $total; }
二、SQL語句
我們先前說過分頁的核心是透過SQL語句中的offset和num來控制每頁顯示數(shù)。
我們在上面也列了具體的公式,我們將公司轉(zhuǎn)換為程式碼如下:
$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> 當(dāng)前是第 ' . $page . '頁 共' . $total . '頁 </td> </tr>';
我們最後將整體業(yè)務(wù)串連起來實現(xiàn)最終效果,程式碼如下:
<?php 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; } */ //每頁顯示數(shù) $num = 5; //得到總頁數(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">首頁</a> <a href="page.php?page=' . ($page - 1) . '">上一頁</a> <a href="page.php?page=' . ($page + 1) . '">下一頁</a> <a href="page.php?page=' . $total . '">尾頁</a> 當(dāng)前是第 ' . $page . '頁 共' . $total . '頁 </td></tr>'; echo '</table>'; } else { echo '沒有數(shù)據(jù)'; } mysqli_close($conn); ?>
分頁原理
1、先了解SQL語句中的limit用法
SELECT * FROM table … limit ??開始位置, 運(yùn)算元數(shù)????(其中開始位置是從0開始的)範(fàn)例:
取前20筆記錄:SELECT * FROM table… limit??0 , 20
從第11筆開始取20筆記錄: SELECT * FROM table …… limit?? 10 , 20LIMIT n 等價於LIMIT 0,n。 如select * from table LIMIT 5; //返回前5行,和?select * from table LIMIT 0,5一樣############2、分頁原理### #########?所謂分頁顯示,也就是講資料庫中的結(jié)果集,一段一段顯示出來######怎麼分段,目前在第幾段(每頁有幾條,目前再第幾頁)######前10筆記錄:select * from table limit 0,10### 第11至20筆記錄:select * from table limit 10,10### 第21至30筆記錄:select * from table limit 20,10######分頁公式:######(目前頁數(shù)- 1 )X 每頁條數(shù), 每頁條數(shù)#######Select * from table limit ($Page- 1) * $PageSize, $PageSize## #######3、$_SERVER["REQUEST_URI"]函數(shù)#############預(yù)先定義伺服器變數(shù)的一種,所有$_SERVER開頭的都叫做預(yù)定於伺服器變數(shù)。 ######REQUEST_URI的作用是取得目前URI,也就除網(wǎng)域外後面的完整的位址路徑。 ######範(fàn)例:###
目前頁面為:http://www.test.com/home.php?id=23&cid=22
echo $_SERVER["REQUEST_URI"]
#結(jié)果為:/ home.php?id=23&cid=22
4、parse_url()解析URL函數(shù)
##?parse_url() 是講URL解析成有固定鍵值的陣列的函數(shù)範(fàn)例$ua=parse_url("http://username:password@hostname/path?arg=value#anchor"); print_r($ua);結(jié)果:
(
??? [scheme] => http ;協(xié)定
??? [host] => hostname??????????????;主機(jī)網(wǎng)域
??? [path] => ; /path???????????????? ;路徑
??? [query] => arg=value?????????????;
)
# 5.程式碼實例
?這個一個留言的分頁,分成3個部分,一個是資料庫設(shè)計,一個是連線頁面,一個是顯示頁面。
(1)設(shè)計資料庫?設(shè)計資料庫名為bbs,有一個資料表為message,裡麵包含title,lastdate,user,content等字段,分別表示留言標(biāo)題,留言日前,留言人,留言的內(nèi)容
(2)連結(jié)頁面<?php $conn = @ mysql_connect("localhost", "root", "123456") or die("數(shù)據(jù)庫鏈接錯誤"); mysql_select_db("bbs", $conn); mysql_query("set names 'GBK'"); //使用GBK中文編碼; //將空格,換行轉(zhuǎn)換為HTML可解析 function htmtocode($content) { $content = str_replace("\n", "<br>", str_replace(" ", " ", $content)); //兩個str_replace嵌套 return $content; } //$content=str_replace("'","‘",$content); //htmlspecialchars(); ?>
(3)顯示頁面
<?php include("conn.php"); $pagesize=2; //設(shè)置每頁顯示2個記錄 $url=$_SERVER["REQUEST_URI"]; $url=parse_url($url); $url=$url[path]; $numq=mysql_query("SELECT * FROM `message`"); $num = mysql_num_rows($numq); if($_GET[page]){ $pageval=$_GET[page]; $page=($pageval-1)*$pagesize; $page.=','; } if($num > $pagesize) { if($pageval<=1)$pageval=1; echo "共 $num 條". " <a href=$url?page=".($pageval-1).">上一頁</a> <a href=$url?page=".($pageval+1).">下一頁</a>"; } $SQL="SELECT * FROM `message` limit $page $pagesize "; $query=mysql_query($SQL); while($row=mysql_fetch_array($query)){ ?>
<table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef"> <tr bgcolor="#eff3ff"> <td>標(biāo)題:<?php echo $row[title]?></td> <td>時間:<?php echo $row[lastdate]?></td> </tr> <tr bgcolor="#eff3ff"> <td> 用戶:<?php echo $row[user]?></td><td></td> </tr> <tr> <td>內(nèi)容:<?php echo htmtocode($row[content]);?></td> </tr> <br> </table>
#