【问题标题】:Pagination with Controllers -> keeps redirecting to index.php使用控制器进行分页 -> 不断重定向到 index.php
【发布时间】:2014-04-22 15:25:59
【问题描述】:

我正在为此创建一个新线程,因为我现在确实在某个地方。

我有一个寻呼系统,但是有一个问题。

我使用 DAO 和控制器。 事情是,我的第二页(我的分页系统)进入 index.php?page=2。这里的主要问题是,每当您转到 index.php 中不存在的页面时,它会自动重定向到 index.php。那里没有提到第 2 页,因为我不能提到那里的每一页,因为页面会增加,插入的项目越多。

这是我用于分页的整个代码:(已编辑)

<?php

    $mysqli = new mysqli("localhost", "wanthave", "wanthavepass", "wanthave");      
    $count_mem = $mysqli->query("SELECT `id` FROM `wanthave_items`");
    $rows = $count_mem->num_rows;

    $perPage = 5; // items to be shown per page
    $num_pages = ceil($rows / $perPage);

    $visiblePages = 5; // if current page is 7 show: 5,6,7,8,9,...
    $visibleOffset = ceil($visiblePages / 2) - 1; // number of pages to show on the left and on the right of the current page



    // Where do you use this ???
    // $start = $page == 1 ? 0 : (($page - 1) * $perPage);

    if ($num_pages > 1) {

        $first = $last = $pagesStr = '';

            echo $first . $pageStr . $last;

        }
            foreach($items as $item) {
                echo "<li>
                    <a href=\"index.php?page=item-detail&id={$item['id']}\">{$item['name']}</a>
                </li>";
            }

            for ($n = 1; $n < ($num_pages + 1); $n++) {
                echo "<a href='index.php?page=$n'>$n</a>";        
                if ($n < $num_pages) echo ",&nbsp;";      
            }
?>

我的 index.php

<?php
session_start();

define('DS', DIRECTORY_SEPARATOR);
define('WWW_ROOT', __DIR__ . DS);

$routes = array(
    'home' => array(
        'controller' => 'Item',
        'action' => 'index'
    ),
    'register' => array(
        'controller' => 'Users',
        'action' => 'register'
    ),
    'login' => array(
        'controller' => 'Users',
        'action' => 'login'
    ),
    'logout' => array(
        'controller' => 'Users',
        'action' => 'logout'
    ),
    'item-detail' => array(
        'controller' => 'Item',
        'action' => 'detail'
    ),
);

if(empty($_GET['page'])) {
    $_GET['page'] = 'home';
}
if(empty($routes[$_GET['page']])) {
    header('Location: index.php');
    exit();
}

$route = $routes[$_GET['page']];
$controllerName = $route['controller'] . 'Controller';

require_once WWW_ROOT . 'controller' . DS . $controllerName . ".php";

$controllerObj = new $controllerName();
$controllerObj->route = $route;
$controllerObj->filter();
$controllerObj->render();

【问题讨论】:

    标签: php controller pagination paging dao


    【解决方案1】:

    这是一篇关于使用 PHP Limit pagination page number 进行简单分页的好文章

    对于您的示例,首先您还应该验证 page 参数是否为整数,并且您可以部分摆脱最后一个 if-else 语句。所以让我们试着优化一下代码:

    <?php
    
        $mysqli = new mysqli("localhost", "wanthave", "wanthavepass", "wanthave");      
        $count_mem = $mysqli->query("SELECT `id` FROM `wanthave_items`");
        $rows = $count_mem->num_rows;
    
        $perPage = 5; // items to be shown per page
        $num_pages = ceil($rows / $perPage);
    
        $visiblePages = 5; // if current page is 7 show: 5,6,7,8,9,...
        $visibleOffset = ceil($visiblePages / 2) - 1; // number of pages to show on the left and on the right of the current page
    
        $page = isset($_REQUEST['page']) ? intval($_REQUEST['page']) : 1;    
    
        // Where do you use this ???
        // $start = $page == 1 ? 0 : (($page - 1) * $perPage);
    
        if ($num_pages > 1) {
    
            $first = $last = $pagesStr = '';
    
            if($num_pages > $visiblePages){ 
                // no need to show First page if already on it
                if($page != 1){
                    $first = "<a href='index.php?page=1'>First</a>";
                }
    
                // no need to show Last page if already on it
                if($page < $numPages){
                    $last = "<a href='index.php?page=$numPages'>Last</a>";
                }
    
                // the offset cannot be smaller or bigger than the min & max page number
                $fromPage = ($page - $visibleOffset) < 1 ? 1 : ($page - $visibleOffset);
                $toPage = ($page + $visibleOffset) > $numPage ? $numPage : ($page + $visibleOffset);
                for($i=$fromPage; $i<=$toPage; $i++){
                    $pagesStr .= "<a href='index.php?page=$i'>$i</a>";
                }
    
                echo $first . $pageStr . $last;
    
            } else {
    
                // NOTE: You don't really need this ELSE section at all
    
                // Where is $items defined ???
                foreach($items as $item) {
                    echo "<li>
                        <a href=\"index.php?page=item-detail&id={$item['id']}\">{$item['name']}</a>
                    </li>";
                }
    
                for ($n = 1; $n < ($num_pages + 1); $n++) {
                    echo "<a href='index.php?page=$n'>$n</a>";        
                    if ($n < $num_pages) echo ",&nbsp;";      
                }
         } 
    }
    ?>
    

    注意:

    如果您选择删除 ELSE 部分,请确保删除

    if($num_pages > $visiblePages){
        ...
    } 
    

    部分也是如此。这是一项不必要的检查,因为您可以简单地使用$fromPage$toPage 循环所有可用页面。

    我没有尝试过这段代码,所以它可能存在错误,但重要的是不要在代码中的任何地方使用硬编码值,并尽可能地尝试优化分页过程(而且很少有东西可以在这里修改)。

    【讨论】:

    • 好的,我已经稍微更改了我的代码,但它仍然会不断重定向。 $items 已在我的 ItemController.php 中设置: $items = $this->itemDAO->selectByDate(); $this->set('items', $items);这将是我的 index.php -> 一切都不起作用的主要原因
    • @KenjiBailly 在您的 index.php 中,您使用 'page' 参数来存储页码和不同的模块 - $routes。我强烈建议不要这样做。 index.php 文件的编码方式是使用 ?page=2 或任何将被重定向的数字的链接,因为 int 值不包含在 $routes 数组中。将页码参数从 ?page= 更改为 pg= 或在您的 index.php 中使用额外的检查:if(empty($routes[$_GET['page']]) &amp;&amp; !(int)$_GET['page']) {...}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多