PHP:composer自动加载机制;创建动态分页; 使用三方验证码库;
16lz
2021-05-27
PHP:composer自动加载机制;创建动态分页; 使用三方验证码库;
一.使用第三方验证码库
- http://packagist.p2hp.com/packages/gregwar/captcha 可以用composer下载第三方验证码库
- 下载好之后创建html页面加载第三方验证码库包,开启session会话和用户输入的验证码做对比是否正确。
代码块
<?php
//首先开启session会话
session_start();
//然后引入第三方验证码的自动加载文件
require_once __DIR__ . '/vendor/autoload.php';
use Gregwar\Captcha\CaptchaBuilder;
$builder = new CaptchaBuilder;
$builder->build()->save('captcha.jpg');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>验证码验证</title>
</head>
<body>
<input type="text" name="captcha" >
<img src="<?php echo $builder->inline(); ?>" alt="" onclick="window.location.reload()">
</body>
</html>
二.composer自动加载机制
psr-4规范 : 类的命名空间与类所在的目录进行绑定,命名空间最后必须以”\” 空间分隔符结尾 ,往绑定的目录中添加新类时, 不必执行composer dump-autoload命令就能生效
这里先介绍psr4,他是升级版的PSR-0自动加载规范
PSR4是关于由文件路径自动载入对应的类的相关规范,本规范是可互操作的。可以作为任一自动(包括PSR-0)载入规范的补充,此外,PSR4还包括自动载入的类对应的文件存放路径规范。此处的“类”泛指所有的class类、接口、traits可复用代码块以及其他类似结构。
一个完整的类名需要具有以下结构
<命名空间>(<子命名空间>)*<类名>完整的类名必须要有一个顶级命名空间,被称为“Vendor namespace”
完整的类名可以有一个或多个子命名空间
完整的类名必须有一个最终的类名
完整的类名中任意一部分中的下划线都是没有特殊意义的
完整的类名可以由任意大小写字母组成
所有类名都必须是大小写敏感的
当根据完整的类名载入相应的文件
完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须至少对应一个基础目录。
紧接命名空间前缀后的子命名空间必须与相对应的“基础目录”的子目录相匹配,其中的命名空间分隔符作为目录分割符
末尾的类名必须与对应的.php为后缀的文件同名
自动加载器(autoload)的实现一定不能抛出异常,一定不能触发任一级别的错误信息以及不应该有返回值。
①配置composer.json文件 添加 autoload自动加载器
②在终端调用 composer dump-autoload 命令让改动的文件生效
composer 自动加载 配置成功
composer.json文件代码块
{
"name": "phpcn/login",
"description": "a exquisite login page with captcha",
"type": "project",
"require": {
"gregwar/captcha": "^1.1"
},
"authors": [
{
}
],
"autoload": {
"psr-4": {
"app\\controller\\": "app/controller",
"extend\\ilb\\": "extend/ilb"
}
}
}
三.创建动态分页
①基础动态分页
php代码块
<?php
// 连接数据库
$pdo = new PDO("mysql:host=localhost;dbname=zwz","zwz1230","a123456",[PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]);
//获取分页数据
//当前页码 默认为1
$page = $_GET['p']??1;
//每页显示条数
$num = 4;
//计算每一页第一条记录的显示偏移量
//偏移量 = (页码 -1) \* 每页的显示数量
$offset = ($page - 1) * $num ;
//获取数据库数据
$sql = "SELECT `id`,`uname` FROM `user` ORDER BY `id` ASC LIMIT {$num} OFFSET {$offset}";
$users = $pdo->query($sql)->fetchAll();
//获取总页数
$sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `user`";
$pages = $pdo->query($sql)->fetch()['total'];
HTML代码块
<body>
<table>
<caption>用户表</caption>
<thead>
<tr>
<td>编号</td>
<td>姓名</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<!-- 遍历数据表中数据 -->
<?php foreach ($users as $key => $user):?>
<tr>
<td><?= $user['id']?></td>
<td><?= $user['uname']?></td>
<td>
<button>删除</button>
<button>编辑</button>
</td>
</tr>
<?php endforeach ;?>
</tbody>
</table>
<!-- 动态生成分页条 跳转地址 当前页码的高亮显示 -->
<p>
<?php
for ($i=1; $i <= $pages ; $i++) :
//生成动态的跳转地址 a href 属性 $jump
$jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
//添加css样式实现页码高亮显示
$active = ($i==$page) ? "active" : null;
?>
<a class="<?=$active?>" href="<?=$jump?>"><?=$i?></a>
<?php endfor;?>
</p>
</body>
②省略点动态分页
php代码块
//省略点分页
// 讨论省略点分页 前提: 两边的省略点都出现的时候
// 分页条显示的页数
$showPages = 3;
//分页条开始的页码值
$startPage = 1;
//分页条结束的页码值
$endPage = $pages;
//分页条的终止页码相对于当前页码的偏移量:
$offset = ($showPages-1)/2;
//如果当前显示的页数小于总页数则显示省略点
if ($showPages < $pages) {
//如果当前页数大于偏移量+1则显示省略点
if ($page > $offset +1) {
//设置省略点
$startOmit = '...';
//重置开始页码和结束页码
$startPage = $page - $offset;
$endPage = $page -$offset;
//结束页码如果大于总页码则结束页码等于总页码
if ($endPage > $pages) {
$endPage = $pages;
}
}else {
$startPage = 1;
$endPage = $showPages;
}
//如果分页条显示数小于总页数
//或者当前页数+偏移量 小于总页数 则显示结束省略点
if ($showPages < $pages && $page + $offset <$pages) {
$endOmit = '...';
}
}
HTML代码块
<body>
<table>
<caption>用户表</caption>
<thead>
<tr>
<td>编号</td>
<td>姓名</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<!-- 遍历数据表中数据 -->
<?php foreach ($users as $key => $user):?>
<tr>
<td><?= $user['id']?></td>
<td><?= $user['uname']?></td>
<td>
<button>删除</button>
<button>编辑</button>
</td>
</tr>
<?php endforeach ;?>
</tbody>
</table>
<!-- 动态生成分页条 跳转地址 当前页码的高亮显示 -->
<p>
<!-- 首页 上一页 -->
<?php
$prev = $page - 1;
if ($page ==1) $prev = 1;
if ($page != 1):
?>
<a href="<?=$_SERVER['PHP_SELF'].'?p=1'?>">首页</a>
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$prev?>">上一页</a>
<?endif;?>
<!-- 省略点 -->
<?php if (isset($startOmit)):?>
<a href="javascript:;"><?=$startOmit?></a>
<?endif;?>
<?php
for ($i=1; $i <= $pages ; $i++) :
//生成动态的跳转地址 a href 属性 $jump
$jump = sprintf('%s?p=%s',$_SERVER['PHP_SELF'],$i);
//添加css样式实现页码高亮显示
$active = ($i==$page) ? "active" : null;
?>
<a class="<?=$active?>" href="<?=$jump?>"><?=$i?></a>
<?php endfor;?>
<!-- 省略点 -->
<?php if (isset($endOmit)):?>
<a href="javascript:;"><?=$endOmit?></a>
<?endif;?>
<!-- 尾页 下一页 -->
<?php
$next = $page + 1;
if ($page == $pages) $next = $page;
if ($page != $pages):
?>
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$next?>">下一页</a>
<a href="<?=$_SERVER['PHP_SELF'].'?p='.$pages?>">尾页</a>
<?endif;?>
</p>
</body>
更多相关文章
- php之动态分页
- 【PHP动态分页】composer自动加载机制和第三方验证码库的使用以
- 【PHP 面向对象】面向对象(OOP)编程之解读命名空间使用知识点归
- PHP:oop->细说命名空间/命名空间类的自动加载
- NVMe Over Fabrics架构概述
- 苹果Mac图片批量压缩重命名添加水印工具:PhotoBulk
- 变量系列教材 (五)- Java的命名规则
- 类的重定向,命名空间和内容的访问
- JavaScript注释及命名规范