命名空间进阶、文件上传与分页处理
程序员文章站
2022-03-13 12:33:59
...
命名空间进阶、文件上传与分页处理
命名空间的进阶
- 使用 use 关键字可以引入一个命名空间或者引入一个命名空间的类,但是一般是建议引用空间,引用空间后,然后可以使用更短的代码继续往后引用类
- 如果命名空间有遇到需要改名的情况,可以使用 as 关键字 给类或最后一级空间进行改名,一可以处理重名问题,二可以自定义名称更好做区分或简化
namespace one\test\controller {
class DEMO{
public static function test(){
return "one.demo.test";
}
}
// echo DEMO::test();
}
namespace one\test\model {
class DEMO{
public static function test(){
return "TWO.demo.test";
}
}
//直接引用类
//类有重名可以用as给类更名
// use \one\test\controller\DEMO as DE;
// echo DE::test();
//引用命名空间后再引用类,并给controller更名
use \one\test\controller as ctl;
echo ctl\DEMO::test();
}
- 自动加载器进阶优化,自动加载器引入使用后,如果引用的类文件中还有引用其他类文件,那么这个引用过程也会自动使用自动加载器
spl_autoload_register(function($class){
// DIRECTORY_SEPARATOR系统分隔符常量,把所有的\都转为系统分隔符
$file = str_replace('\\',DIRECTORY_SEPARATOR,$class).'.php';
// 判断$file是否是正常的文件,是否存在该文件,都为真返回引入,为假抛错
if(is_file($file)&&file_exists($file)){
require $file;
}else{
throw new \Exception("文件名不合法或文件不存在");
}
});
文件上传
- 获取上传文件信息使用超全局变量$FILES()
- 系统目录的处理
- 创建目录
mkdir(目录名称,权限(默认 0777,即允许全局访问),true);
- 更改文件权限
chmod(目录名称,权限);
- 创建目录
- 文件移动到存储位置
move_uploaded_file(上传文件的临时路径,新目录及文件名,)
- 多文件上传,file 的 input 类型行内标签需要加入 multiple 关键字,name 的值设为数组,此时$FILES 就能获取一个文件的数组,可以通过循环遍历处理该数组进行数据库添加或者处理
-
in_array(要搜索的值,被搜索的数组,是否全等(true 全等 ,false 非全等,默认为 false))
可以用来判断文件类型是否在我们规定的类型内 - 文件名如果重复会出现上传失败的情况,此时文件名可以使用时间戳或随机数生成一个随机名称上传
分页处理
数据库分页处理,主要需要捋清楚每页要分的条数、每页显示条数的起始位置计算以及最后有多少页数据,判断起始页跟结束页,对上一页、下一页进行处理
<?php
//判断是否连接数据库
try{
$pdo = new PDO('mysql:host=localhost;dbname=test','root','z1071930401');
}catch(PDOException $e){
echo '数据库连接失败' . $e->getMessage();
}
// 给p赋初始默认值
if(empty($_GET['p'])){
$p = 1;
}else{
$p = $_GET['p'];
}
// 设置每页条数
$count = 5;
//数据库的数据下标类似于数组,都是从0开始,因此第一页数据就是0-4,第二页就是0-5,按照页数与条数的乘积计算,每页显示的条数应该为($p-1)*$count
$sql = 'SELECT * FROM `user` LIMIT ' . ($p-1)*$count . ',' . $count;
$pre = $pdo -> prepare($sql);
$exe = $pre -> execute();
// 将查询出来的结果集赋值给$data
$data = $pre -> fetchAll();
//使用count()方法查询总共有多少条数据
$pre = $pdo -> prepare('SELECT count(*) as total FROM `user`');
$exe = $pre -> execute();
// 将查询出来的条数赋值给total
$total = $pre -> fetch()['total'];
// 使用ceil()方法向上四舍入为最接近的整数,获取页数,扩展:floor()方法向下四舍入为最接近的整数,round()对浮点数进行四舍五入
$page = ceil($total/$count);
?>
<!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>
<style>
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #337ab7;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
z-index: 2;
color: #23527c;
background-color: #eee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 3;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #777;
cursor: not-allowed;
background-color: #fff;
border-color: #ddd;
}
.pagination > form > input,button{
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #337ab7;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.pagination > form > button:hover{
z-index: 2;
cursor:pointer;
color: #23527c;
background-color: #eee;
border-color: #ddd;
}
</style>
</head>
<body>
<a href="add.php">添加</a>
<table border="1">
<thead>
<tr>
<th width="50">ID</th>
<th width="100">账户</th>
<th width="100">姓名</th>
<th width="100">年龄</th>
<th width="100">手机号</th>
<th width="200">入职时间</th>
<th width="200">登录时间</th>
<th width="100">状态</th>
</tr>
</thead>
<tbody>
<?php
// 循环遍历显示的数据内容
foreach($data as $v){
?>
<tr>
<td><?=$v['id'] ?></td>
<td><?=$v['account'] ?></td>
<td><?=$v['name'] ?></td>
<td><?=$v['age'].'岁' ?></td>
<td><?=$v['phone'] ?></td>
<td><?=date('Y-m-d',$v['add_time']) ?></td>
<td><?=date('Y-m-d H:i:s',$v['last_time']) ?></td>
<!-- <td><?=$v['status']==1?'开启':'关闭' ?></td> -->
<td>
<?php
if($v['status'] == 1){
echo '<span style="color:green;">开启</span>';
}else{
echo '<span style="color:red;">关闭</span>';
}
?></td>
</tr>
<?php
}
?>
</tbody>
</table>
<ul class="pagination">
<?php
// 当前页面为1,就代表没有上一页,设置上一页无法点击
$html = '';
if($p == 1){
$html .= '<li class="disabled">';
$html .= ' <a>上一页</a>';
$html .= '</li>';
}else{
$html .= '<li>';
$html .= ' <a href="list.php?p='.($p-1).'">上一页</a>';
$html .= '</li>';
}
// 循环遍历每页数据链接
for($i=1;$i<=$page;$i++){
$html .= '<li ';
// 判断点击的是哪一页给哪一页添加active类
if($i == $p){
$html .= 'class="active"';
}
$html .= '>';
$html .= ' <a href="list.php?p='.$i.'">'.$i.'</a>';
$html .= '</li>';
}
//判断如果点击的页码为最后一页,就代表没有下一页,设置下一页无法点击
if($p == $page){
$html .= '<li class="disabled">';
$html .= ' <a>下一页</a>';
$html .= '</li>';
}else{
$html .= '<li>';
$html .= ' <a href="list.php?p='.($p+1).'">下一页</a>';
$html .= '</li>';
}
echo $html;
?>
<!-- 配置输入框加跳转页 -->
<form action="list.php" method="get" onclick="false">
<input type="text" name="p">
<button onclick="window.location.href=<?php echo '\'list.php?p='.$_GET['p'].'\''; ?>;">跳转</button>
</form>
</ul>
</body>
</html>