<?php
class getPageData {
var $appConfig ; //應用程式配製資料
var $db ; //資料庫連接對象
var $_pageSize = 20 ; //一頁記錄數(大小)
var $_currentPage = 1 ; //當前頁碼
var $_rowCount = 0 ; //記錄總數
var $_pageCount = 0 ; //總頁數
var $_records ; //當前頁記錄
var $_row=array() ; //當前的記錄資料
var $_currentPageSize ; //當前頁記錄總數
var $_currentPageStartNo ; //當前頁開始記錄號
var $_linkClass; //css的檔案
var $_option ; //處理後的導航條用的資料
var $StrErr = "" ; //存放出錯誤的字串
var $_beforeGetCurrentData=array('eventName'=>'_beforeGetCurrentData','eventType'=>'eventCode','eventCode'=>'') ;//得到當前資料前的事件,即可對$this->_row進行處理
var $_afterGetCurrentData=array('eventName'=>'_afterGetCurrentData','eventType'=>'eventCode','eventCode'=>'') ;//得到當前資料後的事件,即可對$this->_records[$this->_currentPageSize]進行處理
var $_afterGetData=array('eventName'=>'_afterGetData','eventType'=>'eventCode','eventCode'=>'') ;//得到資料後的事件,即可對$this->_records進行處理
/**
* 功能:類的建構函式
*
* @param $pageSize - 每一頁的記錄數,預設為取全部資料
*/
function getPageData($pageSize = false)
{
global $db, $appConfig ,$eventStrCode ;
$this->eventStrCode = $eventStrCode ;
$this->appConfig = $appConfig ;
$this->db = $db ;
if ($pageSize>0) {
$this->_pageSize = $pageSize ;
} else {
$this->_pageSize = $this->appConfig['pageSize'] ;
}
} //end function getPageData
function reset()
{
$this->_records =array();
}
function set_event_code($event_name, $event_code)
{
$event =$this->$event_name ;
$event['eventCode'] =$event_code ;
$this->$event_name =$event ;
}
function set_event_function($event_name, $event_function)
{
$event =$this->$event_name ;
$event['eventFunction'] =$event_function ;
$event['eventType'] = 'eventFunction';
$this->$event_name =$event ;
}
function autoCommit($onoff=false)
{
$this->db->autocommit = $onoff ? true : false;
return DB_OK;
}//end function autoCommit
function commit()
{
$this->db->commit();
}//end function commit
function rollback()
{
$this->db->rollback();
}
/**
* 功能:擷取經解析後的SQL語句,能直接被運行
* 出錯返回假,設定errPage為出錯頁面代碼,否則返回經解析後的sql語句
*
* @param $sql - sql語句模板
* @param $data - 要替換的資料
* @return string
*/
function getPrepareSQL($sql, $data = false)
{
// $db = $this->db ;
// global $error ;
$sth = $this->db->prepare($sql) ;
$realquery = $this->db->executeEmulateQuery($sth, $data);
if ($this->db->isError($realquery)) {
$errData = $sql ;
// $this->errPage = $error->getErrorPage("preparesqlerr", $errData);
return false ;
}
// $this->sql = $realquery ;
return $realquery;
} //end function getPrepareSQL
/**
* 運行操作查詢
*
* @param $sql - 運行sql動作陳述式
* @return boolean
*/
function execute($sql, $pageSize=false)
{
// $db = $this->db ;
// global $error ;
//echo $this->db->autocommit.'**********' ;
if (is_array($sql) == true) { // 如果sql是數組語句
//$this->autoCommit(false);
foreach ($sql as $val) {
$result = $this->db->simpleQuery($val);
if ($this->db->isError($result)) {
$this->rollback();
$errData = $val ;
//echo $val;
// 顯示出錯資訊
// $this->errPage = $error->getErrorPage("runsqlerr", $errData);
return false ;
}
}
if(true==$this->db->autocommit) $this->commit() ;
return true ;
}
// 如果不是數組,則會執行下面的代碼
$result = $this->db->simpleQuery($sql);
if ($this->db->isError($result)) {
// $this->db->rollback();
$errData = $sql ;
// $this->errPage = $error->getErrorPage("runsqlerr", $errData);
$this->rollback();
return false ;
} else {
if(true==$this->db->autocommit) $this->commit() ;
return true ;
}
} //end function execute
/**
* 查詢一個記錄是否存在於Table中,StrSQLWhere為查詢的條件
* 輸出:
* 傳回值記錄總數,如果不存在,則返回假值(false)
*/
function isRecordInTable ($table, $field, $val)
{
// $db = $this->db ;
$sql = "select * from $table " ;
$sql .= " where $field='" . $val . "'" ;
$res = $this->db->query($sql);
if ($this->db->isError($res)) {
return false ;
}
$rows = $res->numRows();
if ($rows <= 0) {
return false;
} else {
return $rows;
}
} //End function RecordIsInTable ($Table, $StrSQLWhere)
/**
* 判斷是否有下一頁
*/
function hasNextPage()
{
return $this->_currentPage < $this->_pageCount;
}
/**
* 取得下一頁頁碼
*/
function getNextPageNo()
{
return $this->_currentPage + 1;
}
/**
* 判斷是否有上一頁
*/
function hasPriorPage()
{
if ($this->_pageCount > 0) {
return $this->_currentPage > 1;
} else {
return false;
}
}
/**
* 取得上一頁頁碼
*/
function getPriorPageNo()
{
return $this->_currentPage - 1;
}
/**
* 判斷是否第一頁
*/
function isFirstPage()
{
return $this->_currentPage == 1 || $this->_pageCount == 0;
}
/**
* 判斷是否最後一頁
*/
function isLastPage()
{
return $this->_currentPage == $this->_pageCount || $this->_pageCount == 0;
}
/**
* 裝載某一頁資料,成功則返回true,失敗則返回false
*
* 有一個參數為目前記錄所有欄位的值(一個以欄位名為索引的數組)
*/
function query($sql, $_pageSize = 0,$ispage=true)
{
$this->reset();
// global $HTTP_GET_VARS;
// 頁大小和當前頁碼必須>=1
$this->_currentPage = max((int)@$_GET['pageID'], 1);
//如果不需要分頁
if($ispage=false) $this->_currentPage=1 ;
$this->_perPage = 2;
if ($_pageSize >0) {
$this->_pageSize = $_pageSize;
} else {
$_pageSize = $this->_pageSize;
}
// 解析SQL語句
$res = $this->db->query($sql);
if ($this->db->isError($res))
{
$this->_records = array() ;
$this->_rowCount = 0;
$this->_pageCount = 0;
return false;
}
// 計算出記錄總數和頁總數
$this->_rowCount = $res->numRows() ;
// print_r($res->numRows()) ;// ."test<br>" ;
$this->_itemData = range(1, $this->_rowCount);
/*
echo $this->_rowCount;
echo "===<br>---";
echo $this->_pageSize;
*/
$this->_pageCount = ceil($this->_rowCount / $this->_pageSize);
if ($this->_currentPage > $this->_pageCount) {
$this->_currentPage = $this->_pageCount;
}
if ($this->_rowCount == 0) {
$this->_currentPage = 0;
return false ;
}
$this->_records = array();
// 將游標移動到指定頁的第一條記錄前
$this->_currentPageStartNo = ($this->_currentPage - 1) * $this->_pageSize + 1;
$firstRowNo = $this->_currentPageStartNo;
while (--$firstRowNo > 0 && $res->fetchRow()) // $this->_rowCount++;
// 取出指定頁的資料
$read = 0;
$this->_currentPageSize = 0;
while ($read < $this->_pageSize && $this->_row = $res->fetchRow()) {
$this->_currentPageSize++ ;
/*
開始 _beforeGetCurrentData事件
得到當前資料前的事件,即可對$row進行處理
*/
extract($this->_beforeGetCurrentData,EXTR_REFS) ;
switch ($eventType) {
case 'eventCode':
if(true==$eventCode)
{
@eval($eventCode);
}
break ;
case 'eventFunction':
// print "i equals 1";
$eventFunction($this);
break;
case 'eventMethod ':
//print "i equals 2";
break;
}
//結束 _beforeGetCurrentData事件
//runEvent($this->_beforeGetCurrentData,$this);
$this->_records[$this->_currentPageSize] = $this->_row;
/*
開始 _afterGetCurrentData事件
得到當前資料後的事件,即可對$this->_records[$this->_currentPageSize]進行處理
*/
extract($this->_afterGetCurrentData,EXTR_REFS) ;
switch ($eventType) {
case 'eventCode':
if(true==$eventCode)
{
@eval($eventCode);
}
break ;
case 'eventFunction':
// print "i equals 1";
$eventFunction($this);
break;
case 'eventMethod ':
//print "i equals 2";
break;
}
//結束_afterGetCurrentData事件
//runEvent($this->_afterGetCurrentData,$this);
//require'event.php' ;
// $this->_rowCount++;
$read++;
}
/*
開始 _afterGetData事件
得到資料後的事件,即可對$this->_records進行處理
*/
//runEvent($this->_afterGetData,$this);
extract($this->_afterGetData,EXTR_REFS) ;
switch ($eventType) {
case 'eventCode':
if(true==$eventCode)
{
@eval($eventCode);
}
break ;
case 'eventFunction':
// print "i equals 1";
break;
case 'eventMethod ':
//print "i equals 2";
break;
}
//結束 _afterGetData事件
// 釋放資源
return true;
}
/**
* 得到頁面導航條的HTML代碼
*
* @return string
* @roseuid 3CFA0B7A0151
*/
function getPageNav()
{
$this->getLinks() ;
extract($this->_option) ;
//$nav = "共$pageCount*頁 $rowCount*條記錄 *每頁$pageSize*條 當前第$currentPage".$this->_getListLinkUrl() ."*頁 $first $back $next $last" ;
$nav = "共$pageCount*頁 $rowCount*條記錄 *每頁$pageSize*條 當前第".$this->_getListLinkUrl() ."*頁 $first $back $next $last" ;
$nav = str_replace("*", "", $nav);
return $nav ;
} //end function getPageNav
/**
* Returns the correct link for the back/pages/next links
*
* @return string Url
*/
function _getLinksUrl()
{
// global $HTTP_SERVER_VARS;
// Sort out query string to prevent messy urls
$querystring = array();
$qs = array();
if (!empty($_SERVER['QUERY_STRING'])) {
$qs = explode('&', $_SERVER['QUERY_STRING']);
for ($i = 0, $cnt = count($qs); $i < $cnt; $i++) {
list($name, $value) = explode('=', $qs[$i]);
if ($name != 'pageID') {
$qs[$name] = $value;
}
unset($qs[$i]);
}
}
foreach ($qs as $name => $value) {
$querystring[] = $name . '=' . $value;
}
return $_SERVER['SCRIPT_NAME'] . '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . 'pageID=';
}
function _getListLinkUrl()
{
$nav = '
<select onchange="location.href=/''.$this->_getLinksUrl().'/'+this.value;">
<script language="JavaScript">
<!--
for(i=1; i<='.$this->_pageCount.'; i++) {
document.write("<option value="+i+(i=='.$this->_currentPage.'? " selected":"")+">"+i+"</option>");
}
//-->
</script>
</select>';
return $nav;
}
/**
* Returns back link
*
* @param $url URL to use in the link
* @param $link HTML to use as the link
* @return string The link
*/
function _getBackLink($url, $link = '<<')
{
// Back link
if ($this->hasPriorPage()) {
$back = sprintf('<a href="%s%d" %s>%s</a>',
$url,
$this->_currentPage - 1,
!empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
$link);
} else {
// $back = ' ';
$back = '上頁';
}
return $back;
}
/**
* Returns first link
*
* @param $url URL to use in the link
* @param $link HTML to use as the link
* @return string The link
*/
function _getFirtLink($url, $link = '|<<')
{
if ($this->isFirstPage()) {
//$first = " ";
$first = "首頁";
} else {
$first = sprintf('<a href="%s%d" %s>%s</a>',
$url,
1,
!empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
$link);
}
return $first;
}
/**
* Returns last link
*
* @param $url URL to use in the link
* @param $link HTML to use as the link
* @return string The link
*/
function _getLastLink($url, $link = '>>|')
{
if ($this->isLastPage()) {
//$last = " ";
$last = "尾頁";
} else {
$last = sprintf('<a href="%s%d" %s>%s</a>',
$url,
$this->_pageCount,
!empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
$link);
}
return $last;
}
/**
* Returns next link
*
* @param $url URL to use in the link
* @param $link HTML to use as the link
* @return string The link
*/
function _getNextLink($url, $link = '>>')
{
if ($this->hasNextPage()) {
$next = sprintf('<a href="%s%d" %s>%s</a>',
$url,
$this->_currentPage + 1,
!empty($this->_linkClass) ? 'class="' . $this->_linkClass . '"' : '',
$link);
} else {
//$next = ' ';
$next = '下頁';
}
return $next;
}
/**
* Returns first/back/next/last and page links
*
* @param $first_html HTML to put inside the first link
* @param $back_html HTML to put inside the back link
* @param $next_html HTML to put inside the next link
* @param $last_html HTML to put inside the last link
* @return array Back/pages/next links
*/
function getLinks($first_html = '首頁', $back_html = '上頁', $next_html = '下頁', $last_html = '尾頁')
{
$url = $this->_getLinksUrl();
$first = $this->_getFirtLink($url, $first_html);
$back = $this->_getBackLink($url, $back_html);
// $pages = $this->_getPageLinks($url);
$next = $this->_getNextLink($url, $next_html);
$last = $this->_getLastLink($url, $last_html);
$this->_option = array('url' => $url, 'pageCount' => $this->_pageCount, 'pageSize' => $this->_pageSize,
'currentPage' => $this->_currentPage, 'rowCount' => $this->_rowCount,
$pages, $next, $last, 'first' => $first, 'back' => $back,
'pages' => $pages, 'next' => $next, 'last' => $last);
return $this->_option ;
}
/**
*
* @return array pagerecords
*/
function getData()
{
if(0==count($this->_records)){
return false ;
}else{
return $this->_records ;
}
}
}
?>