首页
关于小站
朋友
壁纸
留言
时光之书
笔顺字帖
LayUI手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,673 阅读
2
【Layui】控制页面元素展示隐藏
1,520 阅读
3
【Git】No tracked branch configured for branch master or the branch doesn't exist.
1,460 阅读
4
【PHP】PHP实现JWT生成和验证
1,370 阅读
5
精准检测,助力社交管理 —— 微信好友检测服务来袭!
1,278 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
JavaScript
OOP
Layui
Web
Server
Docker
Linux
PHPSpreadsheet
PHPoffice
Array
设计模式
Git
排序算法
基础
小破孩
累计撰写
244
篇文章
累计收到
13
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
页面
关于小站
朋友
壁纸
留言
时光之书
笔顺字帖
LayUI手册
搜索到
87
篇与
的结果
2022-06-19
【PHP】PHP接口返回数据格式
/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2020/9/30 16:35 * @param $code 状态码 * @param string $msg 提示信息 * @param array $data 数据 * @Description:返回标格式 */ function returnResponse ($code,$msg = '',$data=array()){ $retData = array( 'code' => $code, 'message' => $msg, 'data' => $data?$data:'', ); #错误时不显示data if($code != 200){ unset($retData['data']); } header('Content-Type:application/json; charset=utf-8'); exit(json_encode($retData,JSON_UNESCAPED_UNICODE)); } public function show($code = '', $message = '', $result = '', $httpCode = 200){ $data = [ 'code' => $code, 'message' => $message, 'result' => $result, ]; if(empty($data['result'])){ unset($data['result']); } return json($data,$httpCode); }这个方法只是code值在200的时候才会有返回data;
2022年06月19日
225 阅读
0 评论
0 点赞
2022-06-19
【PHP】基于RBAC模式解决权限管理
本文以最简单逻辑解释什么是rbac模式本文全是个人理解,如有不恰当的地方,请指出,互相学习RBAC(Role-Based Access Control)权限模型的概念,即:基于角色的权限控制。通过角色关联用户,角色关联权限的方式间接赋予用户权限。1.创建最基本的三个表,即 人员表(admin),角色表(role),功能表(func),和一个扩展人员权限表(admin_func)人员表:必有得字段(role_id)角色表:必有的字段(func_ids)人员扩展权限表:必有得字段(admin_id,func_ids)2.整体思路用户登录,查人员表数据,获取到角色唯一标志(这里是id)通过角色唯一标记,获取权限(这里角色里面的func_ids里面的数据通常是逗号隔开的字符串,我们在业务逻辑上处理时,转换成数组比较好处理)用户操作任意一个功能,获取到该功能的 控制器 和 方法 去功能表里查获取到id获取到的id判断是不是在上一步查的角色所对应的func_ids里面3.特殊情况如果在一个公司内,举个例子,在同一个公司有两个销售部(a部门,b部门),两个销售部的领导都是有一样的权限的(角色是一样的),这个时候,公司高层决定,a部门的领导为总领导,可以查看b部门的数据,这个时候,都知道,a和b的部门领导角色不能修改,一种笨方法,在开一个账号,分配角色和权限,可以查看b部门的数据,这样不符合工作逻辑,对领导不友好,下面就有了扩展人员权限在扩展人员表里绑定人员id和对应的功能表的id这样在我们操作的时候就多了一个步骤,多查一个表(admin_func),获取到的数据在和角色里面的权限进行合并,在做后面业务逻辑操作4.在什么位置实现权限在你看来怎么方便怎么实现,最好的就在中间件里实现权限验证,可以有效的降低无效访问中间件的主要应用场景可以包括对HTTP请求的数据过滤、权限检测、请求拦截等行为,使用中间件能够让控制器的定义更加简单,很多额外的非核心业务流程的处理都可以交给中间件执行。补充: 在实际的代码逻辑中应该避免用if else 判断不同角色查看同一接口返回不同的数据,不同的角色应该在权限理固定好访问接口。这里面需要更多的绑定关系。
2022年06月19日
250 阅读
0 评论
0 点赞
2022-06-19
【PHP】PHP易混淆函数区别(面试题常见)
1、echo、print、print_r/var_dump的区别 echo():可以一次输出多个值,多个值用逗号隔开,echo是语言结构,而并不是真正的函数,因此不 能作为表达式的一部分使用。 print():打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false print_r():可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头 var_dump():判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一 个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。2、include、include_once、require、require_once的区别 include():使用include应用外部文件时,只有代码执行到include语句时,外部文件才会被引入并读取,当所引用的外部文件 发生错误时,系统只给出一个警告,而整个php文件则继续向下执行。 include_once():使用include_once语句会在导入文件前先检测该文件是否在该页面的其他部分被应用过,如果有,则不会重复 引用该文件,程序只能引用一次。 require():使用require语句来调用文件时,如果调用的文件没找到,require语句会输出错误信息,并且立即终止脚本处理 require_once():使用require_once语句时,会先检查要引用的文件是不是已经在该程序中的其他地方被引用过,如果有,则不 会在重复调用该文件,在同一个页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二次引用的文件 则不会被执行。3、empty、isset、is_null的区别 empty:如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE isset: 检测变量是否设置;如果 var 存在则返回 TRUE,否则返回 FALSE。如果已经使用 unset() 释放了一个变量之后,它 将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。 is_null:当参数满足下面三种情况时,将返回TRUE,其它的情况就是FALSE。 * 它被赋值为NULL * 它还没有赋值 * 它未定义,相当于 unset(),将一个变量 unset()后,不就是没有定义吗 $myvar = NULL; var_dump(is_null($myvar)); // TRUE $myvar1; var_dump(is_null($myvar1)); // TRUE Notice: Undefined variable $num = 520; unset($num); var_dump(is_null($num)); //TRUE Notice: Undefined variable var_dump(is_null($some_undefined_var)); //TRUE Notice: Undefined variable $myvar = 0; is_null($myvar); // FALSE $myvar = FALSE; is_null($myvar); // FALSE $myvar = ''; is_null($myvar); // FALSE4、双引号和单引号的区别一般情况下两者是通用的.但双引号内部变量会解析,单引号则不解析.双引号中的变量和特殊字符 (\r\n) 会被转义,单引号中的内容不会被转义5、session和cookie的区别(1)cookie数据存放在客户的浏览器上,session数据放在服务器上。 (2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。 (3)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 (4)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE6、get和post的区别(1)GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接; (2)POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。 (3)GET请求在URL中传送的参数是有长度限制的,而POST没有。 (4)POST相对于GET更加安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。7、传值与传引用的区别传值:把实参的值赋值给形参,对形参的修改不会影响到实参的值 传引用:真正的以地址的方式传递参数,传递以后,行参和实参都是同一个对象,对行参的修改将影响实参的值 8、==和===的区别、“!==”与“!=”的区别===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。9、->和=>的区别->用来引用对象的成员(属性与方法) =>只用来数组赋值10、?? 与 ?:区别?? :用于判断并赋值,先判断当前变量是否为null,如果是就可以赋一个新值 ?:常用于三元运算符,问号的作用是选择条件作为程序继续执行的分支11、跳出循环:exit、return、break、continue之间的区别 exit:用来结束程序执行的。可以用在任何地方,本身没有跳出循环的含义。 return: (1)从当前的方法中退出,返回到该调用的方法的语句处,继续执行。 (2)返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致。 (3)return 后面也可以不带参数,不带参数就是返回空,其实主要目的就是用于想中断函数执行,返回调用函数处。 break: (1)当它在循环体内,强行结束循环的执行,也就是结束整个循环过程,不在判断执行循环的条件是否成立,直接转 向循环语句下面的语句。 (2)当它出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。 continue:终止本次循环的执行,即跳过当前这次循环中continue语句后尚未执行的语句,接着进行下一次循环条件的判断。12、function_exists、method_exists、class_exists、property_exists、is_subclass_of 的区别 function_exists( string $function_name ) : 函数用于检测函数是否被定义,检测的函数可以是 PHP 的内置函数,也可以 是用户的自定义函数。如果被检测的函数存在则返回 TRUE ,否则返回 FALSE 。 method_exists ( mixed $object , string $method_name ) :检查类的方法是否存在于指定的 object中。如果检测的方法存 在与指定的对象中,则返回true,否则返回false。 class_exists ( string $class_name [, bool $autoload = TRUE ] ) :检查类是否被定义。第一个参数为检测的类名(如果 使用了命名空间后,需要使用完整的带命名空间的类名,如:app\admin\service\UserService ); class_exists()会默认将 会尝试调用 _autoload,如果不想让 class_exists() 调用_autoload,可以将 autoload 参数设为 FALSE。 property_exists([mixed] $class,string $property):判断类或对象中的属性是否存在(可无视属性权限),存在返回true, 否则返回false,$class 可以是类名(字符串)或类对象,$property为属性的名字 is_subclass_of ( object $object , string $class_name ):判断一个对象是否为一个类的子类,返回bool值13、PHP四种网页重定向方式 header('location:http://www.baidu.com'); echo '<meta http-equiv="refresh" content="1;http://www.baidu.com">'; echo '<script>window.location.href="http://www.baidu.com"</script>'; echo file_get_contents('http://www.baidu.com');14、php三种合并数组的方式 array_merge($arr, $arr_1); // 合并数组,如果健名为整数,键名会从 0 开始进行重新索引。 array_merge_recursive($arr, $arr_1); // 递归合并数组,不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组 $arr + $arr_1 // 保留键名,追加数组转载:https://www.kancloud.cn/chunyu/php_basic_knowledge/767174
2022年06月19日
264 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP多维数组转一维数组
function multi2array($array) { static $result_array = array(); foreach ($array as $key => $value) { if (is_array($value)) { multi2array($value); } else{ $result_array[] = $value; } } return $result_array; } function _arr($array,$return=[]){ array_walk_recursive($array,function($value)use(&$return){$return[]=$value;}); return $return; }
2022年06月17日
325 阅读
0 评论
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日
275 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP获取服务器状态
<?php function get_server_status() { $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"', "r");//获取某一时刻系统cpu和内存使用情况 $rs = ""; while (!feof($fp)) { $rs .= fread($fp, 1024); } pclose($fp); $sys_info = explode("\n", $rs); $tast_info = explode(",", $sys_info[3]);//进程 数组 $cpu_info = explode(",", $sys_info[4]); //CPU占有量 数组 $mem_info = explode(",", $sys_info[5]); //内存占有量 数组 //正在运行的进程数 $tast_running = trim(trim($tast_info[1], 'running')); //CPU占有量 $cpu_usage = trim(trim($cpu_info[0], 'Cpu(s): '), '%us'); //百分比 //内存占有量 $mem_total = trim(trim($mem_info[0], 'Mem: '), 'k total'); $mem_used = trim($mem_info[1], 'k used'); $mem_usage = round(100 * intval($mem_used) / intval($mem_total), 2); //百分比 /*硬盘使用率 begin*/ $fp = popen('df -lh | grep -E "^(/)"', "r"); $rs = fread($fp, 1024); pclose($fp); $rs = preg_replace("/\s{2,}/", ' ', $rs); //把多个空格换成 “_” $hd = explode(" ", $rs); $hd_avail = trim($hd[3], 'G'); //磁盘可用空间大小 单位G $hd_usage = trim($hd[4], '%'); //挂载点 百分比 /*硬盘使用率 end*/ //检测时间 $fp = popen("date +\"%Y-%m-%d %H:%M\"", "r"); $rs = fread($fp, 1024); pclose($fp); $detection_time = trim($rs); $result = [ 'cpu_usage' => $cpu_usage, 'mem_usage' => $mem_usage, 'hd_avail' => $hd_avail, 'hd_usage' => $hd_usage, 'tast_running' => $tast_running, 'detection_time' => $detection_time ]; return $result; }
2022年06月17日
264 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP获取网页里的所有图片
<?php $new_url = []; $url="网页地址"; //file_get_contents() 函数把整个文件读入一个字符串中 $string=file_get_contents($url); //preg_match_all函数进行全局正则表达式匹配。 preg_match_all("/<img[^>]*>/i", $string,$matches); //去除数组中重复的值 $new_arr=array_unique($matches[0]); foreach($new_arr as $key){ //查找img标签内的src内容 preg_match_all('/<img.*?src="(.*?)".*?>/is',$key,$match); //根据网页图片后缀可以灵活修改 $one = str_replace('?v1', '', $match[1][0]); //插入数组 array_push($new_url,$url.$one); } //下载并保存图片 function download($downurl, $path = 'images/'){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $downurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($downurl, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); } //循环下载 foreach ( $new_url as $url ) { download($url); } ?>
2022年06月17日
283 阅读
0 评论
0 点赞
1
...
4
5