ThinkPHP 分页中带入查询(搜索)条件

很多情况下,分页还会带入查询条件,而这时查询往往是不固定的。例如常见的搜索,需要根据用户查询的关键字来进行检索,在搜索结果太多时,就需要将搜索结果进行合理分页。

ThinkPHP 分页可以很容易的实现对不固定查询参数的支持。具体实现是给分页类的 parameter 属性赋值或者直接实例化分页类时传入查询参数。下面以例子来说明。

parameter 属性赋值

例如要检索用户表中状态为 1 (status=1) 并且电子包含 163 的用户,当提交表单时(注意表单是 GET 方式提交),形成的 URL 地址大致如下:

/index.php/Index/search/status/1/email/163

在搜索操作(search)中主要代码如下

Default

public function search(){
    $Dao = M("User");
    // 构造查询条件
    $condition['status'] = $_GET['status'];
    $condition['email'] = array('like',"%".$_GET['email']."%");
    // 计算总数
    $count = $Dao->where($condition)->count();
    // 导入分页类
    import("ORG.Util.Page");
    // 实例化分页类
    $p = new Page($count, 10);
    // 获取查询参数
    $map['status'] = $_GET['status'];
    $map['email'] = $_GET['email'];
    foreach($map as $key=>$val) {  
        $p->parameter .= "$key=".urlencode($val)."&";  
    }
    // 分页显示输出
    $page = $p->show();

    // 当前页数据查询
    $list = $Dao->where($condition)->order('uid ASC')->limit($p->firstRow.','.$p->listRows)->select();

    // 赋值赋值
    $this->assign('page', $page);
    $this->assign('list', $list);

    $this->display();
}

在页面的分页链接中,可以看到地址(如第 2 页)为:

/index.php/Index/search/status/1/email/163?status=1&email=163&p=2

可以看见分页链接中已经包含了需要检索的 status=1&email=163 条件。当然,实际解析后的地址应该是:

/index.php/Index/search/status/1/email/163/p/2/

这是因为 ThinkPHP 分页类对 URL 的处理还不够完美造成的。要对此进行改进,参看《ThinkPHP 定制分页风格及URL》。

传入 parameter 参数

带入查询条件的分页关键就是设置分页类的 parameter 属性值。除了上例中给 parameter 属性赋值外,也可以直接在实例化类的时候将 parameter 参数传入,两种方式结果是一致的:

Default

$parameter = 'status='.urlencode($_GET['status']).'&email='.urlencode($_GET['email']);
// 实例化分页类时加入 parameter 参数
$p = new Page($count, 10, $parameter);
// 分页显示输出
$page = $p->show();

上述例子只是用于讲述分页中带入查询条件的使用,因此未对检索的关键字进行进行安全处理。实际使用中在进行查询之前,应对用户输入的关键词做安全性方面的处理。

时间: 2024-09-17 04:09:36

ThinkPHP 分页中带入查询(搜索)条件的相关文章

使用准则进行条件查询--1.4.从窗体中选择查询的条件

4.从窗体中选择查询的条件 前面的方法虽然简单,但对用户来说操作不够方便,对设计者来说也难以控制,如果通过窗体来实现,这些问题就可以解决了. 如下面的窗体,运行时用户可以在组合框中选择要查询司机的姓名,按下查询按钮就可以看到查询的结果. 下面详细地列出设计的步骤: 创建一个窗体,按下控件向导按钮,在窗体上添加一个组合框.在第一个对话框中选择"我想让组合框在一个表或查询中查找这些值",下一步. 选择一个为组合框提供数据的表或查询.下一步. 选择组合框中要显示的数据,通常除了选择要显示在组

使用准则进行条件查询--1.4.从窗体中选择查询的条件_Access

4.从窗体中选择查询的条件 前面的方法虽然简单,但对用户来说操作不够方便,对设计者来说也难以控制,如果通过窗体来实现,这些问题就可以解决了. 如下面的窗体,运行时用户可以在组合框中选择要查询司机的姓名,按下查询按钮就可以看到查询的结果. 下面详细地列出设计的步骤: 创建一个窗体,按下控件向导按钮,在窗体上添加一个组合框.在第一个对话框中选择"我想让组合框在一个表或查询中查找这些值",下一步. 选择一个为组合框提供数据的表或查询.下一步. 选择组合框中要显示的数据,通常除了选择要显示在组

NHibernate之旅(4):探索查询之条件查询(Criteria Query)

本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Example) 实例分析 结语 上一节,我们介绍了NHibernate查询语言的一种:NHibernate查询语言(HQL,NHibernate Query Language),这一节介绍一下条件查询(Criteria API). NHibernate中的查询方法 在NHibernate中提供了三种查

ThinkPHP 3.2.2 框架的模型中where查询条件总结

ThinkPHP_3.2.3 框架的Model,结合官方手册及使用经验汇总出其大体用法: 核心转换方法:     $this->parseWhere($where);    $whereStr .= $this->parseThinkWhere($key, $val);    $this->parseWhereItem($this->parseKey($key), $val);     // 内连接.左连接.右连接 UserModel.class.php    // SQL:( S

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件.   分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据]   带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数  ---->select count(*) from [表名] where

thinkPHP使用post方式查询时分页失效的解决方法_php实例

本文实例讲述了thinkPHP使用post方式查询时分页失效的解决方法.分享给大家供大家参考,具体如下: 昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢各位大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题,也是因为刚入手thinkphp.在做项目的过程中,因为需要非常多的查询条件,如果以get方式提交表单的话,会因为url长度限制而报错,所以必须使用post方式提交表单数据,但是在分页的过程中,遇到了问题,因为thinkphp自带的分页是以a标签的形式,进

Thinkphp使用mongodb数据库实现多条件查询方法_php实例

有个项目用了mongodb数据库,查询条件有and也有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,发现查询条件是空的.用字符串模式查询(_string),请求字符串查询(_query)无法满足需求.估计用mongodb的用户不多,thinkphp官方对这方面支持也不够.打开thinkphp的mongodb驱动,Thinkphp/Extend/Driver/Db/DbMongo.class.php,找到protected function

使用ASp.NET 的MVC模式如何对我的订单中的订单数据进行查询搜索?

问题描述 各位路过的大神,大家好.我是一名大二的学生,学习的是Asp.Net方向,现在在做的是实训周的项目.做的是一个零食店商城的网站,使用的是MVC模式的开发,关于我的订单这里,有一项订单搜索的功能,不知道如何实现?控制器的方法需要怎么写法?如下图和方法显示:目的,就是想,根据订单号和商品的名称进行搜索,显示符合条件的订单记录.如,数据库如下:createtable[dbo].[Orders]([Order_Id][int]identity(1,1)notnullprimarykey,--订单

link中能不能要查询的条件放在treeviw中,请问怎么编写代码实现?

问题描述 link中能不能要查询的条件放在treeviw中,请问怎么编写代码实现? link中能不能要查询的条件放在treeviw中,请问怎么编写代码实现? 解决方案 你可以保存一些参数,然后这个函数解析,linq调用这个方法去判断,如果你想动态执行代码,c#可以动态编译代码的,你搜一下,记不得是动态编译,我博客上也有一个简单的介绍