当前位置:首页 » 编程语言 » phpsql分页查询
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

phpsql分页查询

发布时间: 2022-04-19 16:22:02

① PHP分页sql语句

mysql_query("SELECT * FROM gb_content order by id desc limit " .$limit. ','.$lines.'')
后面的limit是控制页面的内容,也就是假如一页10个
第一页 开始1-10
第二 开始 11-10
第三 开始 21 -10

② php mysql查询结果分页显示

<?php

$mysql_server_name="localhost";

$mysql_username='root';
$mysql_password='';
$mysql_database='hp';
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password);
@mysql_connect("localhost","root","")ordie("数据库连接失败");
@mysql_select_db("hp")ordie("数据库不存在");

mysql_query("setnamesutf8");

$pagesize=$_GET['pagesize']>0?$_GET['pagesize']:10;//默认情况下每页显示10条数据
$pagenum=$_GET['pagenum']>0?$_GET['pagenum']:0;
$query_start=$pagesize*$pagenum;
if($_POST['submit']){
$strsql_add='';
$strsql_add.=$_POST['idc']?"andidc='$_POST[idc]'":"";
$strsql_add.=$_POST['jiguihao']?"andjiguihao='$_POST[jiguihao]'":"";
$strsql_add.=$_POST['neicun']?"andneicun='$_POST[neicun]'":"";
$strsql_add.=$_POST['yingpan']?"andyingpan='$_POST[yingpan]'":"";
$strsql_add.=$_POST['xinghao']?"andxinghao='$_POST[xinghao]'":"";
$strsql_add.=$_POST['cpu']?"andcpu='$_POST[cpu]'":"";
$strsql_add.=$_POST['guishu']?"andguishu='$_POST[guishu]'":"";
$strsql_add.=$_POST['ip']?"andip='$_POST[ip]'":"";
}
$strsql="select*fromzichanwhere1=1$strsql_addlimit$query_start,$pagesize";

$result=mysql_db_query($mysql_database,$strsql,$conn);

$row=mysql_fetch_row($result);
$nextpage_num=$pagenum++;
$lastpage_num=ceil(count($row)/$pagesize);

echo'<fontface="verdana">';
echo'<tableborder="1"cellpadding="1"cellspacing="2">';

//显示字段名称
echo"</b><tr></b>";
for($i=0;$i<mysql_num_fields($result);$i++)
{
echo'<tdbgcolor="#00FF00"><b>'.
mysql_field_name($result,$i);
echo"</b></td></b>";
}
echo"</tr></b>";
//定位到第一条记录
mysql_data_seek($result,0);
//循环取出记录
while($row=mysql_fetch_row($result))
{
echo"<tr></b>";
for($i=0;$i<mysql_num_fields($result);$i++)
{
echo'<tdbgcolor="#00FF00">';
echo$row[$i];
echo'</td>';
}
echo'<td><ahref='xiugai.php?id='.$row[0].''>修改</a>';
echo'</td>';
echo'<td><ahref="javascript:void(0)"onclick="if(window.confirm('确认删除?')){window.location.href='del.php?id='.$row[0].''}">删除</a>';
echo'</td>';
echo"</tr></b>";
}

echo"</table></b>";
echo"</font>";
//释放资源
mysql_free_result($result);
//关闭连接
mysql_close($conn);

?>

html页面要增加的参数:

首页 增加 &pagenum=0 或者 不加

下一页 &pagenum= $nextpage_num

尾页 &pagenum= $lastpage_num

③ PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。

我们先从一个常用但性能很差的查询来看一看。

SELECT *
FROM city
ORDER BY id DESC
LIMIT 0, 15

这个查询耗时0.00sec。So,这个查询有什么问题呢?实际上,这个查询语句和参数都没有问题,因为它用到了下面表的主键,而且只读取15条记录。

CREATE TABLE city (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
city varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

真正的问题在于offset(分页偏移量)很大的时候,像下面这样:

SELECT *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

上面的查询在有2M行记录时需要0.22sec,通过EXPLAIN查看SQL的执行计划可以发现该SQL检索了100015行,但最后只需要15行。大的分页偏移量会增加使用的数据,MySQL会将大量最终不会使用的数据加载到内存中。就算我们假设大部分网站的用户只访问前几页数据,但少量的大的分页偏移量的请求也会对整个系统造成危害。Facebook意识到了这一点,但Facebook并没有为了每秒可以处理更多的请求而去优化数据库,而是将重心放在将请求响应时间的方差变小。

对于分页请求,还有一个信息也很重要,就是总共的记录数。我们可以通过下面的查询很容易的获取总的记录数。

SELECT COUNT(*)
FROM city;

然而,上面的SQL在采用InnoDB为存储引擎时需要耗费9.28sec。一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面看看这个语句的查询性能。

SELECT SQL_CALC_FOUND_ROWS *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

这个语句耗时20.02sec,是上一个的两倍。事实证明使用 SQL_CALC_FOUND_ROWS 做分页是很糟糕的想法。
下面来看看到底如何优化。文章分为两部分,第一部分是如何获取记录的总数目,第二部分是获取真正的记录。

高效的计算行数

如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可。相似的,在堆表中也会将行数存储到表的元信息中。但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数。

我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:

SELECT COUNT(*)
FROM city
USE INDEX(PRIMARY);

获取记录

下面进入这篇文章最重要的部分,获取分页要展示的记录。上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句。为了演示,我们创建一个新的表“news”,按照时事性排序(最新发布的在最前面),实现一个高性能的分页。为了简单,我们就假设最新发布的新闻的Id也是最大的。

CREATE TABLE news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL
) ENGINE=InnoDB;

一个比较高效的方式是基于用户展示的最后一个新闻Id。查询下一页的语句如下,需要传入当前页面展示的最后一个Id。

SELECT *
FROM news WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage

查询上一页的语句类似,只不过需要传入当前页的第一个Id,并且要逆序。

SELECT *
FROM news WHERE id > $last_id
ORDER BY id ASC
LIMIT $perpage

上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示“上一页”和“下一页”,例如博客中页脚显示“上一页”,“下一页”的按钮。但如果要实现真正的页面导航还是很难的,下面看看另一种方式。

SELECT id
FROM (
SELECT id, ((@cnt:= @cnt + 1) + $perpage - 1) % $perpage cnt
FROM news
JOIN (SELECT @cnt:= 0)T
WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage * $buttons
)C
WHERE cnt = 0;

通过上面的语句可以为每一个分页的按钮计算出一个offset对应的id。这种方法还有一个好处。假设,网站上正在发布一片新的文章,那么所有文章的位置都会往后移一位,所以如果用户在发布文章时换页,那么他会看见一篇文章两次。如果固定了每个按钮的offset Id,这个问题就迎刃而解了。Mark Callaghan发表过一篇类似的博客,利用了组合索引和两个位置变量,但是基本思想是一致的。

如果表中的记录很少被删除、修改,还可以将记录对应的页码存储到表中,并在该列上创建合适的索引。采用这种方式,当新增一个记录的时候,需要执行下面的查询重新生成对应的页号。

SET p:= 0;
UPDATE news SET page=CEIL((p:= p + 1) / $perpage) ORDER BY id DESC;

当然,也可以新增一个专用于分页的表,可以用个后台程序来维护。

UPDATE pagination T
JOIN (
SELECT id, CEIL((p:= p + 1) / $perpage) page
FROM news
ORDER BY id
)C
ON C.id = T.id
SET T.page = C.page;

现在想获取任意一页的元素就很简单了:

SELECT *
FROM news A
JOIN pagination B ON A.id=B.ID
WHERE page=$offset;

还有另外一种与上种方法比较相似的方法来做分页,这种方式比较试用于数据集相对小,并且没有可用的索引的情况下—比如处理搜索结果时。在一个普通的服务器上执行下面的查询,当有2M条记录时,要耗费2sec左右。这种方式比较简单,创建一个用来存储所有Id的临时表即可(这也是最耗费性能的地方)。

CREATE TEMPORARY TABLE _tmp (KEY SORT(random))
SELECT id, FLOOR(RAND() * 0x8000000) random
FROM city;

ALTER TABLE _tmp ADD OFFSET INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, DROP INDEX SORT,ORDER BY random;

接下来就可以向下面一样执行分页查询了。

SELECT *
FROM _tmp
WHERE OFFSET >= $offset
ORDER BY OFFSET
LIMIT $perpage;

简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。

④ php 连接MS SQL 2000数据库,如何实现分页

SELECT
TOP
25
*
FROM
(SELECT
*
FROM
表名
WHERE
条件)
T
WHERE
(主键
NOT
IN
(SELECT
TOP
通过PHP计数值(每页条数
*
(当前页
-
1)
)
主键
FROM
(SELECT
*
FROM
表名
WHERE
条件)
T2
ORDER
BY
T2.主键
DESC))
上面SELECT
*
FROM
表名
WHERE
条件有两句,这两句就是你查询时真正的SQL语句
你可以写个存储过程,或写个PHP函数

⑤ php sql语句请教 关于分页功能的

select * from article limit ". ($page-1)*$page_size.",$page_size

⑥ PHP和MYSQL查询和分页显示

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<!--分页开始-->
<?php
if(isset($_GET['page'])) //由GET方法获得页面传入当前页数的参数
{
$page = $_GET['page'];
}
else
{
$page = 1;
}
$page_size = 2; //每页显示两条数据

//获取数据总量
$db_host = 'localhost'; //数据库主机
$db_user = 'tianchunli';//数据库用户帐户
$db_passw = '58816828'; //数据库帐户密码
$db_name = 'jiaoyou' ;//数据库名称

//连接数据库
$conn=mysql_connect($db_host,$db_user,$db_passw) or die("数据库连接失败!");

//设置字符集,如utf8和gbk等, 根据数据库的字符集而定
mysql_query("set names gb2312");

//选定数据库
mysql_select_db($db_name,$conn) or die('数据库选定失败!');

$xuesheng_xm =$_POST[xuesheng_xm];//对应姓名
$xuesheng_xb =$_POST[xuesheng_xb];//对应性别

$xuesheng_sg1=$_POST[xuesheng_sg1];//对应最低身高
$xuesheng_sg2=$_POST[xuesheng_sg2];//对应最高身高

$sql = "select * from biao1 where 1=1";

if($xuesheng_xm !=''){
$sql .= " and xuesheng_xm like '%$xuesheng_xm%' ";
}
if($xuesheng_xb !=''){
$sql .= " and xuesheng_xb = $xuesheng_xb ";
}
if($xuesheng_sg1 != -1 && $xuesheng_sg2 != -1){
$sql .= " and xuesheng_sg between $xuesheng_sg1 and $xuesheng_sg2 ";
}

$result=mysql_query($sql);
$total = mysql_num_rows($result);
$start=($page-1)*$pageSize;

$result = mysql_query($sql);
//echo $total;

//开始计算总页数
if($total)
{
if($total < $page_size)
$page_count = 1;
if($total % $page_size)
{
$page_count = (int)($total/$page_size) + 1;
}
else
{
$page_count = $total/$page_size;
}
}
else
{
$page_count = 0;
}
//翻页链接
$turn_page = '';
if($page == 1)
{
$turn_page .= '首页 | 上一页 | ';
}
else
{
$turn_page .= '<a href=2.php?page=1> 首页</a> | <a href=2.php?page='.($page-1).'>上一页</a> | ';
}
if($page == $page_count || $page_count == 0)
{
$turn_page .= '下一页 | 尾页';
}
else
{
$turn_page .= '<a href=2.php?page='.($page+1).'>下一页</a> | <a href=2.php?page='.$page_count.'>尾页</a>';
}

$sql = $sql." limit ". ($page-1)*$page_size .", ".$page_size;
echo $sql;
$result = mysql_query($sql);

?>

<?php
while($row = mysql_fetch_array($result))
{
echo $row['xuesheng_xm'];
}
?>
<br />
<?php echo $turn_page?>
</body>
</html>
这个,数据查询语句根据你自己的需要改吧!我是用我自己建立的数据库

⑦ PHP 查询结果分页显示

信息太少 只能写下面一部分
将while里面改一下即可
<?php
$page_size=20;//每页信息条数
//解析URL
$url=$_SERVER["REQUEST_URL"];
$url=parse_url($url);
$url=$url[path];

$numq=mysql_query("SELECT * FROM `表名`");
$num=mysql_num_rows($numq);
$page_first=1;
$page_last=ceil($num/$page_size);//获得总页数 也就是最后一页的数值

if ($_GET[page]>=1){
$page_num=$_GET[page];
$page_nums=($page_num-1)*$page_size;
}else{
$page_num=1;
$page_nums=($page_num-1)*$page_size;
}
echo $num."条记录,共".$page_last."页"."====<b><big>这是第".$page_num."页</big></b>"."<br>";

for($i=1;$i<=$page_last;$i++){
echo "<a href=$url2?page=".($page_num+$i-1).">"."第".($page_num+$i-1)."页>> "."</a>";
}
$sql="SELECT * FROM `表名` limit $page_nums,$page_size";
$query=mysql_query($sql);
echo "<table border=1><tr ><th>姓名</th><th>姓别</th></tr>";

while($row=mysql_fetch_array($query)){
echo "<tr ><td>";
echo $row[name];
echo "</td>";
echo "<td>";
echo $row[sex];
echo "</td></tr>";
}

echo "</table>";
?>

⑧ 如何使用PHP做分页查询

做分页查询的处理页面
<?phpinclude("DBDA.class.php");$db = new DBDA(); //查询条件$tj1 = " 1=1 ";if(!empty($_GET["key"]))//获取提交的关键字{ $tj1 = " areaname like '%{$_GET['key']}%'";} $sall = "select count(*) from chinastates where {$tj1}";//把条件拼接到语句中$total = $db->StrQuery($sall); include("page.class.php");$page = new Page($total,20); $sql = "select * from chinastates where {$tj1} ".$page->limit;//这里也要加上搜索条件$attr = $db->Query($sql); foreach($attr as $v){ echo "<tr><td>{$v[0]}</td><td>{$v[1]}</td><td>{$v[2]}</td></tr>";} ?>

⑨ PHP对查询结果分页,查询结果的二次分页

一般初学者在分页的时候,遇到的问题是第一页正常,下一页的时候显示了所有的数据。

其实原因很简单,就是在下一页的时候丢失了查询条件,也就是在调用下一页的时候,没有搜索条件的相关变量传递下去。

找到了原因,处理就非常容易了。

我的建议是把搜索条件和跳转的页数结合起来,使得在搜索的时候可以指定页、在页面跳转的时候也可以改变条件。假如你搜索的FORM是:
<form action=xxx.php>
<input type=text name=xx1>
<input type=text name=xx1>
......上面是你原来的搜索条件,增加下面一个页数的变量......
<input type=text name=page value=1>
</form>

初始搜索用上面的代码,下一页也用上面的代码,注意把变量的值传递过去,例如:
<input type=text name=xx1 value=