【问题标题】:fetchColumn variable not being set on 2nd page and breaking paginationfetchColumn 变量未在第二页上设置并破坏分页
【发布时间】:2014-03-24 16:13:51
【问题描述】:

我正在使用http://www.phpeasystep.com/phptu/29.html 进行分页,并且之前在以前的网站上使用过它并且效果很好。

我现在在另一个站点上使用它,其代码布局与上一个站点相同,但 pdo 语句不同。

分页正在工作,在第 1 页显示 1、2、3、4、5 链接,当我点击第 2 页或更多时,结果显示,但分页链接消失。

如果我在 url 中添加 &page=2 或 3 或 4,则会显示正确的结果,但不会显示分页链接。

如果我手动将 $total_pages 设置为一个数字,例如 22,分页链接将在每个页面上都有效,所以我认为问题是在第 1 页之后没有设置 $total_pages。

我使用的 PDO 语句是:

    $tbl_name="index";      

$adjacents = 3;


$targetpage = "search.php";     
$limit = 6;                                 
$page = $_GET['page'];
if($page) 
    $start = ($page - 1) * $limit;          
else
    $start = 0;

if ($_GET['search'] == '' && $_GET['cat'] == 'acategory') {

    $cat = $_GET['cat'];

    $search = '';

    $array = $pdo->prepare("SELECT * from `index` where `category_name` = 'acategory' LIMIT         :start, :limit");
    $array->execute(array(':start' => $start, ':limit' => $limit));

    $query = $pdo->prepare("SELECT COUNT(*) from `index` where `category_name` = 'acategory'     LIMIT :start, :limit");
    $query->execute(array(':start' => $start, ':limit' => $limit));

    $total_pages = $query->fetchColumn();
}

    if ($page == 0) $page = 1;                  
$prev = $page - 1;                          
$next = $page + 1;                          
$lastpage = ceil($total_pages/$limit);      
$lpm1 = $lastpage - 1;                      


$pagination = "";
if($lastpage > 1)
{   
    $pagination .= "<div class=\"pagination\">";

    if ($page > 1) 
        $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$prev\">� previous</a>";
    else
        $pagination.= "<span class=\"disabled\">� previous</span>"; 


    if ($lastpage < 7 + ($adjacents * 2))   
    {   
        for ($counter = 1; $counter <= $lastpage; $counter++)
        {
            if ($counter == $page)
                $pagination.= "<span class=\"current\">$counter</span>";
            else
                $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$counter\">$counter</a>";                 
        }
    }
    elseif($lastpage > 5 + ($adjacents * 2))    
    {

        if($page < 1 + ($adjacents * 2))        
        {
            for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter</span>";
                else
                    $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$counter\">$counter</a>";                 
            }
            $pagination.= "...";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$lpm1\">$lpm1</a>";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$lastpage\">$lastpage</a>";       
        }

        elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
        {
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=1\">1</a>";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=2\">2</a>";
            $pagination.= "...";
            for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter</span>";
                else
                    $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$counter\">$counter</a>";                 
            }
            $pagination.= "...";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$lpm1\">$lpm1</a>";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$lastpage\">$lastpage</a>";       
        }

        else
        {
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=1\">1</a>";
            $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=2\">2</a>";
            $pagination.= "...";
            for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter</span>";
                else
                    $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$counter\">$counter</a>";                 
            }
        }
    }


    if ($page < $counter - 1) 
        $pagination.= "<a href=\"$targetpage?search=$search&cat=$cat&page=$next\">next �</a>";
    else
        $pagination.= "<span class=\"disabled\">next �</span>";
    $pagination.= "</div>\n";       
}

<?=$pagination; echo $total_pages; ?>

有一些 if 语句,但我知道我看到的结果正在执行正确的 if 语句。

我尝试在第 1 页后回显 $total_pages 变量,它没有输出任何内容,也没有显示任何错误。

当所有更改的只是 $page 和 $start 变量时,为什么要在第一个页面设置 $total_pages 而不是为后续页面设置?

谢谢

【问题讨论】:

  • 阅读how to squeeze an error message out of PDO。设置您的 $pdo 对象以使用 PDO::ERRMODE_EXCEPTION 以便在出现问题时抛出有用的异常 - 默认情况下,PDO 错误提示
  • 然后,看看this question,因为我怀疑您在显示错误时会看到的错误与您在LIMIT 中使用命名参数有关,并将它们作为数组传递args 到 execute() 而不是调用 bindParam() 并将它们的类型指定为整数。
  • 我应该把这个添加到代码中,但我已经设置了这个 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  • 然后确保您已打开 display_errors。如果 PDO 抛出异常,您应该会看到一个致命错误,因为您没有将它包装在 try/catch 中。 ini_set('display_errors', 1);
  • 好吧,我试试这个,虽然到另一个问题的链接似乎对我不起作用

标签: php variables pdo pagination


【解决方案1】:

你有 2 个问题。

如果您正在运行 PHP 5 >= 5.1.0,请关闭模拟准备,这将解决您的 LIMIT 问题。请参阅此Answer

$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

分页问题是由LIMITING查询引起的。

试试

$query = $pdo->prepare("SELECT COUNT(*) from `index` where `category_name` = 'acategory' ");
$query->execute();
$total_pages = $query->fetchColumn();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2021-04-17
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多