iT邦幫忙

DAY 10
6

遭遇PHP之經驗分享系列 第 10

[鐵人賽Day10]PHP簡易分頁實作

繼上篇「[鐵人賽Day9]計算MySQL資料庫回傳資料筆數
有提到mysql_num_rows函式,就在聯想什麼地方可以用到
頭一個想到的就是做分頁,那今天就做個PHP的簡易分頁吧

今天會用到的函式有這些(先前提過的不列出):ceil()、isset()、intval()
將在下面做功能說明,但讓我鋪下一篇的內容一下,所以isset()在此處暫時不解說

ceil():取得不小於值的下一個整數
使用方法:ceil ( float $value )
例如說:18/4=4.5,那經過ceil()就等於5
想實際操作看看的讀者可以把以下程式碼複製起來執行:

<?php
    echo ceil(18/4);
?>

(參考資料:http://php.net/manual/en/function.ceil.php)

intval():使用指定的base做為轉換的基底(預設值為10),並回傳數值var的整數值,在物件不能使用此函式,不然會產生E_NOTICE錯誤並回傳1
使用方法:intval ( mixed $var )
(參考資料:http://php.net/manual/en/function.intval.php)

而今天運用這幾個函式,實作了一下PHP分頁的功能
資料庫名稱為:ithome_test
並建立資料表:good_idea
欄位有id(int(2))跟name(varchar(50))

實作程式碼如下(已寫註解說明):
「pages.php」

<?php
    //資料庫連結
    $conn=mysql_connect('127.0.0.1','root','') or die("Error");
    mysql_select_db('ithome_test');
    $sql = "SELECT * FROM `good_idea` ORDER BY `id`"; //修改成你要的 SQL 語法
    $result = mysql_query($sql,$conn) or die("Error");

    $data_nums = mysql_num_rows($result); //統計總比數
    $per = 5; //每頁顯示項目數量
    $pages = ceil($data_nums/$per); //取得不小於值的下一個整數
    if (!isset($_GET["page"])){ //假如$_GET["page"]未設置
        $page=1; //則在此設定起始頁數
    } else {
        $page = intval($_GET["page"]); //確認頁數只能夠是數值資料
    }
    $start = ($page-1)*$per; //每一頁開始的資料序號
    $result = mysql_query($sql.' LIMIT '.$start.', '.$per,$conn) or die("Error");
?>

<table>
<tr>
    <td style="text-align: center;">編號</td>
    <td style="text-align: center;">姓名</td>
</tr>
<?php
//輸出資料內容
while ($row = mysql_fetch_array ($result))
{
    $id=$row['id'];
    $name=$row['name'];
    ?>
    
    <tr>
        <td style="text-align: center;"><?php echo $id; ?></td>
        <td style="text-align: center;"><?php echo $name; ?></td>
    </tr>

<?php 
    }
?>
</table>

<br />

<?php
    //分頁頁碼
    echo '共 '.$data_nums.' 筆-在 '.$page.' 頁-共 '.$pages.' 頁';
    echo "<br /><a href=?page=1>首頁</a> ";
    echo "第 ";
    for( $i=1 ; $i<=$pages ; $i++ ) {
        if ( $page-3 < $i && $i < $page+3 ) {
            echo "<a href=?page=".$i.">".$i."</a> ";
        }
    } 
    echo " 頁 <a href=?page=".$pages.">末頁</a><br /><br />";
?>

上一篇
[鐵人賽Day9]計算MySQL資料庫回傳資料筆數
下一篇
[鐵人賽Day11]在PHP中isset、empty、is_null的使用差別
系列文
遭遇PHP之經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
SunAllen
iT邦研究生 1 級 ‧ 2015-10-13 21:08:46

謝謝大大分享! 謝謝謝謝

目前正在寫分頁這個功能,google 搜尋您是第一筆,讚!

Old Siao iT邦研究生 1 級 ‧ 2015-10-15 14:10:01 檢舉

謝謝您的觀看與鼓勵謝謝

不介意小弟分享的技術短淺的話(真的完全沒有深度...(默))
歡迎來我的部落格參觀一下,技術交流
OS隨手筆記
http://www.dotblogs.com.tw/jhsiao/

SunAllen iT邦研究生 1 級 ‧ 2018-11-11 15:32:33 檢舉

Old Siao大大,哇哇,現在看到,才回想起來...當年您的文章,讓小弟獲益良多。

今年,您的老蕭咖啡館...每天都在追啊XD

0
pratnket
iT邦新手 5 級 ‧ 2017-02-13 23:45:59

感謝大大的教學
http://ithelp.ithome.com.tw/articles/10189198
我有順便把大大的作成物件導向了

PS~因為我算是全端美工 所已程式碼比較沒有系統化唷

Old Siao iT邦研究生 1 級 ‧ 2017-02-14 10:12:37 檢舉

剛看了您寫的文章,真的很棒/images/emoticon/emoticon34.gif
各個地方都很清楚的說明了出來呢
我也是前後端的全端攻城師/images/emoticon/emoticon28.gif歡迎一起交流唷/images/emoticon/emoticon41.gif

pratnket iT邦新手 5 級 ‧ 2017-02-14 10:49:32 檢舉

其實以前本職是畫3D的就是了...![/images/emoticon/emoticon10.gif]
(/images/emoticon/emoticon10.gif)
我也在IT幫學習了很多就是了

0
nice790812
iT邦見習生 ‧ 2018-06-04 23:10:22

這個可以用兩個sql語法嗎

Old Siao iT邦研究生 1 級 ‧ 2018-06-05 12:00:30 檢舉

抓取資料時,使用SQL JOIN語法吧

參考資料:
JOIN 連接 (SQL JOIN)
https://www.fooish.com/sql/join.html

0
a0955018616
iT邦新手 5 級 ‧ 2018-11-11 15:26:19

你好 我目前使用php7來撰寫
但發現
$result = mysqli_query($sql.' LIMIT '.$start.', '.$per,$conn) or die("Error");
錯誤了

可以請教問題以及這句的用法為何呢?

看更多先前的回應...收起先前的回應...
Old Siao iT邦研究生 1 級 ‧ 2018-11-11 17:43:10 檢舉

請問可否提供一下錯誤訊息呢?
謝謝

Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\xampp\htdocs\picture.php on line 32
Error
你好 他目前就是出現錯誤的樣子 但是其他code沒出現問題

這段是我顯示資料的code 麻煩您了 謝謝
另外想請教寫兩個$result不會有衝突問題嗎

Old Siao iT邦研究生 1 級 ‧ 2018-11-12 09:43:49 檢舉

我這篇時間已久,是使用mysql語法版本,目前PHP版本皆改為使用mysqli的語法唷
可參考以下討論連結:https://stackoverflow.com/questions/26639619/warning-mysqli-query-expects-parameter-1-to-be-mysqli-string-given-in

Old Siao iT邦研究生 1 級 ‧ 2018-11-12 09:47:14 檢舉
$conn = mysqli_connect("localhost","username","password","dbname");
$sql = "Select * FROM ...";
$result = mysqli_query($conn, $sql);
Old Siao iT邦研究生 1 級 ‧ 2018-11-12 09:48:36 檢舉

寫兩個$result不會衝突啊,只是因為變數都一樣,後者會把前者給取代掉
要兩個都留,就把變數調整為不一樣吧,EX:$result2

那請問 第二個 $result 中放入 LIMIT的作用是什麼呢?

Old Siao iT邦研究生 1 級 ‧ 2018-11-14 09:43:02 檢舉

第幾筆資料開始後取幾筆資料
這篇網友寫的文章紀錄可以看一下唷
http://bjstation.pixnet.net/blog/post/30083625-%5Bsql%5D-limit-%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95

0
rtfgvb74125
iT邦新手 4 級 ‧ 2019-10-28 17:00:48

您好
想請問大大,大大寫的

$pages = ceil($data_nums/$per); //取得不小於值的下一個整數
    if (!isset($_GET["page"])){ //假如$_GET["page"]未設置
        $page=1; //則在此設定起始頁數
    } else {
        $page = intval($_GET["page"]); //確認頁數只能夠是數值資料
    }

裡面的page是從何得到的,有點看不懂

Old Siao iT邦研究生 1 級 ‧ 2019-10-29 16:12:28 檢舉
if (!isset($_GET["page"])){ //假如$_GET["page"]未設置
   $page=1; //則在此設定起始頁數
}

//假如$_GET["page"]未設置
則為第一頁(起始頁數)

而下方有段

<?php
    //分頁頁碼
    echo '共 '.$data_nums.' 筆-在 '.$page.' 頁-共 '.$pages.' 頁';
    echo "<br /><a href=?page=1>首頁</a> ";
    echo "第 ";
    for( $i=1 ; $i<=$pages ; $i++ ) {
        if ( $page-3 < $i && $i < $page+3 ) {
            echo "<a href=?page=".$i.">".$i."</a> ";
        }
    } 
    echo " 頁 <a href=?page=".$pages.">末頁</a><br /><br />";
?>

其中有段
echo " 頁 <a href=?page=".$pages.">末頁
這裡面就有page參數

感謝大大細心講解

我要留言

立即登入留言