iou3344 2023-01-18 06:01 采纳率: 84.1%
浏览 76
已结题

请教php搜索分页翻页时查询条件丢失的解决办法

查询第一页和查询总页数都是对的,但一点第二页where后面的条件就都丢失了。

这种问题一般有几种解决办法呢?

最好是post的方式,浏览器内页码不变最好。

请帮我找找用例啊,我学习一下呢。

谢谢!非常感谢!

pageClass.php 代码

<?php
class Page{
    public $total;
    public $pagesize;
    public $limit;
    public $page;
    public $pagenum;
    public $url;
    public $bothnum;

    public function __construct($_total, $_pagesize) {
        $this->total = $_total;
        $this->pagesize = $_pagesize;
        $this->pagenum = ceil($this->total / $this->pagesize);
        $this->page = $this->setPage();
        $this->limit = "LIMIT ".($this->page-1)*$this->pagesize.",$this->pagesize";
        $this->url = $this->setUrl();
        $this->bothnum = 4;
    }

    private function setPage(){
        if (!empty($_GET['page'])) {
            if ($_GET['page'] > 0 && $_GET['page'] <= $this->pagenum) {
                return $_GET['page'];
            } else {
                return 1;
            }
        } else {
            return 1;
        }
    }

    private function setUrl(){
        $_url = $_SERVER["REQUEST_URI"];
        $_par = parse_url($_url);
        if (isset($_par['query'])) {
            parse_str($_par['query'],$_query);
            unset($_query['page']);
            $_url = $_par['path'].'?'.http_build_query($_query).'&';
        } else {
            $_url = $_url . '?';
        }
        return $_url;
    }

    public function showPage(){
        $_page = '';
        $_page .= '<a href="'.$this->url.'page=1">First</a> ';
        if ($this->page > $this->bothnum+1) {
            $_page .= '<a href="'.$this->url.'page='.($this->page-1).'">Previous</a> ';
        }
        for ($i=$this->bothnum;$i>=1;$i--) {
            if ($this->page-$i > 0) {
                $_page .= '<a href="'.$this->url.'page='.($this->page-$i).'">'.($this->page-$i).'</a> ';
            }
        }
        $_page .= '<span class="me">'.$this->page.'</span> ';
        for ($i=1;$i<=$this->bothnum;$i++) {
            if ($this->page+$i <= $this->pagenum) {
                $_page .= '<a href="'.$this->url.'page='.($this->page+$i).'">'.($this->page+$i).'</a> ';
            }
        }
        if ($this->page < $this->pagenum - $this->bothnum) {
            $_page .= '<a href="'.$this->url.'page='.($this->page+1).'">Next</a> ';
        }
        $_page .= '<a href="'.$this->url.'page='.$this->pagenum.'">Last</a> ';
        $_page .= '<span class="total">Total: '.$this->total.'</span> ';
        return $_page;
    }
}

search.php 代码

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
require_once 'conn.php';
require_once 'PageClass.php';

$fields = array(
    "name0" => "姓名",
    "name1" => "年龄",
    "name2" => "性别",
    "name3" => "手机号",
    "name4" => "地址",
);

$keywords = array();
foreach ($fields as $name => $field) {
    if (isset($_POST[$name]) && !empty($_POST[$name])) {
        $keywords[$field] = explode(" ", $_POST[$name]);
    }
}

$query_rs = "1=1"; // 默认条件
if (!empty($keywords)) {
    $query_rs_parts = array();
    foreach($keywords as $field => $words) {
        $query_rs_parts[] = $field . " LIKE '%" . implode("%' AND ". $field ." LIKE '%", $words) ."%'";
    }
    $query_rs = implode(" AND ", $query_rs_parts) ;
}

// 存储查询条件
session_start();
$_SESSION['query_rs'] = $query_rs;

// 查询总条数
$total_sql = "SELECT COUNT(*) FROM data_1 WHERE $query_rs";
$total_res = $dbh->query($total_sql);
$total = $total_res->fetchColumn();

// 实例化分页类
$page = new Page($total, 10, isset($_GET['page']) ? $_GET['page'] : 1);

// 查询 
$name_sql = "SELECT * FROM data_1 WHERE $query_rs {$page->limit}";
$name_res = $dbh->query($name_sql);
$names = $name_res->fetchAll(PDO::FETCH_ASSOC);
?>

<?php
foreach ($names as $name) {
?>
    <div class="box">
        <div class="pic">
            <p><?php echo $name['姓名']; ?></p>
        </div>
    </div>
<?php
}
?>
<div id="pagination">
<?php 
    if ($total > 0) {
        echo $page->showPage();
    } else {
        echo "没有符合条件的结果。";
    }
?>
</div>

搜索条件页面的代码就不写了啊,不然帖子太长了。

展开全部

  • 写回答

3条回答 默认 最新

  • 有一只小精灵 2023-01-18 13:55
    关注

    查询第一页和查询总页数都是对的,但一点第二页where后面的条件就都丢失了。这种问题一般有几种解决办法呢?

    这个问题,因为是 127.0.0.1/search.php?name0=xx 这样访问的,所以获取参数的时候应该是用 $_GET,而不是$_POST,使用$_POST获取不到参数,where 条件其实都没加上,要让代码有效的话,改下 search.php 文件内的以下代码就行。

    foreach ($fields as $name => $field) {
        if (isset($_GET[$name]) && !empty($_GET[$name])) {
            $keywords[$name] = explode(" ", $_GET[$name]);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    iou3344 2023-01-18 14:38

    因为我没有上传form所在页面的代码,所以不得以,在我回答第一个回答问题人的时候告知他要想方便的跑起来,就是构造这样的链接(127.0.0.1/search.php?name0=xx),以便代替form提交效果,但实际上form提交时用的是POST方法,所以$_POST[$name])只是接受form传来的各字段查询参数的方法,这时候还没有生成查询条件呢,最终的查询条件存储在$query_rs变量中。

    回复
    有一只小精灵 回复 iou3344 2023-01-18 15:32

    试了一下,也不知道理解的对不对,是想使用session来保存条件数据的吧,$_SESSION['query_rs'] = $query_rs; 这边是设置了但是没有用到它,把这段改成下面的试试看是不是想要的效果。

    if (isset($_SESSION['query_rs'])) {
        $query_rs = $_SESSION['query_rs'];
    } else {
        $_SESSION['query_rs'] = $query_rs;
    }
    

    回复
    iou3344 回复 有一只小精灵 2023-01-18 16:00

    一开始是想用session的,但是用session好像要改pageClass分页类代码,就不想改了,希望看看有没有其他办法的,因为最终想实现POST分页。

    回复
    展开全部7条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月19日
  • 修改了问题 1月18日
  • 修改了问题 1月18日
  • 展开全部
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部