【问题标题】:Issue with pagination buttons, can't get another article分页按钮问题,无法获得另一篇文章
【发布时间】:2020-12-28 19:38:24
【问题描述】:

我的分页有问题,我尽量把我的问题说清楚

首先,我有过滤器和文章列表。我正在从文件 fetch_data.php 获取什么列表

在这个页面上,我正在做一些SQL query corrections,并用while循环来渲染日期。

我想为它做一个分页。

首先我所做的就是像这样在文件集代码的开头。

if (isset($_GET['pageno'])) {
    $pageno = $_GET['pageno'];
} else {
    $pageno = 1;
}

然后我在SQL查询WHERE语句中的过滤器更正,如果需要我会上传它。

然后我写分页代码

    $no_of_records_per_page = 1; // record for show (its works) 
    $offset = ($pageno-1) * $no_of_records_per_page; 
// In this line im cut my querty start SELECT * and replace it with SELECT count (*) with conditions who made by filters. 
    $str2 = substr($query, 12); 
    $total_pages_sql = "SELECT count(*)";
    
    $total_pages_sql .= $str2; 
    $result = mysqli_query($con,$total_pages_sql);
    $total_rows = mysqli_fetch_array($result)[0];
    $total_pages = ceil($total_rows / $no_of_records_per_page);

当只需添加我的主要query LIMIT。

  $query .= "LIMIT $offset, $no_of_records_per_page"; 

然后在文件的最后,我放了代码

<div class="content">           
<ul class="pagination">
    <li><a href="?pageno=1">First</a></li>
    <li class="<?php if($pageno <= 1){ echo 'disabled'; } ?>">
        <a href="<?php if($pageno <= 1){ echo '#'; } else { echo "?pageno=".($pageno - 1); } ?>">Prev</a>
    </li>
    <li class="<?php if($pageno >= $total_pages){ echo 'disabled'; } ?>">
        <a href="<?php if($pageno >= $total_pages){ echo '#'; } else { echo "?pageno=".($pageno + 1); } ?>">Next</a>
    </li>
    <li><a href="?pageno=<?php echo $total_pages; ?>">Last</a></li>
</ul>
</div>  

重要的是要在index.php 中说所有这些节目,但现在问题是这个。我的

按钮可以更改分页 URL,但无法正常工作。如果我选择了只有一条记录的过滤器,那么 NEXT 按钮会使其不可见,因此它可以正常工作,

但是为什么如果我只使用分页下一个按钮我总是得到同一篇文章

知道为什么吗?

在下面的链接中更新了完整的 php 文件

Index.php 代码为here

fetch_data.php 代码是here

【问题讨论】:

  • 那么问题是什么?尽管您的过滤器选项应该禁用它,或者更确切地说它正在工作,但您的下一个按钮是否仍在显示?
  • 然后我按下下一个按钮我没有得到另一篇文章,它只是同一篇文章
  • 明确一点:当你点击Next时,页码变化正确,但始终是同一篇文章,还是页码没有变化?
  • 你检查过你的查询字符串吗?可能偏移不正确
  • SELECT count(*)LIMIT ..."之间没有空格,是不是查询不正确?我看到了串联,但不会自动添加空格。

标签: php html pagination


【解决方案1】:

有一个使用 PHP 和 MySQLi 的 Ajax 分页示例。

(1)。首先创建数据库表名developers

CREATE TABLE `developers` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `skills` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `gender` varchar(255) NOT NULL,
  `designation` varchar(255) NOT NULL,
  `age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

(2).在developers表中插入数据:

INSERT INTO `developers` (`id`, `name`, `skills`, `address`, `gender`, `designation`, `age`) VALUES
(1, 'Smith', 'Java', 'Newyork', 'Male', 'Software Engineer', 34),
(2, 'David', 'PHP', 'London', 'Male', 'Web Developer', 28),
(3, 'Rhodes', 'jQuery', 'New Jersy', 'Male', 'Web Developer', 30),
(4, 'Sara', 'JavaScript', 'Delhi', 'Female', 'Web Developer', 25),
(5, 'Shyrlin', 'NodeJS', 'Tokiyo', 'Female', 'Programmer', 35),
(6, 'Steve', 'Angular', 'London', 'Male', 'Web Developer', 28),
(7, 'Cook', 'MySQL', 'Paris', 'Male', 'Web Developer', 26),
(8, 'Root', 'HTML', 'Paris', 'Male', 'Web Developer', 28),
(9, 'William', 'jQuery', 'Sydney', 'Male', 'Web Developer', 23),
(10, 'Nathan', 'PHP', 'London', 'Male', 'Web Developer', 28),
(11, 'Shri', 'PHP', 'Delhi', 'Male', 'Web Developer', 38),
(12, 'Jay', 'PHP', 'Delhi, India', 'Male', 'Web Developer', 30);

(3) 创建index.php

<?php
include_once("db_connect.php");
$perPage = 5;
$sqlQuery = "SELECT * FROM developers";
$result = mysqli_query($conn, $sqlQuery);
$totalRecords = mysqli_num_rows($result);
$totalPages = ceil($totalRecords/$perPage)
?>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="plugin/simple-bootstrap-paginator.js"></script>
<script src="js/pagination.js"></script>

<div class="container"> 
    <div class="row">
        <table class="table table-hover table-bordered">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Name</th>
                    <th>Age</th>
                    <th>Address</th>
                    <th>Skills</th>
                    <th>Designation</th>
                </tr>
            </thead>
            <tbody id="content">     
            </tbody>
        </table>   
        <div id="pagination"></div>    
        <input type="hidden" id="totalPages" value="<?php echo $totalPages; ?>">    
    </div>    
</div>

(5) 创建pagination.js

 <script type="text/javascript">

    $(document).ready(function(){
        var totalPage = parseInt($('#totalPages').val());   
        var pag = $('#pagination').simplePaginator({
            totalPages: totalPage,
            maxButtonsVisible: 5,
            currentPage: 1,
            nextLabel: 'Next',
            prevLabel: 'Prev',
            firstLabel: 'First',
            lastLabel: 'Last',
            clickCurrentPage: true,
            pageChange: function(page) {            
                $("#content").html('<tr><td colspan="6"><strong>loading...</strong></td></tr>');
                $.ajax({
                    url:"load_data.php",
                    method:"POST",
                    dataType: "json",       
                    data:{page: page},
                    success:function(responseData){
                        $('#content').html(responseData.html);
                    }
                });
            }
        });
    });

</script>

(6) 创建load_data.php

<?php
include_once("db_connect.php");
$perPage = 5;
if (isset($_GET["page"])) { 
    // type-casting to integer to avoid SQL injection
    $page  = (int)$_GET["page"]; 
} else { 
    $page=1; 
};  
$startFrom = ($page-1) * $perPage;  
$sqlQuery = "SELECT id, name, age, address, skills, designation
    FROM developers ORDER BY id ASC LIMIT $startFrom, $perPage";  
$result = mysqli_query($conn, $sqlQuery); 
$paginationHtml = '';
while ($row = mysqli_fetch_assoc($result)) {  
    $paginationHtml.='<tr>';  
    $paginationHtml.='<td>'.$row["id"].'</td>';
    $paginationHtml.='<td>'.$row["name"].'</td>';
    $paginationHtml.='<td>'.$row["age"].'</td>'; 
    $paginationHtml.='<td>'.$row["address"].'</td>';
    $paginationHtml.='<td>'.$row["skills"].'</td>';
    $paginationHtml.='<td>'.$row["designation"].'</td>'; 
    $paginationHtml.='</tr>';  
} 
$jsonData = array(
    "html"  => $paginationHtml, 
);
echo json_encode($jsonData); 
?>

【讨论】:

  • 谢谢你的例子,但我的系统不同,我没有表和我的代码不在同一个 php 文件中,所以请检查我更新后的文件中的完整代码。
  • but my system different & i dont have table & my code not in the same php file 是什么意思??
  • 看看我更新的代码。如您所见,在 fetch_data.php 中存在 artical 的输出,但在 index.php 中显示。
  • 在您的示例中,您使用表格进行操作。
  • 那你想要什么??
【解决方案2】:

@KUMAR 提供的答案非常好,可以解决您的所有问题。此外,您应该遵循他的代码,以了解您的代码在调试和可读性方面应该有多干净。

从最佳实践的角度来看,您的代码存在许多问题,我认为在尝试调试应用程序之前需要您注意这些问题。

我发现你的代码很难理解,例如:

您使用大量硬编码字符串进行检查以构建查询。

这里:WHERE ad.status='Patvirtintas',通过谷歌翻译快速搜索,我发现它的意思是已批准。当您可以使用标志时,为什么将其作为字符串存储在数据库中。 0/1 表示未批准/批准。或者不同的数字,如果有多个状态。

另外,为了清理您的代码,这些代码最好存储在一个所谓的 ENUM 中,在 PHP 中您可以将其编写为一个类,例如:

class PostStatus
{
    const NotApproved = 0;
    const Approved = 1;
}

$postStatus = PostStatus::Approved;

列表还在继续,从间距、缩进开始。我建议你应该学习干净代码的课程。

你应该分离你的代码,使用一个文件,你可以在其中构造查询,从数据库中获取数据,用它创建一个 JSON 数组,并作为响应返回,不要在返回的内容中附加任何 HTML、CSS、JavaScript回应。

对我上面提到的文件使用 ajax 调用,并带有所需页面的参数,我非常确定它应该可以正常工作。

另外,对于 PHP 而不是:

&lt;a href="&lt;?php if($pageno &gt;= $total_pages){ echo '#'; } else { echo "?pageno=".($pageno + 1); } ?&gt;"&gt;Next&lt;/a&gt;

使用速记和三元运算符(如果您的 PHP 版本高于 5,如果我没记错的话),在您的情况下看起来像这样:

&lt;a href="&lt;?= $pageno &gt;= $total_pages ? '#' : '?pageno=". ($pageno + 1) . "' ?&gt;"&gt;Next&lt;/a&gt;

相信我,使用上面 KUMAR 提供的代码,并根据您的需要进行调整。没有人会为您提供开箱即用的东西,因为没有人可以对其进行测试,或者对您的应用程序以及所需的行为有足够的了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多