持续更新:【经验不定时更新】,一起学习。
//HttpOnly Cookie。
这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。
//apache 开启文件压缩并排除指定文件
//*注: 暂未测试,有需要的自行测试。此方案仅作备忘
//步骤1
//打开 apache 的 "httpd.conf" 文件
//步骤2
LoadModule deflate_module modules/mod_deflate.so//去掉前面的#号
//步骤3
# 告诉 apache 对传输到浏览器的内容进行压缩
SetOutputFilter DEFLATE
# 压缩等级 9
DeflateCompressionLevel 9
#设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
//步骤4(与步骤3 二选一)
# 压缩等级 9
DeflateCompressionLevel 9
# 压缩类型 html、xml、php、css、js
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
AddOutputFilter DEFLATE js css
//js阻止事件执行
//1 阻止冒泡
event.stopPropagation();
//2 阻止默认事件
event.preventDefault();
//3 return false
//jq一个好用的方法:siblings(备忘)
//(siblings)老喜欢忘记,把你记下来总不会忘记了吧
$(obj).attr('checked', true).siblings().attr('checked', false);
//要点:元素必须是同级(兄弟节点)
//架构小学习
//设计架构时,在全面性上要充分考虑。
//在技术选型上对技术细节是要有很强的掌控力.
//对于一个架构师来说,知识面的广是非常重要的,或者是在设计时对未来有一定的考虑也是非常重要的。(前瞻
性不是说一定要一开始就把未来可能会出现的问题就解掉,而是应该留下不需要整个改造就可以解掉的方法,这点
对于架构师来说也是非常重要的)
//设计时的全面性要非常的好,我现在一般更多采用的方式是推演上线后的状况,一般来说在脑海里过一遍会比较
容易考虑到这些问题。
//技术细节的掌控非常重要,同时决策力也是非常重要的。
//减少犯错误的方法:多阅读、多实践、多总结。
//Trace的重要性,如果在最初就考虑到,那么在一开始就可以留好口子埋好伏笔,后面再要做完整就不会太复杂。
//要注意的是,其实不代表架构师自己要完全什么都很懂,但架构师应该清楚在某个点上靠谱的人是谁。
//git清空账号密码
//1、【手动】控制面板\用户帐户和家庭安全\凭据管理: windows凭据;删除对应的凭据即可
//2、【代码】在PHPStorm控制台(或git管理器中)输入:
git config --system --unset credential.helper 回车。
[小情景]:有一次git修改密码之后 PHPStorm就出现access denied(权限拒绝),改了很久就是未生效,结果使用以下代码重置一下,下次重新登录即可:
在PHPStorm控制台输入; git config --system --unset credential.helper 回车。
然后再次更新代码输入账号密码,其实也就是重新登录一遍。(亲手测试可用)
//Yii2 获取web.php配置信息
\Yii:$app->id // echo basic
\Yii:$app->bootstrap //['log, 'debug', 'gii']
//其它同理......
//获取数据库名称
1、$sql = 'select database() as db;'
2、解析dsn
//查询某张表的所有字段名
//查询某张表的所有字段名 web_member:表; web_auto_code:数据库;
select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns
where table_name='web_member' and table_schema='web_auto_code';
//php自定义重定向
function redirect($url){
if (!headers_sent()) {
header("Location: ".$url);
}
}
//高并发处理思路(这种是解决超发、进程安全)
1 设计字段默认值为0且不为负数
2 更新sql这么写:update test set num=num - 1
3 一旦报错就通知客户端操作失败,这时候用户就可以看到结果
//CSS 文本溢出显示 小数点“...”
//一共三句
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
//指定浏览器显示icon
//HTML代码
//browser_icon:你的icon存放路径
//tp5经验小记: exp查询
$m->where(['username'=>['exp'," = '$username' or mobile = '{$username}'"]])->find();
//前辈经验,直接在数据库加减值,防止大流量出现脏数据
//经验1
$user->save(['gems'=>['exp',' gems-'.$gems]]);
//经验2 - 可替代经验1
(new Carlist)->setInc('num',$num);
//MySQL判断某个字段的长度:
select home_page from aaa表 where char_length(trim(home_page))<10 and char_length(trim(home_page))>1;
//explain 分析sql语句
explain select * from table where fieldname = 'name' order by id limit 20;
//js cookie操作, 参考另一篇文章【研究js的cookie操作】
var cook = document.cookie // 它就是核心,以它为基础制定你的业务逻辑。
//mysql中查看安装路径
//Windows
show variables like "%char%";
//Linux
ps -ef|grep mysql
//事务回滚必须有innoDB引擎的表支持【以前遇到过怎么也无法回滚的问题,却忘了是表引擎不支持,现在又忘,特此记录】
//走支付成功流程
Db::startTrans();
try{
(new Pay())->paySuccess($u, $order, $trade_no);
Db::commit();
$this->success('强制补单结束');
}catch(\Exception $e){
Db::rollback();//需innoDB引擎才生效
$this->success('强制补单失败,'.$e->getMessage());
}
//微信签名
/**
* description:微信查询订单签名[这个除了基础api貌似可以通用]
* author:wanghua
*/
function getWxSign($param){
ksort($param);
$str = '';
foreach ($param as $key=>$val){
if(empty($val))continue;
//验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验
if($key == 'sign')continue;
$str.= '&'.$key.'='.$val;
}
$stringSignTemp = substr($str,1).'&key='.config('api_key');
$sign = strtoupper(md5($stringSignTemp));
return $sign;
}
/**
* description:微信常规签名算法[这个貌似只有基础api能用,例如:分享之前获取options需要的签名就是它]
* author:wanghua
*/
function getSignature($param){
if(!$param || !is_array($param))return false;
if(false !== strpos($param['url'], '#')){
$exp = explode('#', $param['url']);
if($param['url'])$param['url'] = $exp[0];
}
ksort($param);
$string1 = '';
foreach ($param as $k=>$v){
$string1.= $k.'='.$v.'&';
}
$string1 = substr($string1, 0, strlen($string1)-1);
$signature = sha1($string1);
return $signature;
}
//jQuery分别获取json对象的key和val,使用场景较少,记录一下
//值示例:
{
"id":33,"title":"\u4f1a\u5458\u7ba1\u7406","controller":"Member",
"dbname":"member","is_deleted":0
}
$.each(d, function (k) {
console.log(k+':'+d[k]);
});
// 磁盘空间检测
function check_disk_free_space(){
if(function_exists('disk_free_space')) {
return floor(disk_free_space(INSTALL_APP_PATH) / (1024*1024));
}else{
return false;
}
}
//js(小程序)二维数组(对象)排序(经测试:小程序里面也可以用),这里是降序
//js二维数组(对象)排序(经测试:小程序里面也可以用),这里是降序
arrArrToSort: function(data,t){
var d = [];
//降序
if(t){
for (var i=data.length-1; i>=0; i--){
d.push(data[i]);
}
}
return d;
}
// str_pad PHP填充字符串长度,左、右、两侧
$str = "Hello World";
echo str_pad($str,30,".");
//vi的撤销命令 反撤销
'u' : 撤销上一个编辑操作
'ctrl + r' : 恢复,即回退前一个命令
'U' : 行撤销,撤销所有在前一个编辑行上的操作
//TCP与UDP
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,
必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检
验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把
应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据
报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?
//测试input="datetime-local"
//input type = datetime-local
$str = '2018-10-24T00:00';//输入
var_dump($str);
$time = strtotime($str);//转为时间戳 输出:1540310400
var_dump($time);
var_dump(date('Y-m-d H:i:s', $time));//转为时间格式 输出:2016-05-01 12:12:012:01
//PHP htmlspecialchars() & htmlspecialchars_decode函数
//htmlspecialchars:把预定义的 HTML 实体 '<'(小于)和 '>'(大于)转换为字符
//htmlspecialchars_decode:反之
//JS解除浏览器禁止左右键选择和弹出菜单
//允许和禁止左键选中,方法有二(实用)
//一: css 方法
//核心属性
user-seletct: none;
-webkit-user-seletct: none;
-moz-user-seletct: none;
-ms-user-seletct: none;
//none: 不能选中内容
//text: 能选中内容
//user-seletct之all属性: 能选中内容(当所有内容作为一个整体时可以被选择。
//如果双击或者在上下文上点击子元素,那么被选择的部分将是以该子元素向上回溯的最高祖先元素)
//测试示例-允许选中:$('body').append('');
//二:js 方法
document.body.onselectstart = function(){return false;}//true允许左键选中
document.onselectstart = new Function("event.returnValue=true;");//true允许左键选中
//返回 false,不能选中
//返回 true,能选中
//允许和禁止弹出右键菜单
document.oncontextmenu = function(){return true};//false 禁止; true 允许
//经测试发现,有可能在某一行,或者某个元素上做了样式控制,也不能被选中,
//即使上面的方法都试过,解决方法就是,把这个元素上的class删除或者css删除再尝试,
//这个需要一定的功底和耐心。^ ^`
//MySQL字符串替换
update `news` set `content`=replace(`content`,' ','');//把content字段中空格替换掉
//未完待续 TODO.....
~