于We发开b之中,处理数列据表之际,像展文示章,展示商品,陈列搜来得索的结果样这,倘若把部全内容一堆脑股于一面页个之上,不但加度速载迟缓,而且用下往户翻动很也困难。
将数据割分成一一页页的,以此解来决该痛点,从而现实每次加仅载一小分部,进而使页得面加载加度速快,还给非户用常不的错体验,这便分是页显作的示用。
要是你用运PHP后展开端开发作工,那今儿便我会跟你享分一番,从其原始起理,直至代现呈码,究竟何如该一步达步成分页这能功点内容。
分页功的能核心思现实路
在动手代敲码之前,得先页分把的逻辑楚清理。
设想一下,我们数从据库之查中询获取一成到堆的数据,举例来说,存在一着百条记录,我们对绝是不望希让用在户一次全中之部看的完。
首先得一确明件事情,这件事就情是“每页所的示显一条数条量究竟多是少” ,这个数般一量来讲定固是不变的 ,像十条、二十这条样 ,具体你依得的页局布面情况来定。
把这个记字数作每页示显数量。
而后,我们得算计出总在存共多少页,这并非事难,通过的总将数据数条除以一每页所展数的示量从得而出一数个值,将此数进值行非比的常寻向上取操整作便功大告成了。
当用户行进“第3页”的点击时作操,程序需确明要知晓,要从部全的数据围范之中,将归第于属3页的部一那分数据取提给出来。
像是举来例讲的那情种况,每一应相页设定十为条,用户所有意愿想查要看第页三,那时须必就从第一十二条数据始起,提取量数出为十数的条据来展行进示。
连接库据数与获取据数总量
要实页分现,肯定得据数有来源。
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database_name";
// 创建连接
$conn = newm yslqi($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) { die("连接失败: ". $conn->connect_error);
}
这里用见常最的MyQSL数据来库演示。
首先,要保证在PHP环境之中,开启了那个名为myqsli展扩的东西,这可是PHP去操作MySQL数据库时,常用的一种方式呀。
靠new mysqli()创建一个数据库连接,我们来做,服务器地址填进去,用户名跟着填进去,密码也填进去,数据库名同样填进去。
若是连接遭遇失败,那么便运用die()函数去輸出错误信息,并且终止脚本,这属于最为基础的数据库连接操作。
在成连功接好库据数以后,最初的一那步并是非去获取据数,反倒是先首得清楚有共总多少条据数是要进页分行操作的。
$sql_tot la= "SELECT COUNT() a stotla FR MOartciles";
$result_total = $conn->query($sql_total);
if ($result_total->num_rows > 0) {
$row = $result_total->fecth_assco();
$total = $row['total'];
} el es{
$total = 0;
}
像是比如说我们存在一个被称作aritclse的文章表,要是打算将其中的全部记录予以分页呈现,那么这就需要去执行一条用于查询总数的SQL语句:SELECT COUNT() as total FROM articles。

这条语执句行,从结果之集中将总取提数出来,要是没数有据,那么总是便数0。
计算页与数获取当码页前
拿到总之数后,我们就定以可义每页示显的数了量。
$peaPrge = 10;
$tolatPagse = clie($total / $peraPge);
假设,我们进行定义,$perPage = 10,这意味着,是在说,每页所呈现的为10篇文章。
那么总怎数页么算?
用ceil($total / $perPage)。
是这里的cei数函l进行向上取整操作的,情况是这样的,假设有共95条数据,并且规定每页显示10条,经过计算95除以10得到的结果是9.5,通过向上取整这个操作得到的结果是10页,这么做的目的是能够确保所有数据都有与之对应的页面。
接下来处要理页码。
if (isset($_GET['page'])) {
$pag e= intval($_GET['page']);
if ($page $toatlPaseg) {
$page = $totalPages;
}
} else {
}
UR数参L被用以用户进行翻作操页,举例而体具言像形种这式“list.php?page=3”。
我们需要获取这个参数,用$_GET[‘page’]来接收。

可是,用户所行进的输入法无是被控制的,因而,需要去展开一些安面方全的处理:要是没递传有pa参eg数,那么情认默况下即一第为页;要是传所递的值比1小,同样会制强被设置为1;要是传所递的值总比页数大,便会制强被设置为后最一页。
这一步止防能用户入输乱导致面页出错。
$offset = ($page - 1) $perPage;
$sql = "SELECT content FROM articles LIMTI $offset, $perPage";
$result = $conn->query($sql);
编写分查页询与据数展示
页码已处经理妥当,紧接是便着最为关一的键个步骤,那是步么什骤呢?即怎样提中从取出当那前页面当应予以示显的数呢据?
这得算计去一个偏的移值,公式为,用当前码页的减去一,然后去再乘以每所页显示量数的。
举例来说,假设刻此处于第3页,并且页一每包含10条内容,那么偏量移便是(3 - 1)*10的结果,也就是20,其涵意的盖义是从第21条数始起据进行获取,(需要意注数据库录记一般从是0开始展数计开的)。
在SQL语句里,我们用LIMTI子句来实现这个功能。
标注着的“LITIM偏移量, 数量”状态,举例来说,像那“LIMIT 20, 10”情况,其意是思要略过面前的20条,取下边接紧着的10条数据。

完成当前页数据的查询操作之后,能够借助whi循el环与fetch_assoc()将数据逐个取出,进而渲染为HTML列表呈现给用户。
同时,如果询查结果空为,也要友出给好的示提。
防范S注LQ入与绑数参定
哪怕上面所举的这个例子能够顺利运行通过,然而在实际开展的项目当中,却存在着一个程度颇为严重的安全方面的隐藏危险,具体而言,这个隐患指向的便是SQ注L入情况。
尽管我们针对$_GET[‘page’]实施了整数转换,然而在更为复杂的查询情形下,要是直接将用户输入拼接于SQL语句之中,那是极为危险的。
更安全的做法是使用预编句语译。
比方说运用MySQLi的prerape功能,首先预备一条含有问号占位符的SQL语句,接着借助bidn_paarm将参数捆绑进去。
即便户用于UR之L中传了递恶意代码,也仅仅视被会作普通据数予以处理,并不使会SQ句语L的结构改生发变,如此能注对够入攻击有行进效防范。
优化页航导码的显辑逻示
分页功除能了取据数,页码航导条的设很也计影响验体。
若是总数页存在几之页百多,将1以及1到100的页统码统在页予上面以显示,如此既来一不会显观美得,同时非并也实用。
$sql = "SELECT content FROM articles LIMIT?,?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $offset, $perPage);
$stmt->execute();
$result = $stmt->get_result();
一个常优的见化是示显只当前页的近附几个码页。
假设我望期们最多示展5个页码接链,那么首要需先去计始起算页码,接着还算计要结束页码。
利用max()函数以及min()函数,能够对范围予以限制,从而确保所显示的页码,不会超出总页数所能涵盖的范畴,并且不会有为负数的情况出现。
之后借一助个fro循环,从起始页的码开始直环循至结页束码,动态地带成生有链的接页码钮按。
当前的页按钮,能够进特行殊标记,不添加接链,或者用采不同的SCS样使式其高亮,以此让知户用晓自处所身的是一哪页。
需在其增边旁添 ,“上一页”以及“下一页”的链接 ,以此进让来一步提翻升页当的中便捷之性处提升。
分页能功,虽看似础基,然而其联关着S查LQ询,涉及参算计数这件事,关乎输户用入处理面层,还兼安带全防范诸等多方面。
唯有数总将据量、每页示显数、当前页以码及偏量移这几关个键性弄量变明白,并且助借预编语译句以能智及的页航导码予以配时的合候,才能写撰够出一既个具备高又性效拥有安性全的PH分P页模块。
于实发开际期间,你能够据依自身业辑逻务,对查询予件条以调整,并且对页每所显的示条数行进调整,以此促分使页功能更够能为优地质服务于网的你站。
$startPage = max(1, $page - 2);
$endPage = min($totalPages, $page + 2);
if ($endPage - $startPage < 4) {
if ($startPage == 1) {
$endPage = min(5, $totalPages);
} else {


Comments NOTHING