首页
关于
归档
朋友
壁纸
留言
API平台
告白墙
更多
休闲游戏
留言板
练字贴
Layui手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,339 阅读
2
【Git】No tracked branch configured for branch master or the branch doesn't exist.
1,038 阅读
3
【Layui】控制页面元素展示隐藏
858 阅读
4
【composer】composer常用命令
787 阅读
5
【PHP】PHP实现JWT生成和验证
769 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
OOP
JavaScript
Layui
Web
Linux
Array
设计模式
Git
PHPSpreadsheet
PHPoffice
排序算法
基础
面试题
Windows
小破孩
累计撰写
223
篇文章
累计收到
33
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
页面
关于
归档
朋友
壁纸
留言
API平台
告白墙
休闲游戏
留言板
练字贴
Layui手册
搜索到
28
篇与
的结果
2022-06-23
【PHP】使用PHPoffice实现普通的导入功能
解决普通导入的问题,暂不能解决导入图片相关问题,后续遇到相关业务在处理<?php namespace app\index\lib\xlsx; use app\index\lib\xlsx\import as aaa; use think\Controller; use think\Exception; use think\exception\ErrorException; use think\Log; class import extends Controller { /** * 注意事项: * 1. $fileSize已经转换成字节,无需再次转换,所以单位(M),默认5M; * 2. 如果需要更 文件路径,扩展名,记录表名,在公共定义的地方修改即可; * 3. 导入记录默认开启,如果关闭,将不再有数据表的记录任何信息(不包含相关日志); * 4. 关闭导入记录 将true改为false; * 5. 使用前需要引入phpoffice扩展; * 6. 如果需要重新处理表格数据, * 6-1. 将$dealData 传值 true; * 6-2. 需要重新调用批量添加的方法$this->insertAllData($data); * * 使用方法: * 1. 实例化当前类 * 2. 同时传参(*:必须;-:非必须): *表名 *表字段 *上传文件接收的名字 -是否需要返回表格数据 -文件限制大小 * 3. 调用upload方法即可 * * * 示例: * namespace app\index\controller; * use think\Controller; * use app\index\lib\xlsx\import as aaa; * class A extends Controller * { * public function aa(){ * $tableFile = ['a','b','c','d','e','f','g','h']; * $imports = new aaa('test',$tableFile,'file'); * if($this->request->file('file')){ * return $imports->upload(); * }else{ * return "<form action='/public/index.php/index/a/aa' enctype='multipart/form-data' method='post'> * <input type='file' name='file' /> <br> * <input type='submit' value='上传' /> * </form> "; * } * } * } */ public $fileSize; //文件大小 注意:已经转换成字节,所以单位(M) public $fileName; //接受文件的名字 public $filePath = 'uploads/importxlsx'; //文件路径 public $suffix; //文件后缀 public $suffixArr = ['xlsx', 'xls', 'Xlsx', 'Xls']; //文件后缀范围 public $tableName; //数据表名 public $tableField; //数据表字段 public $switchLog = true; //导入记录 public $logTableName = 'xlsximportlog'; //记录表名称 public $dealData; //是否返回数据重新处理 /** * import constructor. 实例化自动执行 * @param string $tableName 表名 * @param array $tableField 数据库字段 * @param string $fileName 上传文件的名字 * @param string $fileSize 长传文件的大小 注意:已经转换成字节,所以单位(M) */ public function __construct($tableName = '', $tableField = [], $fileName = '', $dealData = false, $fileSize = '5') { parent::__construct(); $this->tableName = $tableName; $this->tableField = $tableField; $this->fileName = $fileName; $this->dealData = $dealData; $this->fileSize = $fileSize*1024*1024; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/2 15:07 * @Description:单文件上传 * 成功上传后 获取上传信息 *print_r($file->getInfo()); *[ * ['name'] => '2021-07-31 15_50_18-5822_商务部在办企业进度及时限表.xlsx', * ['type'] => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', * ['tmp_name'] => 'C:\Users\EDZ\AppData\Local\Temp\phpEAA4.tmp', * ['error'] => '0', * ['size'] => '132892' *]; *echo $info->getExtension(); //输出 jpg *echo $info->getSaveName(); //输出 20160820/42a79759f284b767dfcb2a0197904287.jpg *echo $info->getFilename(); //输出 42a79759f284b767dfcb2a0197904287.jpg */ public function upload(){ $file = request()->file($this->fileName); $path = ROOT_PATH . 'public' . DS . $this->filePath; $info = $file->validate(['size'=>$this->fileSize,'ext' => $this->suffixArr])->move($path); if($info){ $this->path = $path.'/'.$info->getSaveName(); $this->suffix = $info->getExtension(); $res = self::import($file->getInfo()); if($this->switchLog){ self::importLog($this->path,count($res),$file->getInfo['name'],$file->getInfo['size'],$file->getInfo['type']); } if($this->dealData){ return $res; } $result = $this->insertAllData($res); if($result){ return $result; } throw new Exception('添加失败'); }else{ // 上传失败获取错误信息 throw new Exception($file->getError()); } } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/3 18:05 * @throws \PhpOffice\PhpSpreadsheet\Exception * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception * @Description:导入逻辑 */ private function import($fileInfo = []){ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader(ucfirst($this->suffix)); $reader->setReadDataOnly(TRUE); $spreadsheet = $reader->load($this->path); //载入excel表格 $worksheet = $spreadsheet->getActiveSheet(); $highestRow = $worksheet->getHighestRow(); // 总行数 $highestColumn = $worksheet->getHighestColumn(); // 总列数 $highestColumnNum = self::getColumnArrByMaxCol($highestColumn); //列值 if(count($highestColumnNum) != count($this->tableField)) throw new Exception("表格的列数和表字段个数不相同,请确认后再试~"); $lines = $highestRow - 1;//减掉表的第一行(通常第一行是表头,不需要导入,导入时无需删除第一行) if ($lines <= 0) throw new Exception($fileInfo['name']."Excel表格中没有数据~"); $b = 0; for ($i = 2; $i <= $highestRow; $i++){ for($a = 0; $a <= count($highestColumnNum); $a++){ $data[$b][$this->tableField[$a]] = $worksheet->getCellByColumnAndRow($a+1,$i)->getValue(); } array_pop($data[$b]); $b++; } return $data; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/4 14:35 * @param string $col * @throws Exception * @Description:根据列数的最大值返回最大范围内的列值 */ public function getColumnArrByMaxCol($col = ''){ if(empty($col)) throw new Exception("不能为空~"); if(strlen($col) > 2) throw new Exception("导入列数超出最大值~"); strtoupper($col); $column_word = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; $colArr = []; if(in_array($col,$column_word)){ for ($i=0;$i<=25;$i++){ if($column_word[$i] == $col) { array_push($colArr,$column_word[$i]); return $colArr; } array_push($colArr,$column_word[$i]); } } $firstColumn = substr($col,0,1); $twoColumn = substr($col,1,1); if(!in_array($firstColumn,$column_word)) throw new Exception("错误的参数"); if(!in_array($twoColumn,$column_word)) throw new Exception("错误的参数"); $firstColumnNum = array_keys($column_word,$firstColumn); // $twoColumnNum = array_keys($column_word,$twoColumn); $colArr = $column_word; for($a = 0; $a <= $firstColumnNum[0]; $a++){ for($b = 0; $b <= 25; $b++){ if($twoColumn == $column_word[$b] && $firstColumnNum[0] == $a){ array_push($colArr,$column_word[$a].$column_word[$b]); return $colArr; } array_push($colArr,$column_word[$a].$column_word[$b]); } } } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/3 17:26 * @param $data * @return $this * @Description:添加全部数据 */ public function insertAllData($data = ''){ if(empty($data) || !is_array($data)) throw new Exception("导入的数据是空的"); $res = Db($this->tableName)->insertAll($data); if($res){ return $this; } throw new Exception("添加失败"); } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/3 16:53 * @param string $url * @param string $totalRow * @param string $totalInsert * @return string * @Description:日志记录 */ public function importLog($url = '', $totalRow = '', $name = '', $size = '', $type = ''){ if(!$this->switchLog){ return 'Method ERROR:The switchLog function must be enabled'; } if(!self::createTable()) throw new Exception("记录日志失败"); $data = [ 'create_time' => time(), 'url' => $url, 'name' => $name, 'size' => $size, 'type' => $type, 'num' => $totalRow, ]; $res = Db($this->logTableName)->insert($data); if($res){ return $this; } return "Error Message:Log recording failure"; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/3 11:59 * @param $xlsxTableName * @return bool|string * @throws \think\db\exception\BindParamException * @throws \think\exception\PDOException * @Description:创建数据表 */ private function createTable(){ $xlsxTableName = config('database.prefix').$this->logTableName; $isTable=db()->query('SHOW TABLES LIKE '."'". $xlsxTableName ."'"); if($isTable){ return $this; } $database = config('database.database'); $sql = "CREATE TABLE `". $database ."`.`". $xlsxTableName ."` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增', `url` varchar(255) NULL COMMENT 'url地址', `name` varchar(255) NULL COMMENT '源文件名名称', `size` varchar(40) NULL COMMENT '源文件大小', `type` varchar(255) NULL COMMENT '源文件类型', `num` int(11) NULL COMMENT '总数量', `create_time` bigint(20) NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) COMMENT = '导入xlsx表格记录表'"; $res = db()->query($sql); if($res){ return $this; } return "Query Message:Error creating data table"; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/8/3 17:18 * @param string $page * @param string $limit * @param string $sort * @return bool|false|\PDOStatement|string|\think\Collection * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @Description:获取日志列表 */ public function getLogList($page = '1', $limit = '20', $sort = 'desc'){ $res = Db($this->logTableName)->page($page,$limit)->order('id',$sort)->select(); return $res; } }
2022年06月23日
515 阅读
3 评论
0 点赞
2022-06-21
【PHP】基于thinkphp5的数据库备份与还原扩展
使用composer安装:`composer require tp5er/tp5-databackup dev-master` 引入 `use \tp5er\Backup;` **基本配置信息,默认传入下面参数** $config=array( 'path' => './Data/',//数据库备份路径 'part' => 20971520,//数据库备份卷大小 'compress' => 0,//数据库备份文件是否启用压缩 0不压缩 1 压缩 'level' => 9 //数据库备份文件压缩级别 1普通 4 一般 9最高 ); **实例化** $db= new Backup($config); **数据类表列表** return $this->fetch('index',['list'=>$db->dataList()]); **备份文件列表** return $this->fetch('importlist',['list'=>$db->fileList()]); **备份表** $start= $db->setFile($file)->backup($tables[$id], $start); **导入表** $start= $db->setFile($file)->import($start); **删除备份文件** $db->delFile($time); **修复表** $db->repair($tables) **优化表** $db->optimize($tables)
2022年06月21日
211 阅读
0 评论
0 点赞
2022-06-21
【PHP】扩展 qrcode 二维码生成
**一、执行命令安装** composer require dh2y/think-qrcode **二、require安装** thinkphp5.0 安装 "require": { "dh2y/think-qrcode":"1.*" }, thinkphp5.1 安装 "require": { "dh2y/think-qrcode":"2.*" }, **三、autoload psr-4标准安装** a) 进入vendor/dh2y目录 (没有dh2y目录 mkdir dh2y) b) git clone c) 修改 git clone下来的项目名称为think-qrcode d) 添加下面配置 "autoload": { "psr-4": { "dh2y\\qrcode\\": "vendor/dh2y/think-qrcode/src" } }, e) php composer.phar update **添加配置文件** return [ 'cache_dir' => 'uploads'.DS.'qrcode', //缓存地址 'background'=> 'static/image/icon_cover.png' //背景图 ]; **使用方法** $code = new QRcode(); $code_path = $code->png($register_url) //生成二维码 ->logo('static/image/avatar-m.jpg') //生成logo二维码 ->background(180,500) //给二维码加上背景 ->text($role,20,['center',740],'#ff4351') //添加文字水印 ->text($nick_name,20,['center',780],'#000000') ->getPath(); //获取二维码生成的地址
2022年06月21日
144 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP6 基本操作
请求变量 use think\facade\Request; Request::param('name'); Request::param();全部请求变量 返回数组 Request::param(['name', 'email']); 多个变量 Request::param('a','1') $a不存在使用默认值1 Request::param('username','','strip_tags'); 参数过滤 去掉html标签 htmlspecialchars转换成实体入库 strtolower小写 Request::header(); 请求头数组,支持单个 cookie input("name"); Request::session();获取 $_SESSION 变量 Request::cookie();获取 $_COOKIE 变量 Request::server();获取 $_SERVER 变量 Request::env();返回env数组 Request::file();获取 $_FILES 变量 Request::baseUrl(); /index/index Request::host(true); 域名:www.baidu.com,默认无参数包含端口:80 Request::url(1); 完整域名和地址 http://tp6.api.shanliwawa.top:80/index/index Request::domain(1) http://tp6.api.shanliwawa.top Request::time() 请求时间戳 Request::app() 应用名 index Request::controller() 控制器 Index 参数true小写 Request::action() 操作 index 参数true 小写 Request::method(true); 请求类型获取 GET isGet isPost isPut isDelete isAjax isMobile isHead 判断是否某种类型 Request::has('id','get'); 检测变量id是否存在 url('index/hello', ['id'=>5,'name'=>'李白'],'do'); http://tp6.api.shanliwawa.top/index/hello/李白.do?id=5 url('index/hello#aa'); 锚点 Cache::set('name', $value, 3600); 1小时后过期 Cache::get('name'); 获取缓存 多缓存类型配置 return [ // 缓存类型为File 'type' => 'redis', // 全局缓存有效期(0为永久有效) ,开发下一定要设置-1 否在刷新后 还在 'expire'=> -1, // 缓存前缀 'prefix'=> 'think', // 缓存目录 'host' => '127.0.0.1', ]; return [ // 使用复合缓存类型 'type' => 'complex', // 默认使用的缓存 'default' => [ // 驱动方式 'type' => 'file', // 缓存保存目录 'path' => '../runtime/default', ], // 文件缓存 'file' => [ // 驱动方式 'type' => 'file', // 设置不同的缓存保存目录 'path' => '../runtime/file/', ], // redis缓存 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => '127.0.0.1', ], ]; use think\facade\Cache; Cache::store('file')->set('name','123',0); $v = Cache::store('redis')->get('name'); Cache::store('default')->get('name');文件缓存 Cache::delete('name'); Cache::clear(); Cache::set('name', [1,2,3]); Cache::push('name', 4); Cache::remember('start_time', time()); 不存在则创建 Cache::inc('name',1); 自增1 Cache::dec('name',1); 自减1 $redis = Cache::handler(); redis对象 配置redis session return [ 'type' => 'redis', 'prefix' => 'think', 'auto_start' => true, // redis主机 'host' => '127.0.0.1', // redis端口 'port' => 6379, // 密码 'password' => '', ] session('name', ['thinkphp']); 设置支持字符串 数组 session('name');获取 session('name', null);删除 session(null);清空 cookie('name', 'value', 3600); 设置不支持数组,序列化后存储 cookie('name'); cookie('name', null); cookie('think_lang','en-us');//设置语言类型 lang('add user error');//翻译 config('cache.type') 读取配置 验证 {:token_field()} 模板中输出令牌 {:token_meta()} ajax提交 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); Route::post('blog/save','blog/save')->token(); 路由中使用验证 think\facade\Validate $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 10, 'email' => 'thinkphp@qq.com', ]; $validate = Validate::rule($rule)->message($msg); $result = $validate->check($data); if(!$result) { dump($validate->getError()); } 路由 Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 ->allowCrossDomain();跨域 输出响应 $data=['code'=>200,'msg'=>'信息提示','list'=>['中国']]; json($data); jsonp($data); xml($data); redirect('http://www.thinkphp.cn'); redirect('/index/hello/name'); //站内跳转 download('./static/2.xlsx'); 下载 数据库 use think\facade\Db; $rs =Db::name('user')->where('id',1)->find(); 查询一条记录 name不含前缀 $rs =Db::table('ims_user')->where('sex', 2)->select(); 多条数据 table含前缀 $rs1 =Db::name('user')->where('id', 1)->value('name'); 查询某个字段值 $rs =Db::table('ims_user')->where('sex', 2)->column('name,id','id'); 返回name,id列,后面是key $userId = Db::name('user')->insertGetId($data);//插入数据返回id Db::name('user') ->limit(100) ->insertAll($data); 插入多条数据,分每次100 Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); 更新 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); Db::table('think_user')->where('id',1)->delete(); Db::name('user')->delete(true);//清空数据 where('id','<>',1) 不等于1 > >= like where("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) field('id,title,content') 指定字段 limit(10,25) 第十条开始25条 单数字返回数据条数 page(1,10) 第一页十条 order(['id'=>'desc','sex'=>'desc']) 排序 group('user_id,test_time') 分组 count() max('id') min() avg() sum() 聚合函数 whereTime('birthday', '>=', '1970-10-1') 支持< = whereTime('create_time','-2 hours') 查询2小时 whereBetweenTime('create_time', '2017-01-01', '2017-06-30') 查询时间段 whereYear('create_time') 今年 whereYear('create_time','2018') last year 去年 whereMonth('create_time') last month上月 2018-06 具体月份 whereWeek('create_time') last week 上周 whereDay('create_time')今天 yesterday昨天 2018-11-1具体 Db::query("select * from think_user where status=1"); 原生查询 Db::execute("update think_user set name='thinkphp' where status=1");//更新插入删除 Db::query("select * from think_user where id=? AND status=?", [8, 1]);//绑定 $list = Db::name('user')->where('status',1)->paginate(10); 分页每页10条 模型 定义全局常量 define('__URL__',\think\facade\Request::domain(1)); http://tp6.api.shanliwawa.top define('__ROOT__',\think\facade\app::getRootPath()); 系统根目录 C:\www\tp6\ define("PRE",config('database.prefix')); 表前缀 绝对路径获取 \think\facade\app::getRootPath() 根目录C:\www\tp6\ \think\facade\app::getAppPath() 应用路径 C:\www\tp6\app\index\ \think\facade\app::getConfigPath() 配置路径C:\www\tp6\config\ \think\facade\app::version() 核心版本 模板视图 use think\facade\View; View::assign([ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::assign('data',[ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::fetch('index'); 助手函数 view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); 模板输出 {$name} {$data.name} 等价 {$data['name']} {:dump($data)} 使用函数 :开头 {$user.nickname|default="这家伙很懒,什么也没留下"} {$Think.cookie.name} // 输出$_COOKIE['name']变量 {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量 {$Think.session.user_id} // 输出$_SESSION['user_id']变量 {$Think.get.page} // 输出$_GET['page']变量 {$Request.param.name} 获取name {$data.name|raw} 不转义输出 {$data.create_time|date='Y-m-d H:i'} {literal} Hello,{$name}! 原样输出 {/literal} {load href="/static/js/common.js,/static/js/common.css" /} 加载js,css {php}echo 'Hello,world!';{/php} {/* 注释内容 */ } 或 {// 注释内容 } {include file="public/header" /} 模板包含 {include file="Public/header" title="$title" keywords="开源WEB开发框架" /} 传入参数 {foreach $list as $key=>$vo } {$vo.id}:{$vo.name} {/foreach} {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" } {/for} {if 表达式}value1 {elseif 表达式 /}value2 {else /}value3 {/if} 记录日志 log.php 可添加 'json' => 1 表示json格式 trace("日志信息") app.php中 'app_trace' => true, trace.php改为默认html 'type' => 'Console', 上传 $file = request()->file('image'); 移动到框架应用根目录/uploads/ 目录下 $info = $file->move( '../uploads'); if($info){ 成功上传后 获取上传信息 输出 jpg echo $info->getExtension(); 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg echo $info->getSaveName(); 输出 42a79759f284b767dfcb2a0197904287.jpg echo $info->getFilename(); }else{ 上传失败获取错误信息 echo $file->getError(); } 多文件xphr foreach($files as $file){} 验证,生成带md5文件名 $info = $file->rule('md5')->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move( '../uploads');
2022年06月21日
194 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP5 实现sentry通知,记录日志
<?php namespace app\index\common; use think\Log; class Logs { //sentry日志收集器 static public function sentryLogs($e,$line,array $data = []) { Log::init([ 'type' => 'File', 'path' => LOG_PATH, ]); $sentryClient = new \Raven_Client( 'https://c5485e6c233347ca8a7990a2bf77514a:9a69f3eb68c446f8ae3247eb368c1ff6@sentry.io/1193480', [ 'name' => \Raven_Compat::gethostname(),//服务器主机名 'environment' => 'production', 'level' => 'error', //附加数据 'extra' => $data, 'app_path' => ROOT_PATH, 'sample_rate' => 1,//值0.00将拒绝发送任何事件,值1.00将发送100%的事件。 'curl_method' => 'async',//curl异步发送,比同步体验好很多 //回掉方法,在发送数据之前操作 'send_callback' => function ($data) { }, ]); //单独设置用户信息 $sentryClient->user_context([ 'id' => 2966, 'username' => 'XPH', 'email' => '3584685883@qq.com', 'mobile' => '176****376', 'ip_address' => $_SERVER['REMOTE_ADDR'] ]); if ( $e && is_object($e) ) { $sentryClient->captureException($e); $errorMsg = "\n文件:".$e->getFile()."\n行数:".$e->getLine()."\n错误代码:".$e->getCode()."\n错误信息:".$e->getMessage()."\n"; }else{ //当没有异常只想记录信息的时候可以使用这个 $sentryClient->captureMessage($e); $errorMsg = $e."\n行数:".$line; } Log::record($errorMsg); } }
2022年06月21日
158 阅读
0 评论
0 点赞
2022-06-19
【PHP】ThinkPHP5.1开发技巧
用facade替换类实例化操作,代码简洁、清淅易于维护app()统一操作,代码清淅简洁数据处理统一定义于model中,比如数据缓存,数据转换,拼接日志可利用注入、行为、控制器前后置操作来执行记录方法定义DS简化代码 define('DS', DIRECTORY\_SEPARATOR)善用定义命令行console减少重复工作前端组件集成,可参照fastadmin,dolphinPHP中的集成方法,可提高开发效率,使用方法,可通过 thinkphp\helper.php 自带助手函数,学习内置类调用方法善用traits减少重复代码控制器: 前置操作,方便临时增加的处理过程; 当然中间插件也是不错的选择模型:数据转换,缓存.....与数据相关的,统一放于模型之中加载与配置 use think\facace\Load; use think\facace\Config include app('env')\->get('app\_path').'chsys'.DIRECTORY\_SEPARATOR.'common.php';只在部分控制器添加特定配置 ..... class Index extends Admin{ //初始化 左菜单 public function _initialize(){ parent::_initialize(); \think\facade\Config::set('my',....); } initialize控制器 Route,Controller\think\facace\Route; \think\Controller;只在部分控制器中,加启用配置或者添加路由方法可通过行为【tags.php】添加 或者 intiallize()中动态加载 class Linktest extends Admin{ //初始化 左菜单 public function _initialize(){ parent::_initialize(); Route:: // dump((new CustomerM)->quickAdd()); } 数据处理 Db,Model \think\Db; \think\Model; hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');实用数据查询方法默认模型返回为数据集格式数据 转换为数组方法 用函数( collection() ) collection(CustomerM::group('name')->field('id,name')->select())->toArray();单条记录返回数据方法 CustomerM::find(1)->toArray(); CustomerM::find(1)->toArray();获取指定字段所有数据方法 CustomerM::where('name','like','%name%')->column('id,name'); //返回格式为 [ '$id'=>"$name", '$id'=>"$name" ];返回指定字段的值 【单条记录】 CustomerM::where('id',5)->value('name'); //或者 CustomerM::where('id',5)->getFieldName();验证内置支持验证规则// 验证规则默认提示信息 protected static $typeMsg = [ 'require' => ':attribute不能为空', 'number' => ':attribute必须是数字', 'integer' => ':attribute必须是整数', 'float' => ':attribute必须是浮点数', 'boolean' => ':attribute必须是布尔值', 'email' => ':attribute格式不符', 'array' => ':attribute必须是数组', 'accepted' => ':attribute必须是yes、on或者1', 'date' => ':attribute格式不符合', 'file' => ':attribute不是有效的上传文件', 'image' => ':attribute不是有效的图像文件', 'alpha' => ':attribute只能是字母', 'alphaNum' => ':attribute只能是字母和数字', 'alphaDash' => ':attribute只能是字母、数字和下划线_及破折号-', 'activeUrl' => ':attribute不是有效的域名或者IP', 'chs' => ':attribute只能是汉字', 'chsAlpha' => ':attribute只能是汉字、字母', 'chsAlphaNum' => ':attribute只能是汉字、字母和数字', 'chsDash' => ':attribute只能是汉字、字母、数字和下划线_及破折号-', 'url' => ':attribute不是有效的URL地址', 'ip' => ':attribute不是有效的IP地址', 'dateFormat' => ':attribute必须使用日期格式 :rule', 'in' => ':attribute必须在 :rule 范围内', 'notIn' => ':attribute不能在 :rule 范围内', 'between' => ':attribute只能在 :1 - :2 之间', 'notBetween' => ':attribute不能在 :1 - :2 之间', 'length' => ':attribute长度不符合要求 :rule', 'max' => ':attribute长度不能超过 :rule', 'min' => ':attribute长度不能小于 :rule', 'after' => ':attribute日期不能小于 :rule', 'before' => ':attribute日期不能超过 :rule', 'expire' => '不在有效期内 :rule', 'allowIp' => '不允许的IP访问', 'denyIp' => '禁止的IP访问', 'confirm' => ':attribute和确认字段:2不一致', 'different' => ':attribute和比较字段:2不能相同', 'egt' => ':attribute必须大于等于 :rule', 'gt' => ':attribute必须大于 :rule', 'elt' => ':attribute必须小于等于 :rule', 'lt' => ':attribute必须小于 :rule', 'eq' => ':attribute必须等于 :rule', 'unique' => ':attribute已存在', 'regex' => ':attribute不符合指定规则', 'method' => '无效的请求类型', 'token' => '令牌数据无效', 'fileSize' => '上传文件大小不符', 'fileExt' => '上传文件后缀不符', 'fileMime' => '上传文件类型不符', ];
2022年06月19日
259 阅读
0 评论
0 点赞
2022-06-17
【PHP】TP5.1框架获取服务器信息
//获取服务器相关信息 $info = [ '操作系统'=>PHP_OS, '运行环境'=>$_SERVER["SERVER_SOFTWARE"], 'PHP运行方式'=>php_sapi_name(), 'ThinkPHP版本'=> 'V'. \think\facade\App::version(), '上传附件限制'=>ini_get('upload_max_filesize'), '执行时间限制'=>ini_get('max_execution_time').'秒', '服务器时间'=>date("Y年n月j日 H:i:s"), '北京时间'=>gmdate("Y年n月j日 H:i:s",time()+8*3600), '服务器所处时区' => date_default_timezone_get(), '服务器域名/IP'=>$_SERVER['SERVER_NAME'].' [ '.gethostbyname($_SERVER['SERVER_NAME']).' ]', '剩余空间'=>round((disk_free_space(".")/(1024*1024)),2).'M', 'register_globals'=>get_cfg_var("register_globals")=="1" ? "ON" : "OFF", 'magic_quotes_gpc'=>(1===get_magic_quotes_gpc())?'YES':'NO', 'magic_quotes_runtime'=>(1===get_magic_quotes_runtime())?'YES':'NO' ]; /** * 获取当前的运行环境 * @return string */ function getHuanjing(){ switch (PHP_SAPI){ case 'fpm-fcgi': return 'nginx+php-fpm'; break; case 'cgi-fcgi': return 'nginx+fastcgi'; break; case 'apache2handler': return 'apache'; break; default: return PHP_SAPI; } } /** * 获取数据库版本 */ function dbVersion(){ $db = think\Db::query('select VERSION()'); return $db[0]['VERSION()']; } /** * 获取最大上传文件大小 */ function get_upload_max_filesize(){ return ini_get('upload_max_filesize'); }
2022年06月17日
288 阅读
1 评论
0 点赞
2022-06-17
【PHP】使用PHP根据用户的IP地址获取地址信息
/** * @Author:小破孩 * @Time: 2020/7/15 15:17 * @Description:用户登录记录 */ 'bd_ak' => 'yr0Rm***************24HruOyGE', //百度地图的ak function get_client_city(){ $ip = get_client_ip(); //调用上面的函数进行获取IP地址 $ak = Config('app.bd_ak'); ///申请的ak $url = file_get_contents("http://api.map.baidu.com/location/ip?ip=$ip&ak=$ak"); //调用百度地图开放接口 $res = json_decode($url,true); //数据处理 $data['login_ip'] = $ip; //ip $data['login_xy'] = $res['content']['point']['x'].','.$res['content']['point']['y'];//坐标 $data['login_province'] = $res['content']['address_detail']['province']; //省 $data['login_city'] = $res['content']['address_detail']['city']; //市 $data['login_district'] = $res['content']['address_detail']['district'];//区 $data['login_street'] = $res['content']['address_detail']['street']; //街 $data['login_street_number'] = $res['content']['address_detail']['street_number']; //街道编号 $data['login_city_code'] = $res['content']['address_detail']['city_code']; //城市编号 $data['login_create_time'] = time(); //入库 Db::name('login_log')->insert($data); } //表 CREATE TABLE `login_log` ( `login_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户登录记录主键', `login_user_number` bigint(20) NOT NULL COMMENT '用户编号', `login_ip` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户登录的ip', `login_xy` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '登录的坐标点', `login_province` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '登录省', `login_city` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '登录城市', `login_district` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '区', `login_street` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '街', `login_street_number` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '街道编号', `login_city_code` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '城市编号', `login_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '用户登录类型 0平台用户,1前台用户', `login_create_time` bigint(20) NOT NULL COMMENT '创建时间', PRIMARY KEY (`login_id`,`login_user_number`), KEY `login_create_time` (`login_create_time`) COMMENT '时间索引 搜索', KEY `login_type` (`login_type`) COMMENT '类型' ) ENGINE=MyISAM AUTO_INCREMENT=163 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户登录记录';
2022年06月17日
175 阅读
0 评论
0 点赞
1
2