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

请教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 21: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]);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 修改了问题 1月18日
  • 修改了问题 1月18日
  • 展开全部

悬赏问题

  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含