国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

制作分頁(yè)

在真實(shí)的項(xiàng)目中,我們是將主機(jī)、用戶(hù)名、密碼、庫(kù)都寫(xiě)在配置文件當(dāng)中。
如果在代碼中寫(xiě)死了,萬(wàn)一數(shù)據(jù)庫(kù)服務(wù)器的相關(guān)信息發(fā)生變化了,要把所有代碼修改一次顯然不符合程序員的思維。

此外,在每一個(gè)需要連接數(shù)據(jù)庫(kù)的頁(yè)面中。我們都需要寫(xiě)上連接、判斷錯(cuò)誤、設(shè)置字符集、太過(guò)于麻煩。并且不利于重復(fù)使用這些代碼。

我們可以用上之前講過(guò)的include系列函數(shù)達(dá)成目標(biāo)。示例圖如下:

QQ截圖20161010101506.png

因此,我們可以做一個(gè)配置文件config.php。將需要使用到的配置全部設(shè)置為常量,代碼如下:

<?php
//數(shù)據(jù)庫(kù)服務(wù)器
define('DB_HOST', 'localhost');
//數(shù)據(jù)庫(kù)用戶(hù)名
define('DB_USER', 'root');
//數(shù)據(jù)庫(kù)密碼
define('DB_PWD', 123456789);
//庫(kù)名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
?>

我們將connection.php頁(yè)面抽取出來(lái),以后需要連接數(shù)據(jù)庫(kù)的時(shí)候只需要包含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);

我們?cè)谝院竺總€(gè)文件使用中直接包含 connection.php文件就可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接了:

include 'connection.php';

把上面的準(zhǔn)備工作完成,接下來(lái)完成分頁(yè)。分頁(yè)效果如下:

QQ截圖20161010101814.png

頁(yè)要實(shí)現(xiàn)分頁(yè)中包含以下幾個(gè)基本元素:

QQ截圖20161010101852.png

QQ截圖20161010101858.png

我們?cè)诳刂祈?yè)碼的時(shí)候,都是通過(guò)URL地址欄傳入頁(yè)碼值來(lái)實(shí)現(xiàn)的頁(yè)碼控制。在page.php后面接上頁(yè)碼的相關(guān)信息,我們就能夠算出更多的有效信息。url控制分頁(yè)的效果如下:

QQ截圖20161010101933.png

在代碼實(shí)現(xiàn)中,是通過(guò)limit后的偏移量(offset)和數(shù)量(num),這兩個(gè)值真正實(shí)現(xiàn)的分頁(yè)。

limit offset , num

QQ截圖20161010101943.png

假設(shè)每頁(yè)顯示5條。最終得到的分頁(yè)中控制limit公式如下:

offset的值為 (n-1)*5
num 為規(guī)定的5

我們通過(guò)代碼來(lái)實(shí)現(xiàn)業(yè)務(wù):

一、計(jì)算出分頁(yè)所需的參數(shù)

總數(shù)

通過(guò)查詢(xún)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);
//得到總的用戶(hù)數(shù)
$count = $data['c'];

當(dāng)前頁(yè)

剛進(jìn)入page.php頁(yè)時(shí),url為http://www.phpxy.com/page.php,后面是不存在??page=1 頁(yè)面標(biāo)識(shí)號(hào)的。

因此我們需要手動(dòng)創(chuàng)建一個(gè)頁(yè)面標(biāo)識(shí)號(hào)傳給當(dāng)前頁(yè)碼變量$page。

我們害怕用戶(hù)傳的頁(yè)面中存在小數(shù)等,所以我們做一次強(qiáng)制的類(lèi)型轉(zhuǎn)換:(int) $_GET['page']。

第一種寫(xiě)法:

$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;

第二種寫(xiě)法

if (isset($_GET['page'])) {
    $page = (int) $_GET['page'];
} else {
    $page = 1;
}

最后一頁(yè)

每一頁(yè)一定是一個(gè)整數(shù)。就跟小學(xué)的時(shí)候數(shù)學(xué)一樣。平均有5.6個(gè)人應(yīng)該準(zhǔn)備幾個(gè)蘋(píng)果。答案一定是6個(gè)。

如果頁(yè)面出來(lái)了20.3個(gè)頁(yè)面,一定是使用進(jìn)一法取整函數(shù)ceil。讓分頁(yè)數(shù)變?yōu)?1。

我們用總數(shù)除以每頁(yè)顯示的數(shù)據(jù)條數(shù),就得到了總頁(yè)數(shù)了。

//每頁(yè)顯示數(shù)

$num = 5;
$total = ceil($count / $num);

上一頁(yè)、下一頁(yè)異常情況控制

如果用戶(hù)的在第一頁(yè)點(diǎn)擊了上一頁(yè),在最后一頁(yè)點(diǎn)擊了下一頁(yè)怎么辦呢?

這樣的話(huà)數(shù)據(jù)會(huì)超出范圍,而造成我們分頁(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ǔ)句

我們之前說(shuō)過(guò)分頁(yè)的核心是通過(guò)SQL語(yǔ)句中的offset和num來(lái)控制每頁(yè)顯示數(shù)。

我們?cè)谏厦孢€列了具體的公式,我們將公司轉(zhuǎn)化為代碼如下:

$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)起來(lái)實(shí)現(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);
//得到總的用戶(hù)數(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ù)顯示出來(lái)
    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'] . '">編輯用戶(hù)</a></td>';
        echo '<td><a href="delete.php?id=' . $row['id'] . '">刪除用戶(hù)</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 '沒(méi)有數(shù)據(jù)';
}
mysqli_close($conn);
?>

分頁(yè)原理

1、首先了解SQL語(yǔ)句中的limit用法

SELECT * FROM table …… limit ??開(kāi)始位置 , 操作條數(shù)????(其中開(kāi)始位置是從0開(kāi)始的)

例子:

取前20條記錄:SELECT * FROM table …… limit??0 , 20
從第11條開(kāi)始取20條記錄:SELECT * FROM table …… limit?? 10 , 20

LIMIT n 等價(jià)于 LIMIT 0,n。

如select * from table LIMIT 5; //返回前5行,和?select * from table LIMIT 0,5一樣

2、分頁(yè)原理

?所謂分頁(yè)顯示,也就是講數(shù)據(jù)庫(kù)中的結(jié)果集,一段一段顯示出來(lái)

怎么分段,當(dāng)前在第幾段 (每頁(yè)有幾條,當(dāng)前再第幾頁(yè))

前10條記錄:select * from table limit 0,10
第11至20條記錄:select * from table limit 10,10
第21至30條記錄:select * from table limit 20,10

分頁(yè)公式:

(當(dāng)前頁(yè)數(shù) - 1 )X 每頁(yè)條數(shù) , 每頁(yè)條數(shù)

Select * from table limit ($Page- 1) * $PageSize, $PageSize

3、$_SERVER["REQUEST_URI"]函數(shù)

預(yù)定義服務(wù)器變量的一種,所有$_SERVER開(kāi)頭的都叫做預(yù)定于服務(wù)器變量。

REQUEST_URI的作用是取得當(dāng)前URI,也就除域名外后面的完整的地址路徑。

例子:

當(dāng)前頁(yè)為: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ù)組的函數(shù)

例子

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

結(jié)果:

Array
(
??? [scheme] => http????????????????;協(xié)議
??? [host] => hostname??????????????;主機(jī)域名

???[user] => username?????????????;用戶(hù)
??? [pass] => password????????????? ;密碼
??? [path] => /path???????????????? ;路徑
??? [query] => arg=value??????????? ;取參數(shù)

???[fragment] => anchor???????????;
)

5、代碼實(shí)例

?這個(gè)一個(gè)留言的分頁(yè),分為3個(gè)部分,一個(gè)是數(shù)據(jù)庫(kù)設(shè)計(jì),一個(gè)是連接頁(yè)面,一個(gè)是顯示頁(yè)面。

(1)設(shè)計(jì)數(shù)據(jù)庫(kù)

?設(shè)計(jì)數(shù)據(jù)庫(kù)名為bbs,有一個(gè)數(shù)據(jù)表為message,里面包含title,lastdate,user,content等字段,分別表示留言標(biāo)題,留言日前,留言人,留言的內(nèi)容

(2)連接頁(yè)面

<?php
$conn = @ mysql_connect("localhost", "root", "123456") or die("數(shù)據(jù)庫(kù)鏈接錯(cuò)誤"); mysql_select_db("bbs", $conn); mysql_query("set names 'GBK'"); //使用GBK中文編碼;
//將空格,換行轉(zhuǎn)換為HTML可解析
function htmtocode($content) {  $content = str_replace("\n", "<br>", str_replace(" ", "&nbsp;", $content)); //兩個(gè)str_replace嵌套
 return $content; }
//$content=str_replace("'","‘",$content);  //htmlspecialchars(); 
?>

(3)顯示頁(yè)面

<?php  
include("conn.php");
$pagesize=2;       
//設(shè)置每頁(yè)顯示2個(gè)記錄 $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).">上一頁(yè)</a> 
 <a href=$url?page=".($pageval+1).">下一頁(yè)</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>時(shí)間:<?php echo $row[lastdate]?></td>
   </tr>
   <tr bgcolor="#eff3ff">
   <td> 用戶(hù):<?php echo $row[user]?></td><td></td>
   </tr>
   <tr>
   <td>內(nèi)容:<?php echo htmtocode($row[content]);?></td>
   </tr>
   <br>
 </table>


繼續(xù)學(xué)習(xí)
||
<?php include 'connection.php'; $count_sql = 'select count(id) as c from user'; $result = mysqli_query($conn, $count_sql); $data = mysqli_fetch_assoc($result); //得到總的用戶(hù)數(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ù)顯示出來(lái) 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'] . '">編輯用戶(hù)</a></td>'; echo '<td><a href="delete.php?id=' . $row['id'] . '">刪除用戶(hù)</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 '沒(méi)有數(shù)據(jù)'; } mysqli_close($conn); ?>
提交重置代碼