PHP:composer自动加载机制;创建动态分页; 使用三方验证码库; 一.使用第三方验证码库
- http://packagist.p2hp.com/packages/gregwar/captcha 可以用composer下载第三方验证码库
- 下载好之后创建html页面加载第三方验证码库包,开启session会话和用户输入的验证码做对比是否正确。
代码块
<?php
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>
|