【问题标题】:Pagination 2nd page not displaying分页第二页不显示
【发布时间】:2017-09-29 19:18:06
【问题描述】:

当我不在 SELECT 语句中使用 WHERE 语句时,分页工作正常。出于某种原因,只要我在 SELECT 语句中添加其他请求,就只有第一个分页页面有效。因此,在显示第一页后,变量数据似乎丢失了。以下是部分代码:-

               <?php
                 include 'database.php';
                 include 'paginator.php';
                 $pdo = Database::connect();

                 $paginator = new Paginator();
                 $sql = "SELECT count(*) FROM customer_crm ";
                 $paginator->paginate($pdo->query($sql)->fetchColumn());

                 $query =  $_GET["query"];
                 if (isset($query))  {
                   ($_GET['query'])?('%'.$_GET['query'].'%'):'%';
                   $sql = "SELECT * FROM customer_crm WHERE firstname LIKE :query OR email LIKE :query OR telephone LIKE :query ";
                   } 
                else    {
                    $start = (($paginator->getCurrentPage()-1)*$paginator->itemsPerPage);
                    $length = ($paginator->itemsPerPage);   
                    //$sql = "SELECT * FROM customer_crm WHERE customer_group_id = $input OR date_followup= CURDATE() ORDER BY customer_group_id DESC limit $start, $length ";
                    $sql = "SELECT * FROM customer_crm ORDER BY date_followup DESC limit $start, $length ";
                    //$sql = "SELECT * FROM customer_crm WHERE customer_group_id = $input ORDER BY date_followup DESC limit $start, $length ";
                    }


                   $sth = $pdo->prepare($sql);
                   $sth->bindParam(':start',$start,PDO::PARAM_INT);
                   $sth->bindParam(':length',$length,PDO::PARAM_INT);
                   $sth->bindParam(':query',$query,PDO::PARAM_STR);
                   $sth->execute();



                   foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {

【问题讨论】:

  • paginator.php的内容是什么?我们是在谈论 CakePHP 分页器还是 Illuminate 分页器?

标签: php mysql pagination


【解决方案1】:

不知道我们在说哪个Paginator,我只能建议你做类似的事情

include 'database.php';
include 'paginator.php';
$pdo = Database::connect();
$paginator = new Paginator();

$query = (isset($_GET["query"]) && strlen($_GET["query"])>1)? '%'.$_GET["query"].'%':'%';

$countsql = "SELECT * FROM customer_crm WHERE firstname LIKE :query OR email LIKE :query OR telephone LIKE :query ";
$sthcount = $pdo->prepare($countsql);
$sthcount->bindParam(':query',$query,PDO::PARAM_STR);
$sthcount->execute();

$count=$sthcount->fetchColumn();
$paginator->paginate($count);

$start = (($paginator->getCurrentPage()-1)*$paginator->itemsPerPage);
$length = ($paginator->itemsPerPage); 

$sql = $countsql . ' ORDER BY date_followup DESC limit :start, :length ';

$sth = $pdo->prepare($sql);
$sth->bindParam(':start',$start,PDO::PARAM_INT);
$sth->bindParam(':length',$length,PDO::PARAM_INT);
$sth->bindParam(':query',$query,PDO::PARAM_STR);
$sth->execute();

看,你在这里犯了两个错误:

  • 在不考虑查询的情况下获取您的 count 值。无论$_GET['query'] 是否存在,您都应该设置$query 的值,并在计数查询和结果查询中使用它。

  • 正在执行的查询中不存在占位符和值的绑定参数。确保您的结果查询包含 :query:start:length,否则您将绑定比查询更多的参数。

您还应该将语句包装在 try/catch 块中,以便调试正在发生的事情。

try {
    $sth = $pdo->prepare($sql);
    $sth->bindParam(':start',$start,PDO::PARAM_INT);
    $sth->bindParam(':length',$length,PDO::PARAM_INT);
    $sth->bindParam(':query',$query,PDO::PARAM_STR);
    $sth->execute();
} catch(\PDOException $e) {
    die('Error in query: '. $e->getMessage());
}

这样你就会知道查询失败是因为 Invalid parameter number: parameter was not defined

注意我不知道您的分页器如何知道当前页面,我也看不到您在哪里设置 itemsPerPage 值。

【讨论】:

  • 请忽略 $query 和 IF 语句,因为它们纯粹用于页面上的搜索功能。如果没有搜索请求,则发生 ELSE 查询,这是根据 SELECT 请求进行分页的地方。分页可以正常工作,因为 $sql = "SELECT * FROM customer_crm ORDER BY date_followup DESC limit $start, $length";,但当我添加 WHERE 语句时却不行。
  • 仍然存在这样一个事实,即您正在绑定在 sql 语句中没有占位符的参数。您直接在 sql 中插入变量本身,所以没有什么要绑定的。另外,使用try/catch 块来查看发生了什么。此外,当您说“它不起作用”时,我们不明白您的意思是它显示错误、不显示任何内容、显示与 WHERE 子句不匹配的记录、显示应该在其他页面中的记录。
  • 不工作意味着 - 分页器显示的页面之一,其余页面不显示任何内容。 - 没有错误,只是没有结果。
  • 总是有老式的die('sql is: '.$sql); 我仍然看不到分页器如何知道您要查找的页面。此外,您是否肯定应该有比分页器 itemsPerPage 更多的结果(使用 WHERE 子句)?
  • 如前所述,Paginator 可用于:- $sql = "SELECT * FROM customer_crm ORDER BY date_followup DESC limit $start, $length ";但不是:- $sql = "SELECT * FROM customer_crm WHERE customer_group_id = $input ORDER BY date_followup DESC limit $start, $length ";所以我知道它正在工作,但不是当我在 SELECT 语句中添加 WHERE 语句时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多