异常处理
php 中使用 Exception
类来管理异常
官网截图:
可以看到 只有 __construct()
方法和 __toString()
方法可以被子类继承重载
异常处理一般结合 try-catch语法使用,一下为简单实例:
try {
$errorInfo = '遇到错误';
throw new Exception($errorInfo, 0); // 手动抛出异常,后面语句不会执行
echo '测试语句';
}catch(Exception $e){ // 这里会接收异常对象
print_r($e->getMessage()); // 遇到错误
print_r($e->getCode()); // 0
}
文件上传
PHP中使用全局变量 $_FILES
来处理文件上传
** $_FILES
为一个数组,保存着文件上传的信息,打印一下可以看到保存着5中信息。
这里要注意的是:PHP上传文件时会将文件上传至一个临时位置,需要再次移动该临时文件至指定目录。
这里我们将异常处理和文件上传结合一下写一个例子
先建个表单文件 upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="deal.php" method="POST" enctype="multipart/form-data">
<!--设置一个隐藏域,限制上传文件大小-->
<input type="hidden" name="MAX_FILE_SIZE" value="20000">
<input type="file" name="file1">
<button>上传</button>
</form>
</body>
</html>
在建个处理文件 deal.php
<?php
/**
* 文件上传
*/
namespace day1012;
use Exception;
// 自定义异常类
class MyException extends Exception
{
public function __construct($message = "", $code = 0)
{
parent::__construct($message, $code);
}
public function errorInfo(){
return <<<ERROR
<h3 style="font-weight:bold; line-height: 30px">
<img src="./warn-ico.png" width="30" height="30" style="float: left; margin-top: 15px" />
<p style="margin: 0 0 0 40px">出现异常,异常编号:<em style="color: red">{$this->getCode()}</em> </p>
<p style="margin: 0 0 0 40px">异常信息:<em style="color: red">{$this->getMessage()}</em></p>
</h3>
ERROR;
}
}
try {
// PHP中使用全局变量 $FILES 来处理文件上传
print_r($_FILES);
// 1. 设定上传文件限定类型
$fileType = ['jpg', 'png'];
// 2.设置允许上传文件大小
$fileSize = 250000;
// 3. 设置文件目录
$path = './uploads/';
// 文件名称
$fileName = $_FILES['file1']['name'];
// 临时文件名称
$tmpName = $_FILES['file1']['tmp_name'];
// 4. 判断文件是否上传成功,错误类型 0:成功,大于1 出错
if ($_FILES['file1']['error'] > 0) {
switch ($_FILES['file1']['error']) {
case 1:
throw new MyException('文件大小超出PHP配置文件限制',101);
case 2:
throw new MyException('文件大小超出表单限定值',102);
case 3:
throw new MyException('文件只有部分被上传',103);
case 4:
throw new MyException('没有上传任何文件',104);
default :
throw new MyException('未知错误',105);
}
}
// 5. 判断文件类型是否为允许类型
$type = explode('.', $fileName)[1];
if (!in_array($type, $fileType)) {
throw new MyException('不允许上传' . $type . '类型文件',106);
}
// 6. 判断文件是否超出限定值大小
if ($_FILES['file1']['size'] > $fileSize) {
throw new MyException('超出大小限制,请重新上传',107);
}
// 7. 设置新的文件名,注意别忘了加后缀名
$newName = date('YmdHis') . rand(100, 999) . '.' . $type;
if (is_uploaded_file($tmpName)) {
if (!move_uploaded_file($tmpName, __DIR__ . $path . $newName)) {
throw new MyException('移动文件失败',888);
} else {
echo '<script>alert("恭喜上传成功");window.history.back();</script>';
}
} else {
throw new MyException('上传文件不是合法文件',999);
}
}catch(MyException $e){
print_r($e->errorInfo());
}
一些结果截图:
模型类与数据表绑定
这里绑定 staff 表,因此建立一个 Staff类
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="table.css">
</head>
<body>
<div>
<?php
class Staff
{
// 先定义属性,用于和表中字段绑定
private $staff_id;
private $name;
private $age;
private $sex;
private $position;
private $mobile;
private $hiredate;
private static $pdo;
public function __construct()
{
// 部分字段初始化
$this->sex = $this->sex ? '男' : '女';
$this->hiredate = date('Y/m/d', $this->hiredate);
}
public function __get($name)
{
return $this->$name;
}
public function __set($name, $value)
{
$this->$name = $value;
}
public static function connect()
{
static::$pdo = new \PDO('mysql:dbname=zmx;', 'root', 'root');
}
// 查询方法
public static function select($where = '')
{
static::connect();
$where = empty($where) ? '' : ' WHERE ' . $where;
$sql = 'SELECT * FROM `staff` ' . $where;
$stmt = static::$pdo->prepare($sql);
// setFetchMode
// 为语句设置默认的获取模式。
// PDO::FETCH_CLASS
// 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。
// 如果所请求的类中不存在该属性,则调用 __set() 魔术方法
// 这里就是将拿到的数据库模型 和 当前 Staff 类进行关联
$stmt->setFetchMode(\PDO::FETCH_CLASS, Staff::class);
if ($stmt->execute()) {
echo '<table border="1" cellpadding="0" cellspacing="0" width="400">';
echo '<tr><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>职位</th><th>联系方式</th><th>入职时间</th></tr>';
while ($staff = $stmt->fetch()) {
echo '<tr>';
echo '<td>' . $staff->staff_id . '</td>';
echo '<td>' . $staff->name . '</td>';
echo '<td>' . $staff->age . '</td>';
echo '<td>' . $staff->sex . '</td>';
echo '<td>' . $staff->position . '</td>';
echo '<td>' . $staff->mobile . '</td>';
echo '<td>' . $staff->hiredate . '</td>';
echo '</tr>';
}
echo '</table>';
}
}
// 增加方法
public static function insert($data)
{
static::connect();
$set = ' SET ';
foreach ($data as $key => $value) {
$set .= $key . ' =:' . $key . ', ';
}
// 去掉最后一个 逗号
$set = rtrim($set, ", ");
$sql = 'INSERT INTO `staff` ' . $set;
$stmt = static::$pdo->prepare($sql);
if ($stmt->execute($data)) {
if ($stmt->rowCount() > 0) {
echo '成功新增了' . $stmt->rowCount() . '条记录,最后一条记录主键为' . static::$pdo->lastInsertId().'<br/>';
}
} else {
die('新增失败:' . print_r($stmt->errorInfo()));
}
}
// 更新方法
public static function update($data,$where){
static::connect();
$where = empty($where) ? '' : ' WHERE ' . $where;
$set = ' SET ';
foreach ($data as $key => $value) {
$set .= $key . ' =:' . $key . ', ';
}
// 去掉最后一个 逗号
$set = rtrim($set, ", ");
$sql = 'UPDATE `staff` ' . $set.$where;
$stmt = static::$pdo->prepare($sql);
if ($stmt->execute($data)) {
if ($stmt->rowCount() > 0) {
echo '成功更新了' . $stmt->rowCount() . '条记录<br/>';
}
} else {
die('更新失败:' . print_r($stmt->errorInfo()));
}
}
// 删除方法
public static function delete($where){
static::connect();
$where = empty($where) ? '' : ' WHERE ' . $where;
$sql = 'DELETE FROM `staff` '.$where;
$stmt = static::$pdo->prepare($sql);
if($stmt->execute()){
if($stmt->rowCount() > 0){
echo '成功删除了'.$stmt->rowCount().'条记录<br/>';
}
}else {
die('查询失败:' . print_r($stmt->errorInfo()));
}
}
}
Staff::select();
Staff::insert(['staff_id'=>20,'name'=>'小明','age'=>20,'sex'=>1,'position'=>'队长','mobile'=>'12345678','hiredate'=>'1218297600']);
Staff::update(['name'=>'小张'],'staff_id=20');
Staff::delete('staff_id=20');