面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
get?传参,控制器形参、验证器字段与url参数名必须完全一致
thinkphp
阅读更多风口下的猪2019-08-27【thinkphp】
-
定义模型关联关系时,不能用“_”,尽量使用驼峰命名关联关系
thinkphp
阅读更多风口下的猪2019-08-27【thinkphp】
-
构造函数__construct()在哪儿
软件开发我们经常会使用new Class();通过Class类去造一个对象,但造出对象的属性已经是在Class里确定好了,这样就相当于Class是一个固定的摸具,不能进行“抽芯”。
我们也会看到new Class(['code'=>1000,'msg'=>$error])这样的new出对象,这实际就是传参定制化new。这时这个Class里面就必定有__construct()方法,用于重写Class类中属性。
$error = $this->getError();throw new ParameterException(['msg'=>$error]);class BaseException extends Exception{public $code=400;public $msg='参数错误';public $errorCode=1000;public function __construct(Array $param){if(!is_array($param)){return;}if(array_key_exists('code',$param)){$this->code=$param['code'];}if(array_key_exists('msg',$param)){$this->msg=$param['msg'];}if(array_key_exists('errorCode',$param)){$this->errorCode=$param['errorCode'];}}}
阅读更多风口下的猪2019-08-26【软件开发】
-
全局异常处理,报参数致命错误
thinkphp
阅读更多风口下的猪2019-08-26【thinkphp】
-
jsonp跨域
软件开发在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。
比如,有个a.html页面,它里面的代码需要利用ajax获取一个不同域上的json数据,假设这个json数据地址是http://example.com/data.php,那么a.html中的代码就可以这样:
<script>
function dosomething(jsondata){
//处理获得的jsondata数据
}
</script>
<script src='http://domian.com/test.php?callback=dosomething'></script>我们看到获取数据的地址后面还有一个callback参数,按惯例是用这个参数名,但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的,就得按照提供数据的那一方的规定格式来操作了。
因为是当做一个js文件来引入的,所以http://example.com/data.php返回的必须是一个能执行的js文件,所以这个页面的php代码可能是这样的:
<?php
$callback=$_GET['callback];
$data=array('a','b','c');
echo $callback.'('.json_decode($data).')';
?>最终那个页面输出的结果是:
dosomething(['a','b','c']);
所以通过http://example.com/data.php?callback=dosomething得到的js文件,就是我们之前定义的dosomething函数,并且它的参数就是我们需要的json数据,这样我们就跨域获得了我们需要的数据。
这样jsonp的原理就很清楚了,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。
知道jsonp跨域的原理后我们就可以用js动态生成script标签来进行跨域操作了,而不用特意的手动的书写那些script标签。如果你的页面使用jquery,那么通过它封装的方法就能很方便的来进行jsonp操作了。
<script>$.getJSON('http://domain.com/php?id=1256&callback=?',function(jsondata){$("#ajxe").html(jsondata.oid+jsondata.msg);});</script>原理是一样的,只不过我们不需要手动的插入script标签以及定义回掉函数。jquery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。
阅读更多风口下的猪2019-08-19【软件开发】
-
同源策略
软件开发同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
同源策略限制以下几种行为:
- 1.) Cookie、LocalStorage 和 IndexDB 无法读取
- 2.) DOM 和 Js对象无法获得
- 3.) AJAX 请求不能发送
阅读更多风口下的猪2019-08-19【软件开发】
-
图片存储URL问题
软件开发图片资源分为两种:1.存在本地的图片;2.网络图片
在实际开发过程中区分两者,主要是为了使本地图片在牵站或者部署时,不因为域名改变而使图片读取不出来。即图片存在数据库时只存绝对路径,不包含域名字符。
合理的图片资源存读设计
(1)所有图片统一放在一张img数据表,各个板块通过外键指向img表id。(针对性能要求不高的项目,性能要求高的项目还是具体到每个数据表,每个表存具体的url,这样读起来更快)
(2)img表针对不同类型的图片应该分类。比如img_type字段:1为本地;2为来自网络。
(3)读取图片时
第一步.增加额外配置文件
在extra文件夹下增加setting.php
<?php return[ 'img_prefix'=>'http://example.com/images' ]
第二步,在模型中使用读取器数据自动完成
public function getUrlAttr($value,$data){ $final_url=$value; if($data['img_type']==1){ $final_url=config('setting.img_prefix').$value; } return $final_url; }
阅读更多风口下的猪2019-08-05【软件开发】
-
php-js的Ajax "ASO"流程
软件开发项目服务器端语言使用php,客户端开发想用ajax。牢记"ASO"流程。
"ASO"流程,实际上是数据在ajax过程中的三种形态,即在php时数据形态(array)、数据传输时形态(string)、客户端js操作数据时形态(object)。
那么具体到使用时如何操作?
一.php时,一定将查询出来的array数据从变成json字符串,再echo出去。
用到json_encode()方法
$result=json_encode($company_data,JSON_UNESCAPED_SLASHES);echo $result;二.客户端,js操作数据时一定操作的是对象,所以要将接受的json字符串变成json对象。
用到eval()方法。
var jsonObj = eval('(' + res + ')');例子如下:
company.php数据接口:
public function getcompany_index(){$company_data=db('cps')->where('cptype',$_POST['cptype'])->find();$result=json_encode($company_data,JSON_UNESCAPED_SLASHES);echo $result;}客户端调用数据:
$.post("{:url('index/company/getcompany_index')}",{cptype:type},function(res){if(res){var jsonObj = eval('(' + res + ')');var company_notice_string='<b>'+$(obj).attr('data1')+'</b><b class="c1">'+$(obj).attr('data2')+'</b><span>'+$(obj).attr('data3')+'</span>';var company_info_url="{:url('index/company/list')}"+'?company_cptype='+jsonObj.cptype;$('#company_datainfo').html(jsonObj.content);$('#company_datatice').html(company_notice_string);$('#company_info_look').attr("href",company_info_url);}else{alert('抱歉,该板块暂无信息!');}});
阅读更多风口下的猪2019-08-05【软件开发】
-
设计一个完整合理的自定义异常处理类库,要求在非调试模式下不能抛出含具体错误代码的页面,要求能分型处理服务器端异常和客户端异常。
thinkphp(1)修改日志记录位置,并且关闭默认日志记录
入口文件index.php中定义LOG_PATH常量
define('LOG_PATH',_DIR_.'/../log/');
配置文件config.php中设置开关
'log'=>['type'=>'file'];
将其改
为'log'=>['type'=>'test'];
(2)将自定义异常处理当作类库,供其它模块调用,建lib文件夹/exception文件夹,下设三个基础类:ServerException(服务器端异常处理源类)、ClientException(客户端异常源类)、ExceptionHandler(异常处理方法类)。
一.ServerException.php
namespace app\lib\exception; use think\Exception; class ServerException extends Exception{ public $code=500; public $msg='服务器内部错误,不想告述你'; public $errorCode=999; public function __construction ($params=[]){ if(!is_array($params)){ return ; } if(array_key_exists('code',$params)){ $this->code=$params['code']; } if(array_key_exists('msg',$params)){ $this->msg=$params['msg']; } if(array_key_exists('errorCode',$params)){ $this->errorCode=$params['errorCode']; } } }
二.ClientException.php
namespace app\lib\exception; use think\Exception; class ClientException extends Exception{ public $code=400; public $msg='参数错误'; public $errorCode=1000; public function __construction ($params=[]){ if(!is_array($params)){ return ; } if(array_key_exists('code',$params)){ $this->code=$params['code']; } if(array_key_exists('msg',$params)){ $this->msg=$params['msg']; } if(array_key_exists('errorCode',$params)){ $this->errorCode=$params['errorCode']; } } }
三.ExceptionHandler.php
namespace app\lib\exception; use think\Exception; use think\exception\Handle; use think\Request; class ExceptionHandler extends Handle{ private $code; private $msg; private $errorCode; public function render(Exception $e){ if($e instanceof ClientException){ //之前是BaceException //如果是自定义的异常 $this->code=$e->code; $this->msg=$e->msg; $this->errorCode=$e->errorCode; }else{ //如果是服务器端内部代码错误 if(config('app_debug')){ //使用系统内置Exception类中的render()异常处理方法,就可以显示具体的错误信息(原本调试模式就是采用这样的方式) return parent::render($e); }else{ $this->code=$e->code; $this->msg=$e->msg; $this->errorCode=$e->errorCode; $this->recordErrorLog($e); } } $request=Request::instance(); $result=[ 'msg'=>$this->msg, 'error_code'=>$this->errorCode, 'request_url'=>$request->url() ]; return json($result,$this->code); } private function recordErrorLog(Exception $e){ //log类的初始化 Log::init([ 'type'=>'file', 'path'=>LOG_PATH, 'level'=>['error'] ]); //log类的写入函数 Log::record($e->getMessege,'error'); } }
(3)设置系统异常处理走自定义类库
config.php中设置
'exception_handle'=>'app\lib\exception\ExceptionHander.php',
(4)定义服务器端异常处理系列类和客户端异常处理系列类
这里以参数错误(客户端异常处理)和请求资源没找到(服务器端异常处理)为例
1.ParameterException.php
namespace app\lib\exception; use think\Exception; class ParameterException extends ClientException{ public $code=400; public $msg='参数错误'; public $errorCode=1000; }
2.MissException.php
namespace app\lib\exception; use think\Exception; class MissException extends ServerException{ public $code=500; public $msg='请求资源没有找到'; public $errorCode=900; }
(5)使用两种系列的异常处理
$e= new ParameterException([ 'msg'=>$this->error; ]); throw $e;
阅读更多风口下的猪2019-07-16【thinkphp】
-
项目不一定是自己做,资源积累很重要
项目管理一个创业者,不应该把思维定在点上:项目要自己做,产品要尽量自己来,收益要得到控制。实际上,个人品牌化资源化是非常重要的,项目可以是送出去的,产品是可以整合的,收益可以是远期的,这样是可以积累自己人脉的。
阅读更多风口下的猪2019-06-28【项目管理】
-
tp5内置函数json是response类下的
thinkphptp5内置函数json是response类下的,也就是说其主要用于请求响应,我们知道直接return数组是有问题的,必须使用json()将数组处理,json()有两个参数,第一个是要返回的数据数组,第二个则是响应状态码,一般默认为200。
阅读更多风口下的猪2019-06-25【thinkphp】