ajax实现分页
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>无标题文档</title> 6 <script src="jquery-1.11.2.min.js"></script> 7 </head> 8 9 <body> 10 <table id="tb" width="100%" border="1" cellpadding="0" cellspacing="0"> 11 12 </table> 13 <div> 14 <span id="shang">上一页</span> 15 <span id="xia">下一页</span> 16 <span>当前第:<input type="text" id="dq" value="1" />页</span> 17 <span>总共:<span id="zys"></span>页</span> 18 </div> 19 </body> 20 <script type="text/javascript"> 21 $(document).ready(function(e) { 22 FenYe(); 23 ZYS(2); 24 25 $("#shang").click(function(){ 26 var dq = parseInt($("#dq").val()); 27 28 if(dq>1) 29 { 30 $("#dq").val(dq-1); 31 } 32 else 33 { 34 $("#dq").val(1); 35 } 36 FenYe(); 37 }) 38 39 $("#xia").click(function(){ 40 var dq = parseInt($("#dq").val()); 41 if(dq<$("#zys").text()) 42 { 43 $("#dq").val(dq+1); 44 } 45 else 46 { 47 $("#dq").val($("#zys").text()); 48 } 49 FenYe(); 50 }) 51 52 }); 53 54 //实现分页的方法 55 function FenYe() 56 { 57 var dq = $("#dq").val(); 58 $.ajax({ 59 url:"chuli.php", 60 data:{page:dq}, 61 dataType:"JSON", 62 type:"GET", 63 success: function(data){ 64 65 var str = "<tr><td>代号</td><td>名称</td></tr>"; 66 for(var k in data) 67 { 68 str=str+"<tr><td>"+data[k].Code+"</td><td>"+data[k].Name+"</td></tr>"; 69 } 70 $(tb).html(str); 71 } 72 }); 73 74 } 75 76 //根据每页几条数据求总页数 77 function ZYS(n) 78 { 79 $.ajax({ 80 url:"zyschuli.php", 81 data:{list:n}, 82 type:"POST", 83 dataType:"TEXT", 84 success: function(data){ 85 $("#zys").text(data); 86 } 87 }); 88 } 89 90 </script> 91 </html>
1 <?php 2 3 include("DBDA.php"); 4 $db = new DBDA(); 5 6 include("page.class.php"); 7 8 $sql = "select count(*) from Nation"; 9 $zs = $db->StrQuery($sql); 10 11 $page = new Page($zs,2); 12 13 $sqlsj = "select * from Info ".$page->limit; 14 //echo $sqlsj; 15 echo $db->JsonQuery($sqlsj);
1 <?php 2 3 include("DBDA.php"); 4 $db = new DBDA(); 5 6 $sql ="select count(*) from Info"; 7 $sj = $db->StrQuery($sql); 8 9 $list = $_POST["list"]; 10 11 $zys = 0; 12 if($sj%$list==0) 13 { 14 $zys = $sj/$list; 15 } 16 else 17 { 18 $zys = floor($sj/$list) +1; 19 } 20 21 echo $zys;
1 <?php 2 3 class DBDA 4 { 5 public $host = "localhost"; //服务器地址 6 public $uid = "root"; //数据库的用户名 7 public $pwd = "123"; //数据库的密码 8 public $conn; //连接对象 9 10 function __construct($db="mydb") 11 { 12 //造连接对象 13 $this->conn = new MySQLi($this->host,$this->uid,$this->pwd,$db); 14 } 15 16 //执行SQL语句,返回相应结果的函数 17 //$sql是要执行的SQL语句 18 //$type是SQL语句的类型,0代表增删改,1代表查询 19 //$db代表要操作的数据库 20 public function Query($sql,$type=1) 21 { 22 23 //判断连接是否成功 24 !mysqli_connect_error() or die("连接失败!"); 25 26 //执行SQL语句 27 $result = $this->conn->query($sql); 28 29 //判断SQL语句类型 30 if($type==1) 31 { 32 //如果是查询语句返回结果集的二维数组 33 return $result->fetch_all(); 34 } 35 else 36 { 37 //如果是其他语句,返回true或false 38 return $result; 39 } 40 } 41 42 //Ajax调用返回JSON 43 public function JsonQuery($sql,$type=1,$db="mydb") 44 { 45 //定义数据源 46 $dsn = "mysql:dbname={$db};host={$this->host}"; 47 //造pdo对象 48 $pdo = new PDO($dsn,"{$this->uid}","{$this->pwd}"); 49 50 51 //准备执行SQL语句 52 $st = $pdo->prepare($sql); 53 54 //执行预处理语句 55 if($st->execute()) 56 { 57 if($type==1) 58 { 59 $attr = $st->fetchAll(PDO::FETCH_ASSOC); 60 return json_encode($attr); 61 } 62 else 63 { 64 if($st) 65 { 66 return "OK"; 67 } 68 else 69 { 70 return "NO"; 71 } 72 } 73 74 } 75 else 76 { 77 echo "执行失败!"; 78 } 79 80 81 82 } 83 //Ajax调用返回字符串 84 public function StrQuery($sql,$type=1) 85 { 86 //造连接对象 87 //$conn = new MySQLi($this->host,$this->uid,$this->pwd,$db); 88 89 //判断连接是否成功 90 !mysqli_connect_error() or die("连接失败!"); 91 92 //执行SQL语句 93 $result = $this->conn->query($sql); 94 95 //判断SQL语句类型 96 if($type==1) 97 { 98 $attr = $result->fetch_all(); 99 $str = ""; 100 //如果是查询语句返回字符串 101 for($i=0;$i<count($attr);$i++) 102 { 103 for($j=0;$j<count($attr[$i]);$j++) 104 { 105 $str = $str.$attr[$i][$j]; 106 $str = $str."^"; 107 } 108 $str = substr($str,0,strlen($str)-1); 109 $str = $str."|"; 110 } 111 $str = substr($str,0,strlen($str)-1); 112 113 return $str; 114 } 115 else 116 { 117 //如果是其他语句,返回true或false 118 if($result) 119 { 120 return "OK"; 121 } 122 else 123 { 124 return "NO"; 125 } 126 } 127 } 128 129 function PdoQuery($sql,$type=1,$db="mydb") 130 { 131 //造数据源 132 $dns = "mysql:host={$this->host};dbname={$db}"; 133 //造pdo对象 134 $pdo = new PDO($dns,$this->uid,$this->pwd); 135 136 //准备一条SQL语句 137 $stm = $pdo->prepare($sql); 138 139 //执行预处理语句 140 $r = $stm->execute(); 141 if($r) 142 { 143 if($type==1) 144 { 145 return $stm->fetchAll(); 146 } 147 else 148 { 149 return "OK"; 150 } 151 } 152 else 153 { 154 return "执行失败!"; 155 } 156 } 157 158 159 }
1 <?php 2 /** 3 file: page.class.php 4 完美分页类 Page 5 */ 6 class Page { 7 private $total; //数据表中总记录数 8 private $listRows; //每页显示行数 9 private $limit; //SQL语句使用limit从句,限制获取记录个数 10 private $uri; //自动获取url的请求地址 11 private $pageNum; //总页数 12 private $page; //当前页 13 private $config = array( 14 'head' => "条记录", 15 'prev' => "上一页", 16 'next' => "下一页", 17 'first'=> "首页", 18 'last' => "末页" 19 ); 20 //在分页信息中显示内容,可以自己通过set()方法设置 21 private $listNum = 10; //默认分页列表显示的个数 22 23 /** 24 构造方法,可以设置分页类的属性 25 @param int $total 计算分页的总记录数 26 @param int $listRows 可选的,设置每页需要显示的记录数,默认为25条 27 @param mixed $query 可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式 28 @param bool $ord 可选的,默认值为true, 页面从第一页开始显示,false则为最后一页 29 */ 30 public function __construct($total, $listRows=25, $query="", $ord=true){ 31 $this->total = $total; 32 $this->listRows = $listRows; 33 $this->uri = $this->getUri($query); 34 $this->pageNum = ceil($this->total / $this->listRows); 35 /*以下判断用来设置当前面*/ 36 if(!empty($_GET["page"])) { 37 $page = $_GET["page"]; 38 }else{ 39 if($ord) 40 $page = 1; 41 else 42 $page = $this->pageNum; 43 } 44 45 if($total > 0) { 46 if(preg_match('/\D/', $page) ){ 47 $this->page = 1; 48 }else{ 49 $this->page = $page; 50 } 51 }else{ 52 $this->page = 0; 53 } 54 55 $this->limit = "LIMIT ".$this->setLimit(); 56 } 57 58 /** 59 用于设置显示分页的信息,可以进行连贯操作 60 @param string $param 是成员属性数组config的下标 61 @param string $value 用于设置config下标对应的元素值 62 @return object 返回本对象自己$this, 用于连惯操作 63 */ 64 function set($param, $value){ 65 if(array_key_exists($param, $this->config)){ 66 $this->config[$param] = $value; 67 } 68 return $this; 69 } 70 71 /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */ 72 function __get($args){ 73 if($args == "limit" || $args == "page") 74 return $this->$args; 75 else 76 return null; 77 } 78 79 /** 80 按指定的格式输出分页 81 @param int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构 82 @return string 分页信息内容 83 */ 84 function fpage(){ 85 $arr = func_get_args(); 86 87 $html[0] = "<span class='p1'> 共<b> {$this->total} </b>{$this->config["head"]} </span>"; 88 $html[1] = " 本页 <b>".$this->disnum()."</b> 条 "; 89 $html[2] = " 本页从 <b>{$this->start()}-{$this->end()}</b> 条 "; 90 $html[3] = " <b>{$this->page}/{$this->pageNum}</b>页 "; 91 $html[4] = $this->firstprev(); 92 $html[5] = $this->pageList(); 93 $html[6] = $this->nextlast(); 94 $html[7] = $this->goPage(); 95 96 $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">'; 97 if(count($arr) < 1) 98 $arr = array(0, 1,2,3,4,5,6,7); 99 100 for($i = 0; $i < count($arr); $i++) 101 $fpage .= $html[$arr[$i]]; 102 103 $fpage .= '</div>'; 104 return $fpage; 105 } 106 107 /* 在对象内部使用的私有方法,*/ 108 private function setLimit(){ 109 if($this->page > 0) 110 return ($this->page-1)*$this->listRows.", {$this->listRows}"; 111 else 112 return 0; 113 } 114 115 /* 在对象内部使用的私有方法,用于自动获取访问的当前URL */ 116 private function getUri($query){ 117 $request_uri = $_SERVER["REQUEST_URI"]; 118 $url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?'; 119 120 if(is_array($query)) 121 $url .= http_build_query($query); 122 else if($query != "") 123 $url .= "&".trim($query, "?&"); 124 125 $arr = parse_url($url); 126 127 if(isset($arr["query"])){ 128 parse_str($arr["query"], $arrs); 129 unset($arrs["page"]); 130 $url = $arr["path"].'?'.http_build_query($arrs); 131 } 132 133 if(strstr($url, '?')) { 134 if(substr($url, -1)!='?') 135 $url = $url.'&'; 136 }else{ 137 $url = $url.'?'; 138 } 139 140 return $url; 141 } 142 143 /* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */ 144 private function start(){ 145 if($this->total == 0) 146 return 0; 147 else 148 return ($this->page-1) * $this->listRows+1; 149 } 150 151 /* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */ 152 private function end(){ 153 return min($this->page * $this->listRows, $this->total); 154 } 155 156 /* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */ 157 private function firstprev(){ 158 if($this->page > 1) { 159 $str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> "; 160 $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> "; 161 return $str; 162 } 163 164 } 165 166 /* 在对象内部使用的私有方法,用于获取页数列表信息 */ 167 private function pageList(){ 168 $linkPage = " <b>"; 169 170 $inum = floor($this->listNum/2); 171 /*当前页前面的列表 */ 172 for($i = $inum; $i >= 1; $i--){ 173 $page = $this->page-$i; 174 175 if($page >= 1) 176 $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; 177 } 178 /*当前页的信息 */ 179 if($this->pageNum > 1) 180 $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> "; 181 182 /*当前页后面的列表 */ 183 for($i=1; $i <= $inum; $i++){ 184 $page = $this->page+$i; 185 if($page <= $this->pageNum) 186 $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; 187 else 188 break; 189 } 190 $linkPage .= '</b>'; 191 return $linkPage; 192 } 193 194 /* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */ 195 private function nextlast(){ 196 if($this->page != $this->pageNum) { 197 $str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> "; 198 $str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> "; 199 return $str; 200 } 201 } 202 203 /* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */ 204 private function goPage(){ 205 if($this->pageNum > 1) { 206 return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> '; 207 } 208 } 209 210 /* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */ 211 private function disnum(){ 212 if($this->total > 0){ 213 return $this->end()-$this->start()+1; 214 }else{ 215 return 0; 216 } 217 } 218 } 219 220 221 222