namespace _1012task1;
// 1.自定义错误提示
use Exception;
class file_upload_error extends Exception
{
public function __construct($message="",$code=0)
{
parent:: __construct($message,$code);
$this->errorInfo();
}
public function errorInfo()
{ // heredoc:用来输出大段的html代码或字符,中间允许变量存在
return <<
{$this->getCode()}:
{$this->getMessage()}
ERROR;
}
}
try
{
// 2.文件上传处理
// 配置上传参数
// 允许文件上传的类型
$fileType=['jpg','gif','png','jpeg'];
// 允许设置上传文件的最大长度
$fileSize = 3145728;
// 上传到服务器上指定的目录
$filePath = '/upload/';
// 原始文件名
$fileName = $_FILES['my_file']['name'];
// 上传到服务器上的临时文件名
$tempFile = $_FILES['my_file']['tmp_name'];
// print_r($_FILES['my_file']);
// exit;
// 3.判断文件上传是否成功
$uploadError = $_FILES['my_file']['error'];
if ($uploadError>0)
{
switch ($uploadError)
{
case 1: throw new file_upload_error('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1000);
// case 2: die((new file_upload_error('上传文件大小不能超过3M',1001))->errorInfo());
case 2: throw new file_upload_error('上传文件大小不能超过3M',1001);
// case 3: die((new file_upload_error('上传文件不完整',1002))->errorInfo());
case 3: throw new file_upload_error('上传文件不完整',1002);
// case 4: die((new file_upload_error('文件上传为空',1003))->errorInfo());
case 4: throw new file_upload_error('文件上传为空',1003);
// case 6: die((new file_upload_error('找不到临时文件',1004))->errorInfo());
case 6: throw new file_upload_error('找不到临时文件',1004);
// case 7:die((new file_upload_error('文件写入失败',1005))->errorInfo());
case 7: throw new file_upload_error('文件写入失败',1005);
// default: die((new file_upload_error('未知错误',1006))->errorInfo());
default: throw new file_upload_error('未知错误',1006);
}
}
//判断文件大小
$file_size=$_FILES['my_file']['size'];
if ($file_size>$fileSize)
{
throw new file_upload_error('上传文件大小不能超过3M',1001);
}
// 4.判断上传文件格式是否正确
$extensions = explode('.',$fileName);
$extension = end($extensions);
if(!in_array($extension,$fileType))
{
// die(((new file_upload_error('文件格式错误,不允许上传'.$extension.'文件类型',1007)))->errorInfo()) ;
throw new file_upload_error('文件格式错误,不允许上传'.$extension.'文件类型',1007);
}
//5.为了防止同名覆盖, 将上传的文件重命名:命名格式md5+时间戳
$fileName = date('Ymdhis',time()).md5(mt_rand(1,99)).'.'.$extension;
//6.文件上传
if (is_uploaded_file($tempFile))
{
if (move_uploaded_file($tempFile,__DIR__.$filePath.$fileName))
{
echo '';
}
else
{
// die((up_load_error('文件无法移动到制定目录,请检查目录权限',1008))->errorInfo());
throw new file_upload_error('文件无法移动到制定目录,请检查目录权限',1008);
}
}
else
{
// die((new file_upload_error('非法操作',1009))->errorInfo());
throw new file_upload_error('非法操作',1009);
}
}
catch(Exception $e)
{
echo $e->errorInfo();
echo '
';
}
运行结果:
2、写一个与指定数据表绑定的类, 实现基本的模型功能,例如查询, 新增, 更新,删除等操作
实例
namespace _1012task2;
use PDO;
interface iDB{
const dsn='mysql:host=127.0.0.1;dbname=video';
const user='root';
const pwd = 'root';
}
class staff implements iDB{
protected $staff_id;
protected $name;
protected $age;
protected $sex;
protected $position;
protected $mobile;
protected $hiredate;
protected $pdo=null;
protected $table= 'staff';
protected $results;
public function __get($name){
return $this->$name;
}
public function __set($name,$value){
return $this->$name=$value ;
}
public function __construct(){
$this->sex=$this->sex ? '男' : '女';
$this->hiredate=date('Y-m-d',$this->hiredate);
$this->pdo=new PDO(iDB::dsn,iDB::user,iDB::pwd);
}
//查询
public function select($field=' * ',$where=''){
$field=empty($field) ? ' * ' : $field;
$where=empty($where) ? '' : ' WHERE '.$where;
$sql = ' SELECT '.$field.' FROM '.$this->table.$where;
$stmt = $this->pdo->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_CLASS, staff::class);
$stmt->execute();
$this->results=$stmt->fetchAll();
}
// 新增
public function insert($data){
$fields=' (name, age, sex, position, mobile, hiredate) ';
$values=' (:name, :age, :sex, :position, :mobie, :hiredate)';
$sql = 'INSERT INTO '.$this->table.$fields.' VALUES '.$values;
$stmt=$this->pdo->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_CLASS,staff::class);
if($stmt->execute($data)){
if($stmt->rowcount()>0){
return '插入了'.$stmt->rowcount().'条数据,最后插入的数据主键为:'.$this->pdo->lastInsertId();
}else{
die('
'.print_r($stmt->errorInfo(),true));
}
}
}
// 修改
public function updata($data,$where){
$ketArray = array_keys($data);
$set = '';
foreach($ketArray as $kvalue){
$set.=$kvalue .' = :'.$kvalue.', ';
}
$set = rtrim($set,', ');
if(!empty($where)){
$where = ' WHERE '.$where;
$set = rtrim($set,', '); //删除$set值最右侧的空格与预定的', '字符
$sql = ' UPDATE ' . $this->table. ' SET ' .$set.$where; //sql语句拼接
$stmt = $this->pdo->prepare($sql); //预处理
$stmt->execute($data); //绑定参数并执行
return $stmt->rowCount();
}else{
return '不允许无条件更新。';
}
}
}
$staff=new staff();
$staff->select();
foreach($staff->results as $staff){
echo "
{$staff->staff_id}--- "{$staff->name}---{$staff->sex}---{$staff->hiredate}";}
$staff->name='James';
$staff->age=30;
echo "$staff->name---$staff->age";
?>
运行结果:
总结:
1、在自定义错误类的时候需要从系统Exception类进行继承,并且子类只能改写父类的__construct()构造方法和errorInfo()方法;不能修改其他方法,在错误接收时,父类Exception可以接收子类抛出的错误内容和样式。
2、类绑定数据表需要根据数据表字段来设置类的属性,在查询的时候,查询结果可以直接调用类的属性来输出想要的数据,查询的时候不需要设置字段,可以再输出的时候在根据自己想要的结果输出;在增加、修改和删除数据方面和未绑定数据表的类相比好像没有优势。