[1062] PHP7入門
<?php
function getPageBar($mysqli = '', $sql = "", $show_num = 20, $page_list = 10, $to_page = "", $url_other = "")
{
//die('PHP_SELF:'.$_SERVER['PHP_SELF']);
if (empty($show_num)) {
$show_num = 20;
}
if (empty($page_list)) {
$page_list = 10;
}
$result = $mysqli->query($sql) or die($mysqli->connect_error);
$total = $result->num_rows;
$navbar = new PageBar($total, $show_num, $page_list);
if (!empty($to_page)) {
$navbar->set_to_page($to_page);
}
if (!empty($url_other)) {
$navbar->set_url_other($url_other);
}
$mybar = $navbar->makeBar();
$main['bar'] = "
<div class='row'>
<nav class='mx-auto' id='pagination'>
<ul class='pagination'>
{$mybar['left']}
{$mybar['center']}
{$mybar['right']}
</ul>
</nav>
</div>
";
$main['sql'] = $sql . $mybar['sql'];
$main['total'] = $total;
return $main;
}
class PageBar
{
// 目前所在頁碼
public $current;
// 所有的資料數量 (rows)
public $total;
// 每頁顯示幾筆資料
public $limit = 10;
// 目前在第幾層的頁數選項?
public $pCurrent;
// 總共分成幾頁?
public $pTotal;
// 每一層最多有幾個頁數選項可供選擇,如:3 = {[1][2][3]}
public $pLimit;
// 要使用的 URL 頁數參數名?
public $url_page = "g2p";
// 會使用到的 URL 變數名,給 process_query() 過濾用的。
public $used_query = array();
public $query_str; // 存放 URL 參數列
//指定頁面
public $to_page;
//其他連結參數
public $url_other;
public function __construct($total, $limit = 10, $page_limit)
{
$limit = intval($limit);
//die(var_export($limit));
$mydirname = basename(dirname(__FILE__));
$this->to_page = $_SERVER['PHP_SELF'];
$this->limit = $limit;
$this->total = $total;
$this->pLimit = $page_limit;
}
public function init()
{
$this->used_query = array($this->url_page);
$this->query_str = $this->processQuery($this->used_query);
$this->glue = ($this->query_str == "") ? '?' : '&';
$this->current = (isset($_GET[$this->url_page])) ? intval($_GET[$this->url_page]) : 1;
if ($this->current < 1) {
$this->current = 1;
}
$this->pTotal = ceil($this->total / $this->limit);
$this->pCurrent = ceil($this->current / $this->pLimit);
}
// 處理 URL 的參數,過濾會使用到的變數名稱
public function processQuery($used_query)
{
// 將 URL 字串分離成二維陣列
$QUERY_STRING = htmlspecialchars($_SERVER['QUERY_STRING']);
$vars = explode("&", $QUERY_STRING);
//die(var_export($vars));
for ($i = 0; $i < count($vars); $i++) {
if (substr($vars[$i], 0, 7) == "amp;g2p") {
continue;
}
//echo substr($vars[$i],0,7)."<br>";
$var[$i] = explode("=", $vars[$i]);
}
// 過濾要使用的 URL 變數名稱
for ($i = 0; $i < count($var); $i++) {
for ($j = 0; $j < count($used_query); $j++) {
if (isset($var[$i][0]) && $var[$i][0] == $used_query[$j]) {
$var[$i] = array();
}
}
}
$vars = array();
// 合併變數名與變數值
for ($i = 0; $i < count($var); $i++) {
$vars[$i] = implode("=", $var[$i]);
}
// 合併為一完整的 URL 字串
$processed_query = "";
for ($i = 0; $i < count($vars); $i++) {
$glue = ($processed_query == "") ? '?' : '&';
// 開頭第一個是 '?' 其餘的才是 '&'
if ($vars[$i] != "") {
$processed_query .= $glue . $vars[$i];
}
}
return $processed_query;
}
// 製作 sql 的 query 字串 (LIMIT)
public function sqlQuery()
{
$row_start = ($this->current * $this->limit) - $this->limit;
$sql_query = " LIMIT {$row_start}, {$this->limit}";
return $sql_query;
}
public function set_to_page($page = "")
{
$this->to_page = $page;
}
public function set_url_other($other = "")
{
$this->url_other = $other;
}
// 製作 bar
public function makeBar($url_page = "none")
{
if ($url_page != "none") {
$this->url_page = $url_page;
}
$this->init();
// 取得其他連結參數
$loadtime = $this->url_other;
// 取得目前頁框(層)的第一個頁數啟始值,如 6 7 8 9 10 = 6
$i = ($this->pCurrent * $this->pLimit) - ($this->pLimit - 1);
$bar_center = "";
while ($i <= $this->pTotal && $i <= ($this->pCurrent * $this->pLimit)) {
if ($i == $this->current) {
$bar_center = "
{$bar_center}
<li class='page-item active'>
<a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}={$i}{$loadtime}' title='{$i}' class='page-link'>{$i}<span class='sr-only'>(current)</span></a>
</li>";
} else {
$bar_center .= "
<li class='page-item'>
<a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}={$i}{$loadtime}' title='{$i}' class='page-link'>{$i}</a>
</li>";
}
$i++;
}
$bar_center = $bar_center . "";
// 往前跳一頁
if ($this->current <= 1) {
//$bar_left=$bar_first="";
$bar_left = "<li class='page-item disabled'><a href='#' class='page-link'>‹</a></li>";
$bar_first = "<li class='page-item disabled'><a href='#' class='page-link'>«</a></li>";
} else {
$i = $this->current - 1;
$bar_left = "<li class='page-item'><a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}={$i}{$loadtime}' title='回上頁' class='page-link'>‹</a></li>";
$bar_first = "<li class='page-item'><a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}=1{$loadtime}' title='回第一頁' class='page-link'>«</a></li>";
}
// 往後跳一頁
if ($this->current >= $this->pTotal) {
//$bar_right=$bar_last="";
$bar_right = "<li class='page-item disabled'><a href='#' class='page-link'>›</a></li>";
$bar_last = "<li class='page-item disabled'><a href='#' class='page-link'>»</a></li>";
} else {
$i = $this->current + 1;
$bar_right = "<li class='page-item'><a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}={$i}{$loadtime}' title='下一頁' class='page-link'>›</a></li>";
$bar_last = "<li class='page-item'><a href='{$this->to_page}{$this->query_str}{$this->glue}{$this->url_page}={$this->pTotal}{$loadtime}' title='上一頁' class='page-link'>»</a></li>";
}
// 往前跳一整個頁框(層)
if (($this->current - $this->pLimit) < 1) {
$bar_l = "";
} else {
$i = $this->current - $this->pLimit;
$bar_l = "";
}
//往後跳一整個頁框(層)
if (($this->current + $this->pLimit) > $this->pTotal) {
$bar_r = "";
} else {
$i = $this->current + $this->pLimit;
$bar_r = "";
}
$page_bar['center'] = $bar_center;
$page_bar['left'] = $bar_first . $bar_l . $bar_left;
$page_bar['right'] = $bar_right . $bar_r . $bar_last;
$page_bar['current'] = $this->current;
$page_bar['total'] = $this->pTotal;
$page_bar['sql'] = $this->sqlQuery();
return $page_bar;
}
}