A. php鍒嗛〉鏄劇ず鍒朵綔璇﹁В
銆銆 鍓嶈█
銆銆鍒嗛〉鏄劇ず鏄涓縐嶉潪甯稿父瑙佺殑嫻忚堝拰鏄劇ず澶ч噺鏁版嵁鐨勬柟娉 灞炰簬web緙栫▼涓鏈甯稿勭悊鐨勪簨浠朵箣涓 瀵逛簬web緙栫▼鐨勮佹墜鏉ヨ 緙栧啓榪欑嶄唬鐮佸疄鍦ㄦ槸鍜屽懠鍚鎬竴鏍瘋嚜鐒 浣嗘槸瀵逛簬鍒濆﹁呮潵璇 甯稿父瀵硅繖涓闂棰樻懜涓嶈憲澶寸華 鍥犳ょ壒鍦版挵鍐欐ゆ枃瀵硅繖涓闂棰樿繘琛岃︾粏鐨勮茶В 鍔涙眰璁╃湅瀹岃繖綃囨枃絝犵殑鏈嬪弸鍦ㄧ湅瀹屼互鍚庡逛簬鍒嗛〉鏄劇ず鐨勫師鐞嗗拰瀹炵幇鏂規硶鏈夋墍浜嗚В 鏈鏂囬傚悎鍒濆﹁呴槄璇 鎵鏈夌ず渚嬩唬鐮佸潎浣跨敤php緙栧啓
銆銆 鍘熺悊
銆銆鎵璋撳垎欏墊樉紺 涔熷氨鏄灝嗘暟鎹搴撲腑鐨勭粨鏋滈泦浜轟負鐨勫垎鎴愪竴孌典竴孌電殑鏉ユ樉紺 榪欓噷闇瑕佷袱涓鍒濆嬬殑鍙傛暟
銆銆姣忛〉澶氬皯鏉¤板綍($PageSize)?
銆銆褰撳墠鏄絎鍑犻〉($CurrentPageID)?
銆銆鐜板湪鍙瑕佸啀緇欐垜涓涓緇撴灉闆 鎴戝氨鍙浠ユ樉紺烘煇孌電壒瀹氱殑緇撴灉鍑烘潵
銆銆鑷充簬鍏朵粬鐨勫弬鏁 姣斿 涓婁竴欏($PReviousPageID) 涓嬩竴欏($NextPageID) 鎬婚〉鏁($numPages)絳夌瓑 閮藉彲浠ユ牴鎹鍓嶈竟榪欏嚑涓涓滆タ寰楀埌
銆銆浠MySQL鏁版嵁搴撲負渚 濡傛灉瑕佷粠琛ㄥ唴鎴鍙栨煇孌靛唴瀹 sql璇鍙ュ彲浠ョ敤 select * from table limit offset rows 鐪嬬湅涓嬮潰涓緇剆ql璇鍙 灝濊瘯涓涓嬪彂鐜板叾涓鐨勮勭巼
銆銆鍓 鏉¤板綍 select * from table limit
銆銆絎 鑷 鏉¤板綍 select * from table limit
銆銆絎 鑷 鏉¤板綍 select * from table limit
銆銆鈥︹
銆銆榪欎竴緇剆ql璇鍙ュ叾瀹炲氨鏄褰$PageSize= 鐨勬椂鍊欏彇琛ㄥ唴姣忎竴欏墊暟鎹鐨剆ql璇鍙 鎴戜滑鍙浠ユ葷粨鍑鴻繖鏍蜂竴涓妯℃澘
銆銆select * from table limit ($CurrentPageID ) * $PageSize $PageSize
銆銆鎷胯繖涓妯℃澘浠e叆瀵瑰簲鐨勫煎拰涓婅竟閭d竴緇剆ql璇鍙ュ圭収涓涓嬬湅鐪嬫槸涓嶆槸閭d箞鍥炰簨 鎼炲畾浜嗘渶閲嶈佺殑濡備綍鑾峰彇鏁版嵁鐨勯棶棰樹互鍚 鍓╀笅鐨勫氨浠呬粎鏄浼犻掑弬鏁 鏋勯犲悎閫傜殑sql璇鍙ョ劧鍚庝嬌鐢╬hp浠庢暟鎹搴撳唴鑾峰彇鏁版嵁騫舵樉紺轟簡 浠ヤ笅鎴戝皢鐢ㄥ叿浣撲唬鐮佸姞浠ヨ存槑
銆銆 綆鍗曚唬鐮
銆銆璇瘋︾粏闃呰諱互涓嬩唬鐮 鑷宸辮皟璇曡繍琛屼竴嬈 鏈濂芥妸瀹冧慨鏀逛竴嬈 鍔犱笂鑷宸辯殑鍔熻兘 姣斿傛悳緔㈢瓑絳
銆銆 <?php
銆銆// 寤虹珛鏁版嵁搴撹繛鎺
銆銆$link = mysql_connect("localhost", "mysql_user", "mysql_passWord")
銆銆or die("Could not connect: " . mysql_error());
銆銆// 鑾峰彇褰撳墠欏墊暟
銆銆if( isset($_GET['page']) ){
銆銆$page = intval( $_GET['page'] );
銆銆}
銆銆else{
銆銆$page = 1;
銆銆}
銆銆// 姣忛〉鏁伴噺
銆銆$PageSize = 10;
銆銆// 鑾峰彇鎬繪暟鎹閲
銆銆$sql = "select count(*) as amount from table";
銆銆$result = mysql_query($sql);
銆銆$row = mysql_fetch_row($result);
銆銆$amount = $row['amount'];
銆銆// 璁扮畻鎬誨叡鏈夊氬皯欏
銆銆if( $amount ){
銆銆if( $amount < $page_size ){ $page_count = 1; } //濡傛灉鎬繪暟鎹閲忓皬浜$PageSize錛岄偅涔堝彧鏈変竴欏
銆銆if( $amount % $page_size ){ //鍙栨繪暟鎹閲忛櫎浠ユ瘡欏墊暟鐨勪綑鏁
銆銆$page_count = (int)($amount / $page_size) + 1; //濡傛灉鏈変綑鏁幫紝鍒欓〉鏁扮瓑浜庢繪暟鎹閲忛櫎浠ユ瘡欏墊暟鐨勭粨鏋滃彇鏁村啀鍔犱竴
銆銆}else{
銆銆$page_count = $amount / $page_size; //濡傛灉娌℃湁浣欐暟錛屽垯欏墊暟絳変簬鎬繪暟鎹閲忛櫎浠ユ瘡欏墊暟鐨勭粨鏋
銆銆}
銆銆}
銆銆else{
銆銆$page_count = 0;
銆銆}
銆銆// 緲婚〉閾炬帴
銆銆$page_string = ''
銆銆if( $page == 1 ){
銆銆$page_string .= '絎涓欏祙涓婁竴欏祙'
銆銆}
銆銆else{
銆銆$page_string .= '<a href=?page=1>絎涓欏</a>|<a .($page-1).'>涓婁竴欏</a>|' }
銆銆if( ($page == $page_count) || ($page_count == 0) ){
銆銆$page_string .= '涓嬩竴欏祙灝鵑〉'
銆銆}
銆銆else{
銆銆$page_string .= '<a .($page+1).'>涓嬩竴欏</a>|<a .$page_count.'>灝鵑〉</a>' }
銆銆// 鑾峰彇鏁版嵁錛屼互浜岀淮鏁扮粍鏍煎紡榪斿洖緇撴灉
銆銆if( $amount ){
銆銆$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
銆銆$result = mysql_query($sql);
銆銆while ( $row = mysql_fetch_row($result) ){
銆銆$rowset[] = $row;
銆銆}
銆銆}else{
銆銆$rowset = array();
銆銆}
銆銆// 娌℃湁鍖呭惈鏄劇ず緇撴灉鐨勪唬鐮侊紝閭d笉鍦ㄨㄨ鴻寖鍥達紝鍙瑕佺敤foreach灝卞彲浠ュ緢綆鍗曠殑鐢ㄥ緱鍒扮殑浜岀淮鏁扮粍鏉ユ樉紺虹粨鏋
銆銆?>
銆銆4銆丱O椋庢牸浠g爜
銆銆浠ヤ笅浠g爜涓鐨勬暟鎹搴撹繛鎺ユ槸浣跨敤鐨刾ear db綾昏繘琛屽勭悊
銆銆 <?php
銆銆// FileName: Pager.class.php
銆銆// 鍒嗛〉綾伙紝榪欎釜綾諱粎浠呯敤浜庡勭悊鏁版嵁緇撴瀯錛屼笉璐熻矗澶勭悊鏄劇ず鐨勫伐浣
銆銆Class Pager
銆銆{
銆銆var $PageSize; //姣忛〉鐨勬暟閲
銆銆var $CurrentPageID; //褰撳墠鐨勯〉鏁
銆銆var $NextPageID; //涓嬩竴欏
銆銆var $PreviousPageID; //涓婁竴欏
銆銆var $numPages; //鎬婚〉鏁
銆銆var $numItems; //鎬昏板綍鏁
銆銆var $isFirstPage; //鏄鍚︾涓欏
銆銆var $isLastPage; //鏄鍚︽渶鍚庝竴欏
銆銆var $sql; //sql鏌ヨ㈣鍙
銆銆function Pager($option)
銆銆{
銆銆global $db;
銆銆$this->_setOptions($option);
銆銆// 鎬繪潯鏁
銆銆if ( !isset($this->numItems) )
銆銆{
銆銆$res = $db->query($this->sql);
銆銆$this->numItems = $res->numRows();
銆銆}
銆銆// 鎬婚〉鏁
銆銆if ( $this->numItems > 0 )
銆銆{
銆銆if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
銆銆if ( $this->numItems % $this->PageSize )
銆銆{
銆銆$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
銆銆}
銆銆else
銆銆{
銆銆$this->numPages = $this->numItems / $this->PageSize;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆$this->numPages = 0;
銆銆}
銆銆switch ( $this->CurrentPageID )
銆銆{
銆銆case $this->numPages == 1:
銆銆$this->isFirstPage = true;
銆銆$this->isLastPage = true;
銆銆break;
銆銆case 1:
銆銆$this->isFirstPage = true;
銆銆$this->isLastPage = false;
銆銆break;
銆銆case $this->numPages:
銆銆$this->isFirstPage = false;
銆銆$this->isLastPage = true;
銆銆break;
銆銆default:
銆銆$this->isFirstPage = false;
銆銆$this->isLastPage = false;
銆銆}
銆銆if ( $this->numPages > 1 )
銆銆{
銆銆if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
銆銆if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
銆銆}
銆銆return true;
銆銆}
銆銆/***
銆銆*
銆銆* 榪斿洖緇撴灉闆嗙殑鏁版嵁搴撹繛鎺
銆銆* 鍦ㄧ粨鏋滈泦姣旇緝澶х殑鏃跺欏彲浠ョ洿鎺ヤ嬌鐢ㄨ繖涓鏂規硶鑾峰緱鏁版嵁搴撹繛鎺ワ紝鐒跺悗鍦ㄧ被涔嬪栭亶鍘嗭紝榪欐牱寮閿杈冨皬
銆銆* 濡傛灉緇撴灉闆嗕笉鏄寰堝ぇ錛屽彲浠ョ洿鎺ヤ嬌鐢╣etPageData鐨勬柟寮忚幏鍙栦簩緇存暟緇勬牸寮忕殑緇撴灉
銆銆* getPageData鏂規硶涔熸槸璋冪敤鏈鏂規硶鏉ヨ幏鍙栫粨鏋滅殑
銆銆*
銆銆***/
銆銆function getDataLink()
銆銆{
銆銆if ( $this->numItems )
銆銆{
銆銆global $db;
銆銆$PageID = $this->CurrentPageID;
銆銆$from = ($PageID - 1)*$this->PageSize;
銆銆$count = $this->PageSize;
銆銆$link = $db->limitQuery($this->sql, $from, $count); //浣跨敤Pear DB::limitQuery鏂規硶淇濊瘉鏁版嵁搴撳吋瀹規
銆銆return $link;
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆/***
銆銆*
銆銆* 浠ヤ簩緇存暟緇勭殑鏍煎紡榪斿洖緇撴灉闆
銆銆*
銆銆***/
銆銆function getPageData()
銆銆{
銆銆if ( $this->numItems )
銆銆{
銆銆if ( $res = $this->getDataLink() )
銆銆{
銆銆if ( $res->numRows() )
銆銆{
銆銆while ( $row = $res->fetchRow() )
銆銆{
銆銆$result[] = $row;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆$result = array();
銆銆}
銆銆return $result;
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆function _setOptions($option)
銆銆{
銆銆$allow_options = array(
銆銆'PageSize',
銆銆'CurrentPageID',
銆銆'sql',
銆銆'numItems'
銆銆);
銆銆foreach ( $option as $key => $value )
銆銆{
銆銆if ( in_array($key, $allow_options) && ($value != null) )
銆銆{
銆銆$this->$key = $value;
銆銆}
銆銆}
銆銆return true;
銆銆}
銆銆}
銆銆?>
銆銆 <?php
銆銆// FileName: test_pager.php
銆銆// 榪欐槸涓孌電畝鍗曠殑紺轟緥浠g爜錛屽墠杈圭渷鐣ヤ簡浣跨敤pear db綾誨緩絝嬫暟鎹搴撹繛鎺ョ殑浠g爜
銆銆require "Pager.class.php";
銆銆if ( isset($_GET['page']) )
銆銆{
銆銆$page = (int)$_GET['page'];
銆銆}
銆銆else
銆銆{
銆銆$page = 1;
銆銆}
銆銆$sql = "select * from table order by id";
銆銆$pager_option = array(
銆銆"sql" => $sql,
銆銆"PageSize" => 10,
銆銆"CurrentPageID" => $page
銆銆);
銆銆if ( isset($_GET['numItems']) )
銆銆{
銆銆$pager_option['numItems'] = (int)$_GET['numItems'];
銆銆}
銆銆$pager = @new Pager($pager_option);
銆銆$data = $pager->getPageData();
銆銆if ( $pager->isFirstPage )
銆銆{
銆銆$turnover = "棣栭〉|涓婁竴欏祙";
銆銆}
銆銆else
銆銆{
銆銆$turnover = "<a ?page=1&numItems=".$pager->numItems."'>棣栭〉</a>|<a ?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>涓婁竴欏</a>|"; }
銆銆if ( $pager->isLastPage )
銆銆{
銆銆$turnover .= "涓嬩竴欏祙灝鵑〉";
銆銆}
銆銆else
銆銆{
銆銆$turnover .="<a ?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>涓嬩竴欏</a>|<a ?page=".$pager->numPages."&numItems=".$pager->numItems."'>灝鵑〉</a>"; }
銆銆?>
銆銆闇瑕佽存槑鐨勫湴鏂規湁涓や釜錛
銆銆榪欎釜綾諱粎浠呭勭悊鏁版嵁錛屽苟涓嶈礋璐e勭悊鏄劇ず錛屽洜涓烘垜瑙夊緱灝嗘暟鎹鐨勫勭悊鍜岀粨鏋滅殑鏄劇ず閮芥斁鍒頒竴涓綾婚噷杈瑰疄鍦ㄦ槸鏈変簺鍕夊己銆俆w.wINgWIT鏄劇ず鐨勬椂鍊欐儏鍐靛拰瑕佹眰澶氬彉錛屼笉濡傝嚜宸辨牴鎹綾葷粰鍑虹殑緇撴灉澶勭悊錛屾洿濂界殑鏂規硶鏄鏍規嵁榪欎釜Pager綾葷戶鎵誇竴涓鑷宸辯殑瀛愮被鏉ユ樉紺轟笉鍚岀殑鍒嗛〉錛屾瘮濡傛樉紺虹敤鎴峰垎欏靛垪琛ㄥ彲浠ワ細
銆銆 <?php
銆銆Class MemberPager extends Pager
銆銆{
銆銆function showMemberList()
銆銆{
銆銆global $db;
銆銆$data = $this->getPageData();
銆銆// 鏄劇ず緇撴灉鐨勪唬鐮
銆銆// ......
銆銆}
銆銆}
銆銆/// 璋冪敤
銆銆if ( isset($_GET['page']) )
銆銆{
銆銆$page = (int)$_GET['page'];
銆銆}
銆銆else
銆銆{
銆銆$page = 1;
銆銆}
銆銆$sql = "select * from members order by id";
銆銆$pager_option = array(
銆銆"sql" => $sql,
銆銆"PageSize" => 10,
銆銆"CurrentPageID" => $page
銆銆);
銆銆if ( isset($_GET['numItems']) )
銆銆{
銆銆$pager_option['numItems'] = (int)$_GET['numItems'];
銆銆}
銆銆$pager = @new MemberPager($pager_option);
銆銆$pager->showMemberList();
銆銆?>
銆銆絎浜屼釜闇瑕佽存槑鐨勫湴鏂瑰氨鏄涓嶅悓鏁版嵁搴撶殑鍏煎規э紝鍦ㄤ笉鍚岀殑鏁版嵁搴撻噷鎴鑾蜂竴孌電粨鏋滅殑鍐欐硶鏄涓嶄竴鏍風殑銆
銆銆mysql: select * from table limit offset, rows
銆銆pgsql: select * from table limit m offset n
銆銆......
lishixin/Article/program/PHP/201311/21304
B. 深入PHP中的HashTable結構詳解
深入PHP中的HashTable結構詳解
對php內核有一定了解的人應該都知道php的精髓就是HashTable,HashTable在php的實現中無處不在。包括php的數組、什麼全局變數、局部變數的作用域等等,php的hashtable拆開來說就是四部分:
hash函數:用的是time33的散列函數,將一個字元串的key轉換成一個數字
一個C數組:用來儲存桶(buckets)的
兩個雙向的鏈表:第一個雙向鏈表是數組的每個元素(桶bucket)是一個雙向鏈表,這樣做是為了解決hash沖突;第二個雙向鏈表是數組將每一個桶(bucket)連接起來,這里要連接的也就是第一個雙向鏈表的鏈表頭,這樣做是為了遍歷整個hash表用的,鳥哥有篇blog是講php的foreach的,這里這樣設計就是給foreach用的==>《深入理解PHP之數組(遍歷順序)》
我這里不再說hashtable的struct和bucket的`struct了,因為下面的推薦鏈接幾乎都講了,我不覺得我能描述和說的比他們好,每個人的水平不一樣,我就以我現在的技術水平來描述,所以我就只把我整理的一些東西記錄一下
下面是php中hash實現的兩個文件:zend_hash.c zend_hash.h。這兩個文件裡面實現了一堆的api,也引申出了一堆的api,下面是實現出來的api的原型
復制代碼 代碼如下:
ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)
ZEND_API ulong zend_get_hash_value(const char *arKey, uint nKeyLength)
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
ZEND_API void zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)
ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_index_update_or_next_(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int zend_hash_rehash(HashTable *ht)
static int zend_hash_do_resize(HashTable *ht)
ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag)
ZEND_API void zend_hash_destroy(HashTable *ht)
ZEND_API void zend_hash_clean(HashTable *ht)
static Bucket *zend_hash_apply_r(HashTable *ht, Bucket *p)
ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int num_args, …)
ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size)
ZEND_API void _zend_hash_merge(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite ZEND_FILE_LINE_DC)
static zend_bool zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)
ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)
ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData)
ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength)
ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h)
ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)
ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h)
ZEND_API int zend_hash_num_elements(const HashTable *ht)
ZEND_API int zend_hash_get_pointer(const HashTable *ht, HashPointer *ptr)
ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)
ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool plicate, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos)
ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, const char *str_index, uint str_length, ulong num_index, int mode, HashPosition *pos)
ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compar, int renumber TSRMLS_DC)
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)
ZEND_API int zend_hash_minmax(const HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC)
ZEND_API ulong zend_hash_next_free_element(const HashTable *ht)
void zend_hash_display_pListTail(const HashTable *ht)
void zend_hash_display(const HashTable *ht)
;C. php分頁代碼 怎麼寫
Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與資料庫打交道,客戶端從伺服器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個重要組成部分,在這里,我們共同來研究分頁程序的編寫。
一、分頁程序的原理
分頁程序有兩個非常重要的參數:每頁顯示幾條記錄($pagesize)和當前是第幾頁($page)。有了這兩個參數就可以很方便的寫出分頁程序,我們以MySql資料庫作為數據源,在mysql里如果要想取出表內某段特定內容可以使用的 T-SQL語句:select * from table limit offset,rows來實現。這里的offset是記錄偏移量,它的計算方法是offset=$pagesize*($page-1),rows是要顯示的記錄條數,這里就是$page。也就是說select * from table limit 10,10這條語句的意思是取出表裡從第11條記錄開始的20條記錄。
二、主要代碼解析
$pagesize=10; //設置每一頁顯示的記錄數
$conn=mysql_connect("localhost","root",""); //連接資料庫
$rs=mysql_query("select count(*) from tb_proct",$conn); //取得記錄總數$rs
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];
//計算總頁數
$pages=intval($numrows/$pagesize);
//判斷頁數設置
if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
$page=1; //否則,設置為第一頁
}
三、創建用例用表myTable
create table myTable(id int NOT NULL auto_increment,news_title varchar(50),news_cont text,add_time datetime,PRIMARY KEY(id))
四、完整代碼
<html>
<head>
<title>php分頁示例</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<?php
$conn=mysql_connect("localhost","root","");
//設定每一頁顯示的記錄數
$pagesize=1;
mysql_select_db("mydata",$conn);
//取得記錄總數$rs,計算總頁數用
$rs=mysql_query("select count(*) from tb_proct",$conn);
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];
//計算總頁數
$pages=intval($numrows/$pagesize);
if ($numrows%$pagesize)
$pages++;
//設置頁數
if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
//設置為第一頁
$page=1;
}
//計算記錄偏移量
$offset=$pagesize*($page - 1);
//讀取指定記錄數
$rs=mysql_query("select * from myTable order by id desc limit $offset,$pagesize",$conn);
if ($myrow = mysql_fetch_array($rs))
{
$i=0;
?>
<table border="0" width="80%">
<tr>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">標題</td>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">發布時間</td>
</tr>
<?php
do {
$i++;
?>
<tr>
<td width="50%"><?=$myrow["news_title"]?></td>
<td width="50%"><?=$myrow["news_cont"]?></td>
</tr>
<?php
}
while ($myrow = mysql_fetch_array($rs));
echo "</table>";
}
echo "<div align='center'>共有".$pages."頁(".$page."/".$pages.")";
for ($i=1;$i< $page;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "[".$page."]";
for ($i=$page+1;$i<=$pages;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "</div>";
?>
</body>
</html>
五、總結
本例代碼在windows2000 server+php4.4.0+mysql5.0.16上運行正常。該示例顯示的分頁格式是[1][2][3]…這樣形式。假如想顯示成「首頁 上一頁 下一頁 尾頁」這樣形式,請加入以下代碼:
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;
if ($page > 1)
{
echo "<a href='fenye.php?page=".$first."'>首頁</a> ";
echo "<a href='fenye.php?page=".$prev."'>上一頁</a> ";
}
if ($page < $pages)
{
echo "<a href='fenye.php?page=".$next."'>下一頁</a>
echo "<a href='fenye.php?page=".$last."'>尾頁</a> ";
}
其實,寫分頁顯示代碼是很簡單的,只要掌握了它的工作原理。希望這篇文章能夠帶給那些需要這方面程序web程序員的幫助。
D. PHP顯示很多資料庫信息,如何自動分頁呢代碼
PHP代碼如下:
/*
Author:默默
Date :2006-12-03
*/
$page=isset($_GET['page'])?intval($_GET['page']):1; //這句就是獲取page=18中的page的值,假如不存在page,那麼頁數就是1。
$num=10; //每頁顯示10條數據
$db=mysql_connect("host","name","pass"); //創建資料庫連接
$select=mysql_select_db("db",$db); //選擇要操作的資料庫
/*
首先咱們要獲取資料庫中到底有多少數據,才能判斷具體要分多少頁,具體的公式就是
總數據數除以每頁顯示的條數,有餘進一。
也就是說10/3=3.3333=4 有餘數就要進一。
*/
$total=mysql_num_rows(mysql_query("select id from table")); //查詢數據的總數,id是資料庫中的一個自動賦值的欄位
$pagenum=ceil($total/$num); //獲得總頁數
//假如傳入的頁數參數大於總頁數,則顯示錯誤信息
If($page>$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
}
$offset=($page-1)*$num; //獲取limit的第一個參數的值,假如第一頁則為(1-1)*10=0,第二頁為(2-1)*10=10。
$info=mysql_query("select name from table limit $offset,$num"); //獲取相應頁數所需要顯示的數據,name是數據里的一個欄位
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //顯示數據
For($i=1;$i<=$pagenum;$i++){
$show=($i!=$page)?"$i":"$i";
Echo $show." ";
}
/*顯示分頁信息,假如是當頁則顯示粗體的數字,其餘的頁數則為超連接,假如當前為第三頁則顯示如下
1 2 3 4 5 6
*/
?>
E. 怎麼在PHP網頁上點擊數據出現文本框並可以修改和提交,用AJAX把數據更新到資料庫同時刷新頁面,求代碼
//這個正好手頭正在做的一個項目中用到,提供思路,可以自由擴充
//在頁面載入的時候注冊一下,就是給要點擊的地方添加事件或者是屬性
//頁面源碼
<table>
<tr>
<tdclass="canChange">點擊這里會出現文本框</td>
</tr>
</table>
//JS
$(document).ready(function(){
td_Click();
})
//點擊事件
functiontd_Click(){
$(".canChange").click(function(){
vartd=$(this);
//所點文本框的id
varid=$(this).attr("id")
vartxt=$.trim(td.text());
varinput=$("<inputclass="myinput"id='new'type='text'value='"+txt+"'style="width:80%;heigth:100%;"/>");
td.html(input);
input.click(function(){returnfalse;});
//獲取焦點
input.trigger("focus");
//文本框失去焦點後提交內容,重新變為文本
input.blur(function(){
//varnewtxt=$(this).val();
varnewtxt=$("#new").val();
//判斷文本有沒有修改
if(newtxt!=txt){
if(newtxt==null||newtxt==""){
td.html(txt);
}
else{
//表示已經修改
$.post(.......)//提交
td.html(newtxt);
}
}
else{
td.html(txt);
}
});
});
}
刷新頁面可以通過JQ的Fresh方法來實現,
或者是是控制項刷新來實現,
比如$("#btnSearch").click();這樣通過JQ調用按鈕點擊,實現重新讀取數據
=================望採納!
F. 求寫個比較簡單的php登陸頁面代碼
主頁面:index.php <form name="form1" action="login.php" method="post" onsubmit="return check()"><!--這里注意onclick的用法-->
賬號:<input name="adminAccount" type="text" />
密碼:<input type="password" name="adminPass" />
輸入驗證碼:<input type="text" name="validate" />
< br />
<input type="submit" value="登陸" /><input type="reset" value="重置">
</form>判斷頁面:login.php<?php
//再連庫判斷賬號密碼
require_once("../inc/dbconfig.php");
$adminAccount=$_POST['adminAccount'];
$adminPass=md5($_POST['adminPass']);
$sql="select * from admin where adminAccount='$adminAccount' and adminPass='$adminPass'";
$result=mysql_query($sql) or die($sql);
$rows=mysql_num_rows($result);
if($rows==0){
?>
<script language="javascript">
alert("管理員賬號密碼錯誤!");
window.location="index.php";
</script>
<?
exit();
}
//將管理員賬號賦值給session
$_SESSION['adminAccount']=$adminAccount;
?>
<script language="javascript">
window.location="command.php";
</script>配置文件自己來就行了!
G. php怎麼把jsp頁面的table導出excel
導出一般都是從前台拿到限定條件,然後去後台運用JXL或POI或FREEMAKER等工具類導出為Excel
導出一般都是從前台拿到限定條件,然後去後台運用JXL或POI或FREEMAKER等工具類導出為Excel