一个分页问题

#1 yuanjianhua

由于在查询中第一次默认查询是查询出所有的,但是当用户用条件查询时,当有些条件没输全部,
就变成如下,如果全部输入则运行正常,谁能帮我看看这个问题

2010-07-05 17:16:52

#2 yuanjianhua

咋没人回答呢?

2010-07-06 00:01:15

#3 yuanjianhua

JACK,求助啊

2010-07-06 07:43:54

#4 jake

详细说一下?上面的描述看不明白是什么问题,最好顺便贴上些代码

2010-07-06 08:20:46

#5 小双

下面的代码是我写的,估计可以给你提供帮助:


  $Atitle = $this->spArgs("Atitle");
  $Nickname = $this->spArgs("Nickname");
  $Username = $this->spArgs("Username");
  $qq = $this->spArgs("qq");

if("" != $Atitle){
$sql1 .=" and zc_article.Atitle like '%".$Atitle."%'";
}
if("" != $Nickname){
$sql2 .=" and zc_article.Nickname like '%".$Nickname."%'";
}
if("" != $Username){
$sql3 .=" and zc_article.Username like '%".$Username."%'";
}
if("" != $qq){
$sql4 .=" and zc_article.qq = '".$qq."'";
}
$sql = "SELECT id,Atitle,vote,isrecommend,ishot,iscolor,istop,ctime FROM zc_article WHERE state=0 and (1=1)";
$sql .=$sql1;
$sql .=$sql2;
$sql .=$sql3;
$sql .=$sql4;
$sql.="order by id desc";
$gb = spClass('lib_article');
$this->results = $gb->spPager($this->spArgs("page",1),10)->findSql($sql);
//查询相关数据总数量
if(FALSE === $gb->findSql($sql)){
$this->sumSearch = 0;
}else{
$this->sumSearch = count($gb->findSql($sql));
}

2010-07-06 11:53:27

#6 yuanjianhua

回复 5 小双

那模板中怎么写呢?

2010-07-07 07:40:31

#7 azwl

由于在查询中第一次默认查询是查询出所有的,但是当用户用条件查询时,当有些条件没输全部,
就变成如下, ...
yuanjianhua 发表于 2010-7-5 17:16
1. 是不是你拼成德查SQL询语句有问题。

2。分页时的查询条件是一样的。

2010-07-07 10:56:53

#8 yuanjianhua

回复 4 jake

这个是我 根据条件查询出数据 的方法
  /**
     * @method index
     * @author Mark 2010-07-05
     * 说明:根据条件查询出数据
     */
    function index(){
        $enabled = (int)$this->spArgs('enabled'); //获取到是否启用状态
        $title = $this->spArgs('title'); //获取投票标题
        $fromdate = $this->spArgs('fromdate');//获取开始时间
        $todate = $this->spArgs('todate');//获取结束时间
        $orders = $this->spArgs('orders');//获取排序方式
        
        $con = " 1 = 1 ";
        if(-1 !== $enabled && -2 !== $enabled){
            $con.=" && enabled = ".$enabled." ";
        }else if(-2 === $enabled){
            $con .= " && todate < '".date('Y-m-d',time())."' ";
        }
        if("" != $title){
            $con.= " && subject like '%".$title."%' ";
        }
        if("" != $fromdate){
            $con.=" && fromdate >= '".$fromdate."' ";
        }
        if("" != $todate){
            $con.=" && todate <= '".$todate."' ";
        }
        if("" != $orders){
            $con .= $orders ;
        }else{
            $con .=" order by subjectid desc";
        }
        $sql = "select * from `".$GLOBALS['G_SP']['db']['prefix']."vote_subject` where ".$con;
        $vote = spClass('lib_vote_subject');
        $this->voteList = $vote->spPager($this->spArgs('page', 1), 15)->findSql($sql);
        $this->pager = $vote->spPager()->getPager();
        $this->params = $this->spArgs();
        $this->display('admin/vote.html');
    }  

这块是模板中显示的
{if $pager}  共有投票 {$pager.total_count} 个,共有{$pager.total_page}页(每页{$pager.page_size}个投票):  
        
      {if $pager.current_page != $pager.first_page}  
      前页 |  
      上一页 |  
      {/if}  
         
      {foreach from=$pager.all_pages item=thepage}  
          {if $thepage != $pager.current_page}  
          {$thepage}  
      {else}  
              {$thepage}  
                        {/if}  
                     {/foreach}  
        
      {if $pager.current_page != $pager.last_page}  |  
       下一页 |  
       后页  
      {/if}  
        {/if}

而我想的是,当我查询后的翻页并不是所有数据的翻页,而是对查询出来的数据在进行翻页,这里遇到的问题就是说我查询后的翻页无效,查询不到数据,而只有把刚刚查询的条件在地址里面传入就行,这个该怎么解决呢?

2010-07-07 15:23:43

#9 jake

只能说在翻页的链接中,你拼装的URL错了,所以就无效了。

2010-07-07 16:29:40

#10 yuanjianhua

回复 9 jake

那您说我的url改怎么拼,当为空,那又该怎么办?

2010-07-07 16:38:54

#11 jake

要改成传入正确的参数,还有对为空的情况加上默认值

2010-07-07 16:46:34

#12 yuanjianhua

回复 11 jake


对为空的加上默认值?默认值什么才能把所以的数据查询出来的?意思就是说当条件是什么的时候能把所有的数据查询出来!

2010-07-10 14:21:12

#13 wk811201

遇到同样问题
url : admin.php/action/lists/p/2/keyword//cid//istop//isgood//ischecked/
$thsi->spArgs();  后 得到的值为:
Array
(
    [c] => action
    [a] => lists
    [p] => 2
    [keyword] => cid
    [istop] => isgood
    [ischecked] =>
)

2010-07-10 14:27:17

#14 yuanjianhua

回复 13 wk811201

嗯,不知道怎么解决,郁闷

2010-07-10 15:22:01

#15 wk811201

这样实现了 但是总觉得别扭
$post ['keyword'] = $this->spArgs ( 'keyword', 'null' );

if (isset ( $post ['keyword'] ) && ! empty ( $post ['keyword'] ) && $post ['keyword'] != 'null') {
                        //sql过滤
                        $keyword = $cArticle->__val_escape ( $post ['keyword'] );
                        $conditions .= ' AND title LIKE \'%' . $keyword . '%\' OR message LIKE \'%' . $keyword . '%\'';
                }

老大能否处理下路由预处理方法
'url_path_info' => FALSE   就没问题

2010-07-10 16:01:18

#16 jake

楼上的方法有些过于繁琐了,比如说查询keyword的GET传递过来的

if( $keyword = $this->spArgs('keyword', false) ){ // false是默认值
   // 这里可以使用$keyword来进行查找
}else{
   echo '您没有输入关键字';
}
另外如果传递的是0或者1,可以这样

$a = $this->spArgs('is', 1); // 1是默认值
if( 1 == $a ){
  echo "你输入的是1";
}else{
  echo "你输入的是0或者没有输入";
}

2010-07-10 18:26:54

#17 yuanjianhua

回复 16 jake


还是不大懂您说的设置默认值

                 
                     
                        
                           
                           
                           
                        
                        
                        
                           
                           
                        
                    
广告名称:客户名称:广告位置:
                           

                             
                           
广告期限:广告状态:
                           

                            审核状态:

               


上面是我的html代码。
对于分页中的参数设置:后面应该还有参数:比如adsname=首页 等等
{if $pager.current_page != $pager.last_page}  |  
       adsname=$params.adsname}">下一页 |  
       后页  
{/if}
对于当adsname为空时,我不知道该怎么设置了,里面又不能写判断!

这个东西啊,后台就剩下这个没解决了,其他的都差不多行了,

希望老大能尽快帮我解决这个问题!这个问题想了很久,困扰很久了,都不知道怎么解决!郁闷

2010-07-13 00:20:39

#18 jake

当adsname为空时,那证明了adsname是“真的”为空,对吗?

你是不是需要这个?
{spUrl c=ads a=index page=$pager.next_page adsname=$params.adsname|default:"adsname值为空"}
smarty变量default默认值功能。

我觉得你还是要把思路理清楚,编程的东西,没有明确的思路是不行的。这里看你说了好几次都没办法把思路说清楚,反正我是看不明白的。什么又要为空,又要有参数,非常的乱。

2010-07-13 09:42:38

#19 liujietoer

你不需要在前台判断adsname这个值是否为空啊,你只需要在控制层来判断是否为空就可以了
为空的时候你就不进行sql的拼接,直接查询所有的,如果不为空你就进行sql的拼接,查询条件的数据

         adsname参数                为空查询所有,不为空查询按条件查询              adsname
页面提交------------------->判断是否为空---------------------------------------------->执行查询------------------>返回页面

2010-07-13 10:02:37

#20 liujietoer

不知道我说的是不是你的意思

2010-07-13 10:03:18

#21 yuanjianhua

回复 20 liujietoer


    不是这个意思,我现在的问题只是在翻页了


    忘了补充一个 'url_path_info' => TRUE 因为我用了美化地址,当我 'url_path_info' => FALSE时,却是正常的!!

2010-07-13 10:06:42

#22 野狐论禅

spModel.php  -->的        private function runpager($func_name, $func_args)
在使用URLRewriter后,$this->input_args[0];取到的值将是一个数组,形如:
    [0] => Array
        (
            [raiders-1-1-2-西藏_html] =>
            [areaId] => 1
            [spotsId] => 1
            [pageId] => 2
            [keyWords] =>
        )
这将导致后面所有的当前页都是第一页!
------而普通URL方式时 [0] 应该只是一个整型数字(当前页码),[1]是每一页的记录条数。

应该是部分代码要做一些调整才能避免此问题吧,Jake不知我的回答是否正确?

2012-08-19 01:43:55

#23 jake

野狐论禅 发表于 2012-8-19 01:43
spModel.php  -->的        private function runpager($func_name, $func_args)
在使用URLRewriter后,$this->inp ...
和spModel没什么关系!本帖的问题,在于楼主不清楚分页中urlrewrite的参数传递和分页的地址构造,所以在参数传递过程中丢失了参数,导致变成了他说的“每次都是第一页”。

分页最重要的,是保留原URL的参数的同时,加入page页码。spModel没有问题的。只需要理解自己的程序和分页原理即可。

举个例子:百度搜索

http://www.baidu.com/baidu?word=%E5%88%86%E9%A1%B5&pn=10&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_page=1&tn=98012088_dg

这里的分页页码是 pn=xx ,就是当前分页数,从页码的URL可以看出,每次点击只有pn参数有变化,其他参数都保持。这个保持就要靠你自己保持了。

其实用论坛里面提供的几个分页源码是挺好用的而且挺简单的,只不过楼主忘记了传参,所以才不成功。



2012-08-19 08:19:39