本文作者:温文曦

如何使用 PHP 和 MySQL 创建分页

温文曦 4周前 ( 11-01 12:42 ) 512 抢沙发 百度已收录
如何使用 PHP 和 MySQL 创建分页摘要: 对于本教程,我们将使用 PHP 和 MySQL 创建分页,分页是用户如何导航网站包含大量数据的某些部分,我们将在本教程中使用 MySQL,我们将从数据库中选择记录,并使用 HTML...

如何使用 PHP 和 MySQL 创建分页 第1张


对于本教程,我们将使用 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)

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

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

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

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

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

因此,现在我们需要从数据库获取当前页面的记录,下面的代码将做到这一点。

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

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

现在我们需要显示这些结果,结果将显示在表中,您可以按您想要的显示结果,但对于本教程,我们将使用一个表。

<table>
	<tr>
		<th>Name</th>
		<th>Age</th>
		<th>Join Date</th>
	</tr>
	<?php while ($row = $result->fetch_assoc()): ?>
	<tr>
		<td><?php echo $row['name']; ?></td>
		<td><?php echo $row['age']; ?></td>
		<td><?php echo $row['joined']; ?></td>
	</tr>
	<?php endwhile; ?></table>

上述代码将基本上显示每个学生在表中与他们的名字,年龄加入日期。

现在我们需要显示分页。

<?php if (ceil($total_pages / $num_results_on_page) > 0): ?><ul class="pagination">
	<?php if ($page > 1): ?>
	<li class="prev"><a href="pagination.php?page=<?php echo $page-1 ?>">Prev</a></li>
	<?php endif; ?>

	<?php if ($page > 3): ?>
	<li class="start"><a href="pagination.php?page=1">1</a></li>
	<li class="dots">...</li>
	<?php endif; ?>

	<?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; ?>
	<?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; ?>

	<li class="currentpage"><a href="pagination.php?page=<?php echo $page ?>"><?php echo $page ?></a></li>

	<?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; ?>
	<?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; ?>

	<?php if ($page < ceil($total_pages / $num_results_on_page)-2): ?>
	<li class="dots">...</li>
	<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>
	<?php endif; ?>

	<?php if ($page < ceil($total_pages / $num_results_on_page)): ?>
	<li class="next"><a href="pagination.php?page=<?php echo $page+1 ?>">Next</a></li>
	<?php endif; ?></ul><?php endif; ?>

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

之后,我们显示当前页面之前和之后 2 页,因此如果页面为 5,则将显示为这样1 ...3 4 5 6 7 ...14, 它基本上和在那之后一样, 但相反。

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

table {
	border-collapse: collapse;
	width: 500px;}td, th {
	padding: 10px;}th {
	background-color: #54585d;
	color: #ffffff;
	font-weight: bold;
	font-size: 13px;
	border: 1px solid #54585d;}td {
	color: #636363;
	border: 1px solid #dddfe1;}tr {
	background-color: #f9fafb;}tr:nth-child(odd) {
	background-color: #ffffff;}.pagination {
	list-style-type: none;
	padding: 10px 0;
	display: inline-flex;
	justify-content: space-between;
	box-sizing: border-box;}.pagination li {
	box-sizing: border-box;
	padding-right: 10px;}.pagination li a {
	box-sizing: border-box;
	background-color: #e2e6e6;
	padding: 8px;
	text-decoration: none;
	font-size: 12px;
	font-weight: bold;
	color: #616872;
	border-radius: 4px;}.pagination li a:hover {
	background-color: #d4dada;}.pagination .next a, .pagination .prev a {
	text-transform: uppercase;
	font-size: 12px;}.pagination .currentpage a {
	background-color: #518acb;
	color: #fff;}.pagination .currentpage a:hover {
	background-color: #518acb;}

现在,您应该具有类似:

如何使用 PHP 和 MySQL 创建分页 第2张


代码

完整pagination. php代码:

<?php// Below is optional, remove if you have already connected to your database.$mysqli = mysqli_connect('localhost', 'root', '', 'pagination');// Get the total number of records from our table "students".$total_pages = $mysqli->query('SELECT * FROM students')->num_rows;// Check if the page number is specified and check if it's a number, if not return the default page number which is 1.$page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1;// Number of results to show on each page.$num_results_on_page = 5;if ($stmt = $mysqli->prepare('SELECT * FROM students ORDER BY name LIMIT ?,?')) {
	// Calculate the page to get the results we need from our table.
	$calc_page = ($page - 1) * $num_results_on_page;
	$stmt->bind_param('ii', $calc_page, $num_results_on_page);
	$stmt->execute(); 
	// Get the results...
	$result = $stmt->get_result();
	?>
	<!DOCTYPE html>
	<html>
		<head>
			<title>PHP & MySQL Pagination by CodeShack</title>
			<meta charset="utf-8">
			<style>
			html {
				font-family: Tahoma, Geneva, sans-serif;
				padding: 20px;
				background-color: #F8F9F9;
			}
			table {
				border-collapse: collapse;
				width: 500px;
			}
			td, th {
				padding: 10px;
			}
			th {
				background-color: #54585d;
				color: #ffffff;
				font-weight: bold;
				font-size: 13px;
				border: 1px solid #54585d;
			}
			td {
				color: #636363;
				border: 1px solid #dddfe1;
			}
			tr {
				background-color: #f9fafb;
			}
			tr:nth-child(odd) {
				background-color: #ffffff;
			}
			.pagination {
				list-style-type: none;
				padding: 10px 0;
				display: inline-flex;
				justify-content: space-between;
				box-sizing: border-box;
			}
			.pagination li {
				box-sizing: border-box;
				padding-right: 10px;
			}
			.pagination li a {
				box-sizing: border-box;
				background-color: #e2e6e6;
				padding: 8px;
				text-decoration: none;
				font-size: 12px;
				font-weight: bold;
				color: #616872;
				border-radius: 4px;
			}
			.pagination li a:hover {
				background-color: #d4dada;
			}
			.pagination .next a, .pagination .prev a {
				text-transform: uppercase;
				font-size: 12px;
			}
			.pagination .currentpage a {
				background-color: #518acb;
				color: #fff;
			}
			.pagination .currentpage a:hover {
				background-color: #518acb;
			}
			</style>
		</head>
		<body>
			<table>
				<tr>
					<th>Name</th>
					<th>Age</th>
					<th>Join Date</th>
				</tr>
				<?php while ($row = $result->fetch_assoc()): ?>
				<tr>
					<td><?php echo $row['name']; ?></td>
					<td><?php echo $row['age']; ?></td>
					<td><?php echo $row['joined']; ?></td>
				</tr>
				<?php endwhile; ?>
			</table>
			<?php if (ceil($total_pages / $num_results_on_page) > 0): ?>
			<ul class="pagination">
				<?php if ($page > 1): ?>
				<li class="prev"><a href="pagination.php?page=<?php echo $page-1 ?>">Prev</a></li>
				<?php endif; ?>

				<?php if ($page > 3): ?>
				<li class="start"><a href="pagination.php?page=1">1</a></li>
				<li class="dots">...</li>
				<?php endif; ?>

				<?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; ?>
				<?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; ?>

				<li class="currentpage"><a href="pagination.php?page=<?php echo $page ?>"><?php echo $page ?></a></li>

				<?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; ?>
				<?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; ?>

				<?php if ($page < ceil($total_pages / $num_results_on_page)-2): ?>
				<li class="dots">...</li>
				<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>
				<?php endif; ?>

				<?php if ($page < ceil($total_pages / $num_results_on_page)): ?>
				<li class="next"><a href="pagination.php?page=<?php echo $page+1 ?>">Next</a></li>
				<?php endif; ?>
			</ul>
			<?php endif; ?>
		</body>
	</html>
	<?php
	$stmt->close();}?>

结论

恭喜,你已经成功地为您的网站创建了一个完整的分页网页,可以有很多不同的方式,但这种方式创建可能是最好的,因为安全。




文章版权及转载声明

作者:温文曦本文地址:https://www.vience.cn/blog/515.html发布于 4周前 ( 11-01 12:42 )
文章转载或复制请以超链接形式并注明出处文曦博客

赞(5
阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,512人围观)参与讨论

还没有评论,来说两句吧...