• 如何使用 PHP 和 MySQL 创建分页


    How to Create Pagination with PHP and MySQL

    对于本教程,我们将使用 PHP 和 MySQL 创建分页,分页是用户如何浏览包含大量数据的网站的某些部分,我们将在本教程中使用 MySQL,我们将从数据库中选择记录并显示它们在使用 HTML 和 PHP 分页的表格中。

    我们将在此分页中显示下一个和上一个按钮,以及第一页和最后一页,以及突出显示当前页面之间的页面。

    我们需要做的不仅仅是显示下一个和上一个按钮,但这是因为我们可以更改代码,将其更改为我们想要的方式,如果我们想删除分页页面,我们可以这样做。

    Pagination.php

    让我们继续创建分页文件,我们称之为pagination.php.

    我们现在需要连接到我们的数据库,我们可以使用以下代码行:

    $mysqli = mysqli_connect('localhost', 'root', '', 'pagination');
    

    您可以更改连接信息,将文本替换为您的 MySQL 详细信息:mysqli_connect(YOUR_HOST, YOUR_USERNAME, YOUR_PASSWORD, YOUR_DATABASE)

    出于本教程的目的,我创建了数据库分页, 下面是该数据库的 SQL 语句,使用phpMyAdmin或您首选的数据库管理工具运行 SQL 语句。

    1. CREATE DATABASE IF NOT EXISTS `pagination` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    2. USE `pagination`;
    3. CREATE TABLE IF NOT EXISTS `students` (
    4. `id` int(11) NOT NULL,
    5. `name` varchar(255) NOT NULL,
    6. `age` tinyint(1) NOT NULL,
    7. `joined` varchar(10) NOT NULL
    8. ) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8;
    9. INSERT INTO `students` (`id`, `name`, `age`, `joined`) VALUES
    10. (1, 'David Deacon', 23, '17/08/2018'),
    11. (2, 'Sheri Warner', 19, '03/05/2018'),
    12. (3, 'Sean Glover', 24, '24/07/2018'),
    13. (4, 'John West', 17, '13/08/2018'),
    14. (5, 'Rufus Clarke', 20, '28/07/2018'),
    15. (6, 'Roosevelt Myers', 20, '25/07/2018'),
    16. (7, 'Elvira Andrews', 22, '02/07/2018'),
    17. (8, 'Richard Cook', 26, '19/07/2018'),
    18. (9, 'Lorenzo Harris', 23, '01/07/2018'),
    19. (10, 'Eduardo Hoffman', 17, '03/07/2018'),
    20. (11, 'Jeanne Fisher', 20, '13/08/2018'),
    21. (12, 'Tracy Bowers', 30, '07/07/2018'),
    22. (13, 'Heidi Lawrence', 18, '04/06/2018'),
    23. (14, 'Tara Holland', 25, '01/07/1991'),
    24. (15, 'Grant Edwards', 22, '22/06/2018'),
    25. (16, 'Bradford Green', 29, '02/05/2018'),
    26. (17, 'Gwen Schultz', 20, '02/05/2018'),
    27. (18, 'Hope Dawson', 28, '21/08/2018'),
    28. (19, 'Florence Osborne', 19, '17/05/2018'),
    29. (20, 'Rickey Poole', 26, '28/06/2018'),
    30. (21, 'Casey Sutton', 28, '06/07/2018'),
    31. (22, 'Willie Lowe', 23, '11/05/2018'),
    32. (23, 'Stephen Schultz', 28, '15/07/2018'),
    33. (24, 'Eileen Lynch', 18, '12/06/2018'),
    34. (25, 'Aaron Ruiz', 29, '02/05/2018'),
    35. (26, 'Mae Murray', 30, '24/06/2018'),
    36. (27, 'Regina Hanson', 21, '26/07/2018'),
    37. (28, 'Cameron Mclaughlin', 20, '29/07/2018'),
    38. (29, 'Earl Hale', 17, '30/06/2018'),
    39. (30, 'Marta Blair', 24, '10/06/2018'),
    40. (31, 'Alberta Silva', 22, '05/06/2018'),
    41. (32, 'Joanna Holmes', 20, '20/05/2018'),
    42. (33, 'Alex Brock', 30, '12/05/2018'),
    43. (34, 'Colin Wright', 19, '28/05/2018'),
    44. (35, 'Peter Schmidt', 25, '10/07/2018'),
    45. (36, 'Joshua Price', 27, '13/07/2018'),
    46. (37, 'Elias Chandler', 22, '19/07/2018'),
    47. (38, 'Stanley Ross', 21, '02/06/2018'),
    48. (39, 'Vera Cole', 26, '02/05/2018'),
    49. (40, 'Johnny Daniels', 29, '19/07/2018'),
    50. (41, 'Yvonne Hopkins', 21, '16/07/2018');
    51. ALTER TABLE `students` ADD PRIMARY KEY (`id`);
    52. ALTER TABLE `students` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=42;

    让我们回到分页 PHP 文件,我们现在需要做的是创建一些我们将用于分页的重要变量。

    1. // Get the total number of records from our table "students".
    2. $total_pages = $mysqli->query('SELECT COUNT(*) FROM students')->fetch_row()[0];
    3. // Check if the page number is specified and check if it's a number, if not return the default page number which is 1.
    4. $page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1;
    5. // Number of results to show on each page.
    6. $num_results_on_page = 5;

    使用第一个变量,我们从学生我们数据库中的表,这将用于计算将有多少页。第二个变量用于确定用户在哪个页面上,例如,如果 URL 是pagination.php?page=3那么页码将为 3,如果 URL 中不存在该页面,则默认为 1。第三个变量确定每个页面上将显示多少个结果,例如,如果我们想显示 10 个结果(列表10 名学生)我们将数字更改为 10,默认设置为 5。

    所以现在我们需要从数据库中获取当前页面的记录,下面的代码就是这样做的。

    1. if ($stmt = $mysqli->prepare('SELECT * FROM students ORDER BY name LIMIT ?,?')) {
    2. // Calculate the page to get the results we need from our table.
    3. $calc_page = ($page - 1) * $num_results_on_page;
    4. $stmt->bind_param('ii', $calc_page, $num_results_on_page);
    5. $stmt->execute();
    6. // Get the results...
    7. $result = $stmt->get_result();
    8. $stmt->close();
    9. }

    上面的代码中发生了一些事情,我们要做的第一件事是准备语句,这可以防止 SQL 注入,如果你不这样做,你可能会面临被黑客攻击的风险,$calc_page变量基本上决定了我们表中的起始索引,之后,我们绑定变量(i是整数),然后执行SQL语句。结果将存储在$结果多变的。

    现在我们需要显示这些结果,结果将显示在表格中,您可以按照自己的方式显示结果,但对于本教程,我们将使用表格。

    1. while ($row = $result->fetch_assoc()): ?>
    2. endwhile; ?>
    3. NameAgeJoin Date
      echo $row['name']; ?> echo $row['age']; ?> echo $row['joined']; ?>

    上面的代码基本上会在表格中显示每个学生及其姓名年龄, 和加入日期。

    现在我们需要显示分页。

    1. if (ceil($total_pages / $num_results_on_page) > 0): ?>
      • class="pagination">
    2. php if ($page > 1): ?>
    3. <li class="prev"><a href="pagination.php?page=php echo $page-1 ?>">Preva>li>
    4. php endif; ?>
    5. php if ($page > 3): ?>
    6. <li class="start"><a href="pagination.php?page=1">1a>li>
    7. <li class="dots">...li>
    8. php endif; ?>
    9. php if ($page-2 > 0): ?><li class="page"><a href="pagination.php?page=php echo $page-2 ?>">php echo $page-2 ?>a>li>php endif; ?>
    10. php if ($page-1 > 0): ?><li class="page"><a href="pagination.php?page=php echo $page-1 ?>">php echo $page-1 ?>a>li>php endif; ?>
    11. <li class="currentpage"><a href="pagination.php?page=php echo $page ?>">php echo $page ?>a>li>
    12. php if ($page+1 < ceil($total_pages / $num_results_on_page)+1): ?><li class="page"><a href="pagination.php?page=php echo $page+1 ?>">php echo $page+1 ?>a>li>php endif; ?>
    13. php if ($page+2 < ceil($total_pages / $num_results_on_page)+1): ?><li class="page"><a href="pagination.php?page=php echo $page+2 ?>">php echo $page+2 ?>a>li>php endif; ?>
    14. php if ($page < ceil($total_pages / $num_results_on_page)-2): ?>
    15. <li class="dots">...li>
    16. <li class="end"><a href="pagination.php?page=php echo ceil($total_pages / $num_results_on_page) ?>">php echo ceil($total_pages / $num_results_on_page) ?>a>li>
    17. php endif; ?>
    18. php if ($page < ceil($total_pages / $num_results_on_page)): ?>
    19. <li class="next"><a href="pagination.php?page=php echo $page+1 ?>">Nexta>li>
    20. php endif; ?>
    21. ul>
    22. php endif; ?>

    我们在这里做的第一件事是检查是否有超过 1 页,如果只有 1 页则不需要显示分页。然后我们检查当前页面是否大于1,如果是则显示上一个按钮,然后如果页面大于3我们可以显示第一页,也就是1。

    之后我们显示当前页前后的2页,所以如果第5页会这样显示1 ... 3 4 5 6 7 ... 14,这与我们之后所做的基本相同,但相反。

    现在我们需要为我们的分页和表格添加一些样式,下面的 CSS 代码将做到这一点。

    1. table {
    2. border-collapse: collapse;
    3. width: 500px;
    4. }
    5. td, th {
    6. padding: 10px;
    7. }
    8. th {
    9. background-color: #54585d;
    10. color: #ffffff;
    11. font-weight: bold;
    12. font-size: 13px;
    13. border: 1px solid #54585d;
    14. }
    15. td {
    16. color: #636363;
    17. border: 1px solid #dddfe1;
    18. }
    19. tr {
    20. background-color: #f9fafb;
    21. }
    22. tr:nth-child(odd) {
    23. background-color: #ffffff;
    24. }
    25. .pagination {
    26. list-style-type: none;
    27. padding: 10px 0;
    28. display: inline-flex;
    29. justify-content: space-between;
    30. box-sizing: border-box;
    31. }
    32. .pagination li {
    33. box-sizing: border-box;
    34. padding-right: 10px;
    35. }
    36. .pagination li a {
    37. box-sizing: border-box;
    38. background-color: #e2e6e6;
    39. padding: 8px;
    40. text-decoration: none;
    41. font-size: 12px;
    42. font-weight: bold;
    43. color: #616872;
    44. border-radius: 4px;
    45. }
    46. .pagination li a:hover {
    47. background-color: #d4dada;
    48. }
    49. .pagination .next a, .pagination .prev a {
    50. text-transform: uppercase;
    51. font-size: 12px;
    52. }
    53. .pagination .currentpage a {
    54. background-color: #518acb;
    55. color: #fff;
    56. }
    57. .pagination .currentpage a:hover {
    58. background-color: #518acb;
    59. }

    你现在应该有一些看起来像这样的东西:


     

    源代码

    完整的pagination.php源代码

    1. // Below is optional, remove if you have already connected to your database.
    2. $mysqli = mysqli_connect('localhost', 'root', '', 'pagination');
    3. // Get the total number of records from our table "students".
    4. $total_pages = $mysqli->query('SELECT * FROM students')->num_rows;
    5. // Check if the page number is specified and check if it's a number, if not return the default page number which is 1.
    6. $page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1;
    7. // Number of results to show on each page.
    8. $num_results_on_page = 5;
    9. if ($stmt = $mysqli->prepare('SELECT * FROM students ORDER BY name LIMIT ?,?')) {
    10. // Calculate the page to get the results we need from our table.
    11. $calc_page = ($page - 1) * $num_results_on_page;
    12. $stmt->bind_param('ii', $calc_page, $num_results_on_page);
    13. $stmt->execute();
    14. // Get the results...
    15. $result = $stmt->get_result();
    16. ?>
    17. DOCTYPE html>
    18. <html>
    19. <head>
    20. <title>PHP & MySQL Pagination by CodeShacktitle>
    21. <meta charset="utf-8">
    22. <style>
    23. html {
    24. font-family: Tahoma, Geneva, sans-serif;
    25. padding: 20px;
    26. background-color: #F8F9F9;
    27. }
    28. table {
    29. border-collapse: collapse;
    30. width: 500px;
    31. }
    32. td, th {
    33. padding: 10px;
    34. }
    35. th {
    36. background-color: #54585d;
    37. color: #ffffff;
    38. font-weight: bold;
    39. font-size: 13px;
    40. border: 1px solid #54585d;
    41. }
    42. td {
    43. color: #636363;
    44. border: 1px solid #dddfe1;
    45. }
    46. tr {
    47. background-color: #f9fafb;
    48. }
    49. tr:nth-child(odd) {
    50. background-color: #ffffff;
    51. }
    52. .pagination {
    53. list-style-type: none;
    54. padding: 10px 0;
    55. display: inline-flex;
    56. justify-content: space-between;
    57. box-sizing: border-box;
    58. }
    59. .pagination li {
    60. box-sizing: border-box;
    61. padding-right: 10px;
    62. }
    63. .pagination li a {
    64. box-sizing: border-box;
    65. background-color: #e2e6e6;
    66. padding: 8px;
    67. text-decoration: none;
    68. font-size: 12px;
    69. font-weight: bold;
    70. color: #616872;
    71. border-radius: 4px;
    72. }
    73. .pagination li a:hover {
    74. background-color: #d4dada;
    75. }
    76. .pagination .next a, .pagination .prev a {
    77. text-transform: uppercase;
    78. font-size: 12px;
    79. }
    80. .pagination .currentpage a {
    81. background-color: #518acb;
    82. color: #fff;
    83. }
    84. .pagination .currentpage a:hover {
    85. background-color: #518acb;
    86. }
    87. style>
    88. head>
    89. <body>
    90. <table>
    91. <tr>
    92. <th>Nameth>
    93. <th>Ageth>
    94. <th>Join Dateth>
    95. tr>
    96. fetch_assoc()): ?>
    97. <tr>
    98. <td>td>
    99. <td>td>
    100. <td>td>
    101. tr>
    102. table>
    103. 0): ?>
    104. <ul class="pagination">
    105. 1): ?>
    106. <li class="prev"><a href="pagination.php?page=">Preva>li>
    107. 3): ?>
    108. <li class="start"><a href="pagination.php?page=1">1a>li>
    109. <li class="dots">...li>
    110. 0): ?><li class="page"><a href="pagination.php?page=">a>li>
    111. 0): ?><li class="page"><a href="pagination.php?page=">a>li>
    112. <li class="currentpage"><a href="pagination.php?page=">a>li>
    113. <li class="page"><a href="pagination.php?page=">a>li>
    114. <li class="page"><a href="pagination.php?page=">a>li>
    115. <li class="dots">...li>
    116. <li class="end"><a href="pagination.php?page=">a>li>
    117. <li class="next"><a href="pagination.php?page=">Nexta>li>
    118. ul>
    119. body>
    120. html>
    121. $stmt->close();
    122. }
    123. ?>

    结论

    恭喜,您已经成功地为您的网站创建了一个完全工作的分页,您可以通过多种不同的方式创建分页,这种方式可能是最好的方式之一,而且它是安全的!如果您喜欢本教程,请记得订阅和分享,关注我们的社交媒体帐户,帮助我们的网站发展,我们将提供更多有用的教程。

     

  • 相关阅读:
    Linux系统下建立Socket聊天服务器
    HarmonyOS ArkUI实战开发-NAPI方法扩展
    kafka 3.0 离线安装
    Spring注解-1.组件注册
    深度神经网络预测模型,神经网络预测未来数据
    python基于django药房药品销售进销存管理系统
    MC33665 + MC33774 控制流程及 TPL3 帧结构介绍
    ib课程北京国际学校哪里有?
    iOS多界面传值
    uniapp小程序与webview通信
  • 原文地址:https://blog.csdn.net/allway2/article/details/126408479