製作分頁LOGIN

製作分頁

在真實的專案中,我們是將主機、使用者名稱、密碼、函式庫都寫在設定檔當中。
如果在程式碼中寫死了,萬一資料庫伺服器的相關資訊改變了,要把所有程式碼修改一次顯然不符合程式設計師的思考。

此外,在每一個需要連接資料庫的頁面中。我們都需要寫上連結、判斷錯誤、設定字元集、太過於麻煩。並且不利於重複使用這些程式碼。

我們可以用上之前講過的include系列函數來達成目標。範例圖如下:

QQ截图20161010101506.png

因此,我們可以做一個設定檔config.php。將需要使用到的設定全部設定為常數,程式碼如下:

<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
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';

#把上面的準備工作完成,接下來完成分頁。分頁效果如下:

QQ截图20161010101814.png

頁要實現分頁中包含以下幾個基本元素:

QQ截图20161010101852.png

QQ截图20161010101858.png

我們在控制頁碼的時候,都是透過URL網址列傳入頁碼值來實現的頁碼控制。在page.php後面接上頁碼的相關訊息,我們就能夠算出更多的有效資訊。 url控制分頁的效果如下:

QQ截图20161010101933.png

在程式碼實作中,是透過limit後的偏移量(offset)和數量(num),這兩個值真正實現的分頁。

limit offset , num

QQ截图20161010101943.png

假設每頁顯示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.phpxy.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>';

我們最後將整體業務串連起來實現最終效果,程式碼如下:

<?php
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);
?>

分頁原理





1、先了解SQL語句中的limit用法

SELECT * FROM table … limit   開始位置, 運算元數    (其中開始位置是從0開始的)範例:

取前20筆記錄:SELECT * FROM table… limit  0 , 20

從第11筆開始取20筆記錄: SELECT * FROM table …… limit   10 , 20

LIMIT n 等價於LIMIT 0,n。

如select * from table LIMIT 5; //返回前5行,和 select * from table LIMIT 0,5一樣############2、分頁原理### ######### 所謂分頁顯示,也就是講資料庫中的結果集,一段一段顯示出來######怎麼分段,目前在第幾段(每頁有幾條,目前再第幾頁)######前10筆記錄:select * from table limit 0,10### 第11至20筆記錄:select * from table limit 10,10### 第21至30筆記錄:select * from table limit 20,10######分頁公式:######(目前頁數- 1 )X 每頁條數, 每頁條數#######
Select * from table limit ($Page- 1) * $PageSize, $PageSize
## #######3、$_SERVER["REQUEST_URI"]函數#############預先定義伺服器變數的一種,所有$_SERVER開頭的都叫做預定於伺服器變數。 ######REQUEST_URI的作用是取得目前URI,也就除網域外後面的完整的位址路徑。 ######範例:###

目前頁面為:http://www.test.com/home.php?id=23&cid=22

echo $_SERVER["REQUEST_URI"]

#結果為:/ home.php?id=23&cid=22

4、parse_url()解析URL函數

## parse_url() 是講URL解析成有固定鍵值的陣列的函數

範例


$ua=parse_url("http://username:password@hostname/path?arg=value#anchor");
 print_r($ua);

結果:


Array

(
    [scheme] => http ;協定
    [host] => hostname              ;主機網域

#   [user] => word              ;密碼

    [path] => ; /path                 ;路徑
    [query] => arg=value             ;
)


# 5.程式碼實例

 這個一個留言的分頁,分成3個部分,一個是資料庫設計,一個是連線頁面,一個是顯示頁面。

(1)設計資料庫

 設計資料庫名為bbs,有一個資料表為message,裡麵包含title,lastdate,user,content等字段,分別表示留言標題,留言日前,留言人,留言的內容

(2)連結頁面

<?php
$conn = @ mysql_connect("localhost", "root", "123456") or die("数据库链接错误"); mysql_select_db("bbs", $conn); mysql_query("set names 'GBK'"); //使用GBK中文编码;
//将空格,换行转换为HTML可解析
function htmtocode($content) {  $content = str_replace("\n", "<br>", str_replace(" ", "&nbsp;", $content)); //两个str_replace嵌套
 return $content; }
//$content=str_replace("'","‘",$content);  //htmlspecialchars(); 
?>

(3)顯示頁面

<?php  
include("conn.php");
$pagesize=2;       
//设置每页显示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>标题:<?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>内容:<?php echo htmtocode($row[content]);?></td>
   </tr>
   <br>
 </table>

#下一節

<?php 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); ?>
章節課件