php分页实例及其原理

Part1:实例

 1 /**
 2  * 取得上次的过滤条件
 3  * @param   string  $param_str  参数字符串,由list函数的参数组成
 4  * @return  如果有,返回array('filter' => $filter, 'sql' => $sql);否则返回false
 5  */
 6 function get_filter($param_str = '')
 7 {
 8     $filterfile = basename(PHP_SELF, '.php');//string basename ( string $path [, string $suffix ] )
                             返回路径中的文件名部分
如果文件名是以 suffix 结束的,那这一部分也会被去掉。 
 9     if ($param_str)
10     {
11         $filterfile .= $param_str;
12     }
13     if (isset($_GET['uselastfilter']) && isset($_COOKIE['ECSCP']['lastfilterfile'])
14         && $_COOKIE['ECSCP']['lastfilterfile'] == sprintf('%X', crc32($filterfile)))
15     {
16         return array(
17             'filter' => unserialize(urldecode($_COOKIE['ECSCP']['lastfilter'])),
18             'sql'    => base64_decode($_COOKIE['ECSCP']['lastfiltersql'])
19         );
20     }
21     else
22     {
23         return false;
24     }
25 }
 1 /**
 2  * 保存过滤条件
 3  * @param   array   $filter     过滤条件
 4  * @param   string  $sql        查询语句
 5  * @param   string  $param_str  参数字符串,由list函数的参数组成
 6  */
 7 function set_filter($filter, $sql, $param_str = '')
 8 {
 9     $filterfile = basename(PHP_SELF, '.php');
10     if ($param_str)
11     {
12         $filterfile .= $param_str;
13     }
14     setcookie('ECSCP[lastfilterfile]', sprintf('%X', crc32($filterfile)), time() + 600);
15     setcookie('ECSCP[lastfilter]',     urlencode(serialize($filter)), time() + 600);
16     setcookie('ECSCP[lastfiltersql]',  base64_encode($sql), time() + 600);
17 }

 

  1 /**
  2  * 供货商资源管理
  3  * @param    bool    $is_pagtion
  4  * @return    array   $arr
  5  */
  6 function suppliers_resource_manage($is_pagtion=true)
  7 {
  8     global $db,$ecs;
  9     $result = get_filter();
 10     if ($result === false)
 11     {
 12         $aiax = isset($_GET['is_ajax']) ? $_GET['is_ajax'] : 0;
 13         /* 过滤信息 */
 14         $filter['sort_by'] = empty($_REQUEST['sort_by']) ? 'r.resource_id' : trim($_REQUEST['sort_by']);
 15         $filter['sort_order'] = empty($_REQUEST['sort_order']) ? 'DESC' : trim($_REQUEST['sort_order']);
 16         $filter['resource_id'] = empty($_REQUEST['resource_id'])  ? '' : $_REQUEST['resource_id'];
 17         $filter['admin_name'] = empty($_REQUEST['admin_name'])  ? '' : trim($_REQUEST['admin_name']);
 18         $filter['resource_name'] = empty($_REQUEST['resource_name'])  ? '' : trim($_REQUEST['resource_name']);
 19         $filter['admin_id']  = isset($_REQUEST['admin_id'])?intval($_REQUEST['admin_id']):'-1';
 20         $filter['resource_type'] = empty($_REQUEST['resource_type']) ? '-1' : intval($_REQUEST['resource_type']);
 21         $filter['resource_status'] = empty($_REQUEST['resource_status']) ? '-1' : intval($_REQUEST['resource_status']);
 22         $filter['resource_rank'] = empty($_REQUEST['resource_rank']) ? '-1' : intval($_REQUEST['resource_rank']);
 23         $filter['resource_key'] = empty($_REQUEST['resource_key'])  ? '' : trim($_REQUEST['resource_key']);
 24         $filter['menuid'] = 7; 
 25         $where = 'WHERE 1 ';
 26         /* 分页大小 */
 27         $filter['page'] = empty($_REQUEST['page']) || (intval($_REQUEST['page']) <= 0) ? 1 : intval($_REQUEST['page']);
 28 
 29         if (isset($_REQUEST['page_size']) && intval($_REQUEST['page_size']) > 0)
 30         {
 31             $filter['page_size'] = intval($_REQUEST['page_size']);
 32         }
 33         elseif (isset($_COOKIE['ECSCP']['page_size']) && intval($_COOKIE['ECSCP']['page_size']) > 0)
 34         {
 35             $filter['page_size'] = intval($_COOKIE['ECSCP']['page_size']);
 36         }
 37         else
 38 
 39         {
 40             $filter['page_size'] = 15;
 41         }
 42         
 43         if(!empty($filter['resource_id']))
 44         {
 45             $resource_id = $filter['resource_id'] == -1 ? 0 : $filter['resource_id'];
 46             $where .= " and r.resource_id='".$resource_id."'";
 47         }
 48         if($filter['resource_name']){
 49             $where .= " AND r.resource_name like '%".mysql_like_quote($filter['resource_name'])."%' ";
 50         }
 51         if($filter['admin_id'] > -1)
 52         {
 53             $where .= " AND r.admin_id = '".$filter['admin_id']."' ";
 54         }
 55         if ($filter['resource_type'] > -1) 
 56         {
 57             $where .= " AND r.resource_type = '" . $filter['resource_type'] . "'";
 58         }
 59         if ($filter['resource_status'] > -1) 
 60         {
 61             $where .= " AND r.resource_status = '" . $filter['resource_status'] . "'";
 62         }
 63         if ($filter['resource_rank'] > -1) 
 64         {
 65             $where .= " AND r.resource_rank = '" . $filter['resource_rank'] . "'";
 66         }
 67         if($filter['resource_key']){
 68             $where .= " AND r.remark like '%".mysql_like_quote($filter['resource_key'])."%' ";
 69         }
 70         /* 记录总数 */
 71         $sql = "SELECT COUNT(r.resource_id) FROM " . $ecs->table('suppliers_resource')." as r 
 72                     LEFT JOIN ".$ecs->table('admin_user') . " as u
 73                         ON u.user_id = r.admin_id  " . $where;
 74         $filter['record_count']   = $db->getOne($sql);
 75         $filter['page_count']     = $filter['record_count'] > 0 ? ceil($filter['record_count'] / $filter['page_size']) : 1;
 76         /* 查询 */
 77         $sql = "SELECT r.resource_id, u.user_name as admin_name, r.resource_name, r.resource_link, r.resource_type, r.resource_status, r.resource_rank, r.remark, r.add_time FROM " . $ecs->table('suppliers_resource') . " as r 
 78                     LEFT JOIN " . $ecs->table('admin_user') . " as u ON u.user_id = r.admin_id  " . $where;
 79 
 80         $sort_by  = $filter['sort_by'];
 81         $sort_order = $filter['sort_order'];
 82         $sql .="GROUP BY r.resource_id ORDER BY " . $sort_by . " " . $sort_order;
 83         if($is_pagtion)
 84         {
 85             $sql .=" LIMIT ".($filter['page'] - 1)*$filter['page_size'].",".$filter['page_size'];
 86         }
 87         set_filter($filter, $sql);
 88     }
 89     else
 90     {
 91         $sql    = $result['sql'];
 92         $filter = $result['filter'];
 93     }
 94     $query=$sql;
 95 
 96     $row = $db->getAll($sql);
 97     /* 格式话数据 */
 98     foreach ($row AS $key => $value)
 99     {   
100         if ($row[$key]['resource_type'] == 1) {
101             $row[$key]['resource_type'] = '中模';
102         }elseif ($row[$key]['resource_type'] == 2) {
103             $row[$key]['resource_type'] = '泳装';
104         }elseif ($row[$key]['resource_type'] == 3) {
105             $row[$key]['resource_type'] = '阿里';
106         }elseif ($row[$key]['resource_type'] == 2) {
107             $row[$key]['resource_type'] = '17网';
108         }
109         if ($row[$key]['resource_status'] == 1) {
110             $row[$key]['resource_status'] = '已审核';
111         }elseif ($row[$key]['resource_status'] == 2) {
112             $row[$key]['resource_status'] = '已弃用';
113         }
114         if ($row[$key]['resource_rank'] == 1) 
115         {
116             $row[$key]['resource_rank'] = 'A';
117         }elseif ($row[$key]['resource_rank'] == 2) {
118             $row[$key]['resource_rank'] = 'B';
119         }elseif ($row[$key]['resource_rank'] == 3) {
120             $row[$key]['resource_rank'] = 'C';
121         }
122         if(strpos($row[$key]['resource_link'], 'http://') === false)
123         {
124             if (strpos($row[$key]['resource_link'], 'https://') === false) 
125             {
126                 $row[$key]['resource_link'] = substr_replace($row[$key]['resource_link'], 'http://', 0, 0);
127             }
128         }
129     }
130     $arr = array('result' => $row, 'filter' => $filter, 'page_count' => $filter['page_count'], 'record_count' => $filter['record_count'],'query'=>$query);
131     return $arr;
132 } 
View Code

 

Part2:解码编码

urlencode编码 URL 字符串

说明

string urlencode ( string $str )

此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

参数
  str
  要编码的字符串。
返回值

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 » RFC3896 编码(参见 rawurlencode())不同。 

urldecode — 解码已编码的 URL 字符串

说明

  string urldecode ( string $str )

  解码给出的已编码字符串中的任何 %##。 加号('+')被解码成一个空格字符。

参数

  str
  要解码的字符串。

返回值

  返回解码后的字符串。

Warning

    超全局变量 $_GET 和 $_REQUEST 已经被解码了。对 $_GET 或 $_REQUEST 里的元素使用 urldecode() 将会导致不可预计和危险的结果。 

 

serialize 产生一个可存储的值的表示

描述

string serialize ( mixed $value )

serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。

想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。你正 serialize() 的数组/对象中的引用也将被存储。

当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数。

Note:

在 PHP 3 中,对象属性将被序列化,但是方法则会丢失。PHP 4 打破了此限制,可以同时存储属性和方法。请参见类与对象中的序列化对象部分获取更多信息。 

 unserialize — 从已存储的表示中创建 PHP 的值

说明

mixed unserialize ( string $str )

unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

参数
  str
  序列化后的字符串.
  若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。

 Noteunserialize_callback_func 指令

如果在解序列化的时候需要实例化一个未定义类,则可以设置回调函数以供调用(以免得到的是不完整的 object"__PHP_Incomplete_Class")。可通过 php.iniini_set() 或 .htaccess 定义'unserialize_callback_func'。每次实例化一个未定义类时它都会被调用。若要禁止这个特性,只需置空此设定。

返回值

返回的是转换之后的值,可为 integerfloatstringarray 或 object

如果传递的字符串不可解序列化,则返回 FALSE,并产生一个 E_NOTICE。 

base64_encode使用 MIME base64 对数据进行编码

说明

string base64_encode ( string $data )

使用 base64 对 data 进行编码。

设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。

Base64-encoded 数据要比原始数据多占用 33% 左右的空间。

参数

  data
  要编码的数据。

返回值

  编码后的字符串数据, 或者在失败时返回 FALSE

base64_decode — 对使用 MIME base64 编码的数据进行解码
说明
  string base64_decode ( string $data [, bool $strict = false ] )
  对 base64 编码的 data 进行解码。
参数
  data
  编码过的数据。
  strict
  如果输入的数据超出了 base64 字母表,则返回 FALSE
返回值
  返回原始数据, 或者在失败时返回 FALSE。返回的数据可能是二进制的。

Part3:分页原理分析

11

posted @ 2017-10-17 13:36  JasonXu_徐晓峰的博客  阅读(730)  评论(0编辑  收藏  举报