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>
psr-4规范 : 类的命名空间与类所在的目录进行绑定,命名空间最后必须以”\” 空间分隔符结尾 ,往绑定的目录中添加新类时, 不必执行composer dump-autoload命令就能生效
这里先介绍psr4,他是升级版的PSR-0自动加载规范
PSR4是关于由文件路径自动载入对应的类的相关规范,本规范是可互操作的。可以作为任一自动(包括PSR-0)载入规范的补充,此外,PSR4还包括自动载入的类对应的文件存放路径规范。
此处的“类”泛指所有的class类、接口、traits可复用代码块以及其他类似结构。
一个完整的类名需要具有以下结构
<命名空间>(<子命名空间>)*<类名>
完整的类名必须要有一个顶级命名空间,被称为“Vendor namespace”
完整的类名可以有一个或多个子命名空间
完整的类名必须有一个最终的类名
完整的类名中任意一部分中的下划线都是没有特殊意义的
完整的类名可以由任意大小写字母组成
所有类名都必须是大小写敏感的
当根据完整的类名载入相应的文件
完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须至少对应一个基础目录。
紧接命名空间前缀后的子命名空间必须与相对应的“基础目录”的子目录相匹配,其中的命名空间分隔符作为目录分割符
末尾的类名必须与对应的.php为后缀的文件同名
自动加载器(autoload)的实现一定不能抛出异常,一定不能触发任一级别的错误信息以及不应该有返回值。
composer 自动加载 配置成功
{ "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// 连接数据库$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'];
<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>
//省略点分页// 讨论省略点分页 前提: 两边的省略点都出现的时候// 分页条显示的页数$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 = '...'; }}
<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>