upload.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="demo1.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file" id="">
<button>上传</button>
</form>
</body>
</html>
demo1.php
文件
<?php
//设置文件格式
$fileType = ['jpg','png','gif'];
//设置文件大小
$fileMaxSize = 3145728;
//设置路径
$filePath = '/img/';
//文件原始文件名
$fileName = $_FILES['my_file']['name'];
//文件临时文件
$fileTmpName = $_FILES['my_file']['tmp_name'];
//错误信息
$updateError = $_FILES['my_file']['error'];
if ($updateError>0){
switch ($updateError){
case 1:
case 2:
die('文件过大');
case 3:
die('文件上传不完整');
default:
die('未知错误');
}
}
// 3. 判断文件扩展名是否正确
$extension = explode('.',$fileName)[1];
if (!in_array($extension, $fileType)) {
die('不允许上传' . $extension . '文件类型');
}
// 4. 为了防止同名文件相互覆盖, 使用md5+时间戳
$fileName = date('YmdHis',time()).md5(mt_rand(1,99)) . '.' . $extension;
if (is_uploaded_file($fileTmpName)) {
if (move_uploaded_file($fileTmpName, __DIR__ . $filePath.$fileName)) {
// 上传成功,并返回上一个页面
echo '<script>alert("上传成功");history.back();</script>';
} else {
die('文件无法移动到指定目录,请检查目录权限');
}
} else {
die('非法操作');
}
exit();
model.php
文件
<?php
namespace _1206;
use PDO;
class AccoutModel{
private $user_id;
private $username;
private $email;
private $password;
private $phone;
private $user_type;
private $department_list;
public function __get($name)
{
return $this->$name;
}
public function __set($name, $value)
{
$this->$name = $value;
}
}
$pdo = new PDO('mysql:host=localhost;dbname=jason','root','root');
$stmt = $pdo->prepare('select * from `account` WHERE `user_id` > :user_id');
$stmt->setFetchMode(PDO::FETCH_CLASS,AccoutModel::class);
$stmt->execute(['user_id' => 5]);
while ($staff = $stmt->fetch()) {
// 属性重载
echo "<li>{$staff->user_id}: {$staff->username}--{$staff->email}--{$staff->password}--{$staff->phone}--{$staff->department_list}</li>";
}
route.php
文件
<?php
$res = $_SERVER['REQUEST_URI'];
$resArr = explode(DIRECTORY_SEPARATOR,$res);
echo '<pre>'.print_r($resArr,true).'</pre>';
$newArr = array_slice($resArr,3,3);
echo 'newArr'. '<pre>'.print_r($newArr,true).'</pre>';
list($user,$controller,$action) = $newArr;
$arr = compact('user','controller','action');
echo 'arr'.'<pre>'.print_r($arr,true).'</pre>';
$arr2 = [];
//取出路由键值对
$arr1 = array_slice($resArr,6);
for ($i=0;$i<count($arr1);$i+=2){
if (isset($arr1[$i+1])){
$arr2[$arr1[$i]] = $arr1[$i+1];
}
}
echo '<pre>'.print_r($arr2,true).'</pre>';
//实战
class Index{
public function pay($a,$b){
return '调用成功,参数'.$a.$b;
}
public function admin($a,$b,$c){
return '调用成功,参数'.$a.'------'.$b.'-------'.$c;
}
}
$obj = new $arr['controller']();
echo call_user_func_array([$obj,$arr['action']],$arr2);
echo '<hr>';
echo call_user_func_array([$obj,$arr['user']],$newArr);
手写代码
总结
## 1. 模型的原理
* 框架中的模型, 通常会与一张数据表对应, 而模型对象,则与数据表中的一条记录对应
* `$stmt->setFetchMode(PDO::FETCH_CLASS, $className);`
## 2. 路由的原理
* `$_SERVER['REQUEST_URI']`: 超全局变量, 用户请求的web资源地址
* `explode()`: 使用一个字符串分割另一个字符串,返回数组
* `array_slice($arr, $start, $length)`: 获取数组片断
* `list($var1, $var2,...)`: 将索引数组成员转为独立变量
* `compact($str1, $str2,...)`: 将变量转为关联数组成员
* `call_user_func_array()`: 以回调方式执行一个函数/方法
## 3. 控制反转(ioc)
* 依赖注入: 用户主动调用依赖对象
* 控制反转: 容器接管对依赖对象的控制权
## 4. 文件上传
* `$_FILES['name']`: 保存上传文件信息的超全局数组
* `is_uploaded_file()`: 判断文件是否通过 "HTTP POST" 方式上传的?
* `move_uploaded_file()`: 将上传文件移动到服务器上指定的位置/目录下面