PHP+MySQL+HTML实现简单的分页查询

分页查询原理
分页实现的原理是利用LIMT限制select语句查询出的数据

SELECT content FROM wish LIMIT 0,10;  //查询第1页的10条数据
SELECT content FROM wish LIMIT 10,10;  //查询第2页的10条数据
SELECT content FROM wish LIMIT 30,10;  //查询第3页的10条数据

limit的第二个参数10表示每次查询出的最大条数,第一个参数与页码之间存在一定的关系
参数1=(页码-1)*每页查询的条数
实现分页查询

//获取当前页码,限制最小值是1
$page=max(input('get', 'page','d'),1);
$size=4;             //每页显示的条数
//分页查询愿望
$sql="select id,name,content,time,color from wish order by id desc limit ".page_sql($page, $size);

注:input为自定义函数,查看
为了防止查询到空白页,可通过以下代码控制

//查询结果为空时,自动返回第一页
//使用header函数实现重定向后,再通过exit停止脚本
if(empty($data) && $page>1){
	header('Location: index.php?page=1');
	exit;
}

生成分页导航

1、获取总页数

$sql='select count(*) from wish';
if(!$res=mysqli_query($link, $sql)){
	exit("SQL[$sql]执行失败:".mysqli_error($link));
}
$total=(int)mysqli_fetch_row($res)[0];

获取到总记录数后,就可以计算出总页数,计算公式为“总记录数/每页条数”,然后向上取整

2、生成分页导航

   /*
   * 生成分页导航
   * $url 链接地址
   * $total 总记录数
   * $page 当前页码值
   * $size 每页显示的条数
   * 返回生成的HTML结果
   */
   function page_html($url,$total,$page,$size){
   	//计算总页数
   	$maxpage=max(ceil($total/$size),1);
	//如果不足2页,则不显示分页
	if($maxpage<=1){
		return '';
	}
	if($page==1){
		$first="<span>首页</span>";
		$prev="<span>上一页</span>";
	}else{
		$first="<a href=\"{$url}1\">首页</a>";
		$prev='<a href="'.$url.($page-1).">上一页</a>";
	}
	//尾页
	if($page==$maxpage){
		$next='<span>下一页</span>';
		$last='<span>尾页</span>';
    }else{
    	$next='<a href="'.$url.(page+1).'">下一页</a>';
		$last="<a href=\"{$url}{$maxpage}\">尾页</a>";
    }
	//组合最终样式
	return "<p>当前位于:$page/$maxpage</p>$first $prev $next $last";
   }

上述代码中,$url是链接地址,用于和page参数的页码值拼接在一起。例如,当前是第2页,链接地址为“./index.php?page=2”。对于位于首页时,取消首页和上一页的链接;当位于尾页时,取消下一页和尾页的链接
完整代码
1、数据库连接代码:init.php

/*
  *连接数据库
  */
  $host='localhost';
  $user='onion';
  $password='onion';
  $database='php_wish';
  $port=3306;
  $socket='/tmp/mysql.sock';
  $charset='utf8';
  $link=mysqli_connect($host, $user, $password, $database, $port, $socket);
  if(!$link){
  	exit('数据库连接失败:'.mysqli_connect_error());
  }
  mysqli_set_charset($link, $charset);

2、用到的自定义函数代码:function.php

/**
 * 接收输入函数
 * array  $method 输入的数组(可用字符串get、post表示)
 * string $name  从数组中取出的变量名
 * string $type  表示类型的字符串
 * mixed  $default 变量不存在时使用的默认值
 * @return mixed 返回的结果
 */
 function input($method,$name,$type='s',$default=''){
 	$method=strtolower($method);
 	switch($method){
		case 'get':$method=$_GET;
		break;
		case 'post':$method=$_POST;
		break;
 	}
	$data=isset($method[$name])? $method[$name] : $default;
	switch($type){
		case 's' :   //字符串
			return is_string($data) ?$data :$default;
		case 'd':   //整型
			return (int) $data;
		case 'a':  //数组
			return is_array($data) ?$data:[];
		case 'b':  //boolean
			return is_bool($data) ?$data : FALSE;
		default:
			trigger_error('不存在的过滤类型:'.$type);
		
	}
 }
 
/*
 * 格式化日期
 *@param: $time 给定的时间戳
 *@return 从给定时间到现在经过了多长时间(天/小时/分钟/秒)
 * 通过计算当前时间戳和给定时间戳之间的差距,从而获得从给定时间到现在经过了多长时间
 * 在计算时,如果超过了一天就返回天数,不满一天且满一个小时就返回小时数
 * 如果不满一个小时就返回分钟数。依次类推,直到不满一秒时返回0.5秒结束
 */
 
 function format_date($time){
 	$diff=time()-$time;  //计算当前时间戳和给定时间戳之间的差距
 	$format=[86400=>'天',3600=>'小时',60=>'分钟',1=>'秒'];
 	foreach($format as $key => $val){
 		$result=floor($diff/$key);   //获取关联数组的下标
		if($result){
			return $result . $val;
		}
		return '0.5秒';
 	}
 }
 
 /**
  * 获取LIMIT的参数
  * $page 当前页码值
  * $size 每页显示的条数
  * 返回生成后的结果
  */
  function page_sql($page,$size){
  	return ($page-1)*$size .','.$size;
  }
  
  /**
   * 生成分页导航
   * $url 链接地址
   * $total 总记录数
   * $page 当前页码值
   * $size 每页显示的条数
   * 返回生成的HTML结果
   */
   function page_html($url,$total,$page,$size){
   	//计算总页数
   	$maxpage=max(ceil($total/$size),1);
	//如果不足2页,则不显示分页
	if($maxpage<=1){
		return '';
	}
	if($page==1){
		$first="<span>首页</span>";
		$prev="<span>上一页</span>";
	}else{
		$first="<a href=\"{$url}1\">首页</a>";
		$prev="<a href=\"$url.($page-1)\">上一页</a>";
	}
	//尾页
	if($page==$maxpage){
		$next='<span>下一页</span>';
		$last='<span>尾页</span>';
    }else{
    	$next='<a href="'.$url.($page+1).'">下一页</a>';
		$last="<a href=\"{$url}{$maxpage}\">尾页</a>";
    }
	//组合最终样式
	return "<p>当前位于:$page/$maxpage</p>$first $prev $next $last";
   }
   	/*
	 * 上述代码中,$url是链接地址,用于和page参数的页码值拼接在一起。
	 * 例如,当前是第2页,链接地址为“./index.php?page=2”。
	 * 对于位于首页时,取消首页和上一页的链接;当位于尾页时,取消下一页和尾页的链接
	 */

3、实现分页的代码:index.php

include_once './common/init.php';
include_once './common/function.php';
//获取当前页码,限制最小值是1
$page=max(input('get', 'page','d'),1);
$size=4;             //每页显示的条数
//分页查询愿望
$sql="select id,name,content,time,color from wish order by id desc limit ".page_sql($page, $size);

if (!$res = mysqli_query($link, $sql)) {
	exit("SQL[$sql]查询失败" . mysqli_error($link));
}
$data = mysqli_fetch_all($res);
//查询结果为空时,自动返回第一页
//使用header函数实现重定向后,再通过exit停止脚本
if(empty($data) && $page>1){
	header('Location: index.php?page=1');
	exit;
}
//获取总页数
$sql='select count(*) from wish';
if(!$res=mysqli_query($link, $sql)){
	exit("SQL[$sql]执行失败:".mysqli_error($link));
}
$total=(int)mysqli_fetch_row($res)[0];

//关闭数据库
mysqli_close($link);
//将数据输出到HTML模板中
foreach ($data as $v) {
	$html = <<<eof
	   <div
	   style="width: 200px;
	   height: 200px;
	   border: solid 1px red;
	   float: left;
	   margin: 20px;
	   font-family:'微软雅黑';
	   background-color: $v[4];
	   ">
			<ul style="line-height: 30px;
			    padding:0px 30px;
			    list-style: none;
			">
			<li>FROM: $v[1]</li>
			<li>$v[2]</li>
			<li>($v[3])</li>
		</ul>
	</div>
eof;
	echo $html;
}
//分页链接
echo '<br /><div>';
echo page_html('./index.php?page=', $total, $page, $size); 
echo '</div>';

结果:
效果比较普通,功能好像没什么问题,只做了5条数据
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单PHP 分页查询 MySQL 数据库的示例代码,同时使用 HTML 来显示数据和分页导航: ```php <?php // 连接 MySQL 数据库 $conn = mysqli_connect("localhost", "username", "password", "database"); // 每页显示的记录数 $records_per_page = 10; // 获取当前页码 if (isset($_GET["page"])) { $page = $_GET["page"]; } else { $page = 1; } // 计算偏移量 $offset = ($page - 1) * $records_per_page; // 查询总记录数 $sql = "SELECT COUNT(*) FROM table_name"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_row($result); $total_records = $row[0]; // 计算总页数 $total_pages = ceil($total_records / $records_per_page); // 查询数据 $sql = "SELECT * FROM table_name LIMIT $offset, $records_per_page"; $result = mysqli_query($conn, $sql); // 显示数据和分页导航 echo "<table>"; while ($row = mysqli_fetch_array($result)) { echo "<tr><td>". $row["column1"] ."</td><td>". $row["column2"] ."</td></tr>"; } echo "</table>"; echo "<p>"; if ($page > 1) { echo "<a href='?page=". ($page - 1) ."'>上一页</a> "; } for ($i = 1; $i <= $total_pages; $i++) { echo "<a href='?page=$i'>$i</a> "; } if ($page < $total_pages) { echo "<a href='?page=". ($page + 1) ."'>下一页</a>"; } echo "</p>"; // 关闭 MySQL 连接 mysqli_close($conn); ?> ``` 在上面的代码中,你需要将 `username`、`password`、`database` 和 `table_name` 替换为你自己的 MySQL 数据库信息和表名。同时,你需要根据你的实际需求修改每页显示的记录数和查询语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值