2015年4月8日

[教學] PHP & MySQL 學習筆記 第12堂(資料庫建置:設定呈現於頁面的資料筆數)

非常抱歉,關於部落格內 PHP 的部分目前已經停止維護,因本人已經很久沒有寫 PHP ,且文章中所使用的 PHP 版本偏舊,希望有心學習 PHP 的朋友們,可以參考 Codecademy 的課程,或近一步嘗試 Laravel 這個 PHP 框架(可透過 laracasts 學習),若有找不到錯的學習資源也歡迎在留言串分享,方便有需要的人能夠有更多學習的管道!
在這一堂課我們同樣會沿用「 PHP & MySQL 學習筆記 第八堂(phpMyAdmin資料庫建置並呈現於網頁)」所使用的資料庫,這次除了練習將資料庫的資料呈現於網頁上外,也要練習設定每次可以呈現的資料筆數。

這裡可以看到這堂課的結果。

本次會學習到的函數共包含:

mysql_query("select * from 資料表名稱 limit 資料索引 , 顯示筆數"):資料索引的意思是從第幾筆開始,如果是limit 0 , 10,即表示從第一筆資料開始顯示10筆資料(也就是顯示1~10);如果是limit 10, 10,表示從第11筆資料開始顯示10筆資料(也就是顯示11~20)。
ceil( ):無條件進位。

設定每頁顯示的資料筆數
首先,我們同樣使用第八堂課所匯入的資料,為了設定每頁所顯示的資料筆數,我們會用到一個語法:mysql_query("select * from 資料表名稱 limit 資料索引 , 顯示筆數"),如果是limit 0 , 10,即表示從第一筆資料開始顯示10筆資料(也就是顯示1~10);如果是limit 10, 10,表示從第11筆資料開始顯示10筆資料(也就是顯示11~20)。

讓我們來試試看


這麼做就只會呈現前10筆的資料

透過這樣的語法,我們就可以設定每頁要顯示的資料筆數。


接下來,我們就可以設定我們希望呈現的資料筆數,分別設定number、total和pages這幾個變數,其中ceil( )表示的是無條件進位,透過這樣的算出我們總共需要幾頁。

接著,到設計頁面,打「共有頁」


在到程式碼的地方,把裡面插入一段php,叫出共有幾頁


再來,回到設計頁面,我們要建立連結,讓網友可以到不同的頁。我們先打1,同時建立超連結,這裡的超連結要設定一個變數p,如果是第一頁就連到p=1。


接著,再到程式碼頁面,我們來寫一段回圈,這段回圈的用意是,有幾頁,我就跑幾次,
在echo的地方要特別注意,除了內文的地方要改成變數i外,超連結的部分也要記得改成變數i。


到這裡,預覽看看,沒有問題的話,因為我們有三頁,所以下面會出現「123」,而且按1的時候,會連結到p=1,按2就會連結到p=2。


接下來,我們就要利用這個超連結裡面的變數p,來針對不同的頁數就要呈現不同的資料。

這裡我們就要用到剛剛所學的語法 limit 資料索引 , 顯示筆數,可是我們要怎麼知道資料索引是多少呢?

這時候,我們需要思考一下:
如果我想要一次呈現10筆資料(也就是number=10),則顯示的資料數、索引、顯示筆數,將如下:

連結 顯示資料數 索引,顯示筆數
p=1 1~10 0,10
p=2 11~20 10,10
p=3 21~30 20,10

如果我想要一次呈現5筆資料(也就是number=5),則顯示的資料數、索引、顯示筆數,將如下:

連結 顯示資料數 索引,顯示筆數
p=1 1~5 0,5
p=2 6~10 5,5
p=3 11~15 10,5

這時候我們會發現一個規則,也就是索引的值會等於連結(p)減掉1,在乘上顯示筆數(number),因此,我們可以為索引建立一個變數(start),start = (p-1)*number。

因此,我們可以加上這段語法,之所以要用if, isset,是因為我們希望網友是點了下方的頁數之後,才會顯示limit後的結果,否則,一開始因為抓不到p,呈現不出資料來。


但是更好的寫法其實是這樣,如果p沒有東西,則p=1,因為我們希望,網友一進去的時候,不會顯示所有的資料,而是只顯示第一頁的10筆,之後如果要到其他頁在點其他筆資料



點第一頁,就只顯示10筆資料


我們可以再把結果更精緻化一點,利用設計,加入「目前顯示於第頁」,然後過同樣的方法加入php語法,把變數p呼叫在裡面


讓網友自己設定每頁顯示的筆數


最後,我們可以同時搭配上COOKIE,讓網友自行設定想要每次呈現幾筆資料。

首先,在設計的頁面建立一個表單

文字框的名稱取做numpage


接著,我們要寫一段我覺得相當巧妙的語法來設定cookie,這個語法分成兩個部分,
第一個部分:如果原本沒有cookie,則我先幫它一定cookie,複習一下cookie語法:setcookie(檔案名稱,寫入內容,儲存時間),所以我把這個cookie取名叫做set,裡面的預設值是10(也就是網友一進來的時候會以每頁10筆顯示),這個cookie會儲存1分鐘。

第二個部分:如果$_POST['numpage']不是空的(也就是網友有設定過),則根據網友的設定建立cookie。

這兩段語法最後都要記得加上header (),重新導向回原頁面。


這麼做就完成了喔!

這堂課完整的程式碼如下:
<?php
require("connect.php");
if($_COOKIE['set']==''){
 setcookie('set', 10, time()+60);
 header("location:p12.php");
}
if($_POST['numpage']!=''){
 setcookie('set', $_POST['numpage'], time()+60);
 header("location:p12.php");
}
$data=mysql_query("select * from member");//從contact資料庫中選擇所有的資料表
$number=$_COOKIE['set'];//每次要顯示幾筆資料
$total=mysql_num_rows($data);//總共有幾筆資料
$pages=ceil($total/$number);//透過無條件進位法,算出共需要幾頁



//用來呈現資料
$p=$_GET['p'];
if($p == ''){
 $p=1;
}
$start=($p-1)*$number;
$data=mysql_query("select * from member limit $start, $number");

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>根據資料筆數顯示</title>
</head>

<body>
<p>

</p>
<table width="700" border="1" align="center">
   <tr>
    <td >編號</td>
    <td >姓名</td>
    <td >性別</td>
    <td >生日</td>
    <td >地址</td>
    <td >城市</td>
    <td >國籍</td>
    <td>郵遞區號</td>
    <td >電話</td>
    <td>備註</td>
  </tr>
  <?php
  for($i=1;$i<=mysql_num_rows($data);$i++){
$rs=mysql_fetch_row($data);
?>
  <tr>
    <td><?php echo $rs[0]?></td>
    <td><?php echo $rs[1]?></td>
    <td><?php echo $rs[2]?></td>
    <td><?php echo $rs[3]?></td>
    <td><?php echo $rs[4]?></td>
    <td><?php echo $rs[5]?></td>
    <td><?php echo $rs[6]?></td>
    <td><?php echo $rs[7]?></td>
    <td><?php echo $rs[8]?></td>
    <td><?php echo $rs[9]?></td>
  </tr>
   
  <?php
}
?>
</table>
<p align="center">
<?php
for($i=1;$i<=$pages;$i++){
 echo "<a href=p12.php?p=$i>$i</a>";
}
?>
</p>
<form id="form1" name="form1" method="post" action="">
  <div align="center">每次呈現
    <input name="numpage" type="text" id="numpage" size="5" />
  頁 
  <input type="submit" name="button" id="button" value="設定" />
  </div>
</form>
<p align="center">第<?php echo $p?>頁/共有<?php echo $pages?>頁</p>
<p>&nbsp;</p>
</body>
</html>

來看看結果吧


點我看結果





以上內容均為本人在馬老師雲端研究室學習所整理之筆記

0 意見:

張貼留言