开发经验小记: tp5 exp查询,sql分析,jq,小程序,git、右键菜单等

持续更新:【经验不定时更新】,一起学习。[所有内容都是经过测试才放上来的]

//判断上传文件的mine类型

//上传文件信息
$img = $_FILES['img'];
if ($img)
{
    //文件存放目录,和本php文件同级
    $dir = dirname(__file__);
    $filename = $img['name'];
    $tempname = $img['tmp_name'];
    $savepath = "$dir\\$filename";//这里改成你需要的存放目录
    $state = move_uploaded_file($tempname, $savepath);
    //如果上传成功,预览
    if($state)
    {
        echo "<img src='$filename' alt='$filename' /> ";
    }
    //此处获取文件类型 start  php>5.3
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $savepath);
    //此处获取文件类型 end
    
    echo $mime;
}

//验证银行卡号是否正确和判断是哪个银行
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=2227003766470038387&cardBinCheck=true

//MySQL命令行导出数据:

导出web_auto_code数据库 web_test表 >(到) test.txt文件,文件可以指定路径 eg: D:\sql\data\test.txt //经测试可以用

mysqldump -u root -p web_auto_code web_test > test.txt

//Ubuntu的Linux下定时任务

用crontab -e命令打开任务编辑,如下:

*/5 * * * * curl 'http://sss.yasndudi.com/OA/OaNotice/index'   //每5分钟定时发起一个请求

*/1 * * * * cd /www/web/www.ss.com;git pull // 每分钟更新一次代码

*/1 * * * * chown -R www-data:www-data /www/web/ //每分钟删除一次

*/1 * * * * /www/web/abc.playone.cn/task/order_warn_stask.php//每分钟执行PHP文件

然后保存重启。
提示:
启动:sudo /etc/init.d/cron start 关闭:sudo /etc/init.d/cron stop
重启:sudo /etc/init.d/cron restart 重新载入配置:sudo /etc/init.d/cron reload
可以用ps aux | grep cron命令查看cron是否已启动

//like查询慢的问题解决

//当数据量过大的时候,like效率会很低,因为它是全表扫描,用不到索引

//解决方法如下

//利用函数:instr('字段名', 'abcdefg')>0 或者 locate('abcdefg', '字段名')>0

//例子: select * from web_test where instr(title, 'abcd')>0

//例子: select * from web_test where locate('abcd', title)>0

 

//使msyql null行排在前面或后面

order by if(isnull(num),1,0), money desc; //这里的1在0前面,则表示null行始终排在前面,如果交换位置则排在后面

测试服务器:apache 设置项目别名


# setting for adminer
Alias /adminer "D:/projecs/xampp/adminer/"
<Directory "D:/projecs/xampp/adminer">
  AllowOverride AuthConfig
  Require all granted
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1

  <Files "index.php">
    SetHandler application/x-httpd-php
  </Files>

</Directory>

 

//什么时候建立索引?

答:维护索引是需要成本的,权衡查询与修改时使用索引的得失。

1、数据量少不必建;

2、一般在where,group by,join,order by后列上加;

3、在重复度低的字段上加;

//什么时候建立联合索引?

//答:A列有重复数据,B列也有重复数据,如果AB列加起来一起查询,重复度大大降低的时候可以用,否则单列索引即可。

//HttpOnly Cookie。

这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。

//apache 开启文件压缩并排除指定文件

//*注: 暂未测试,有需要的自行测试。此方案仅作备忘
//步骤1 
//打开 apache 的 "httpd.conf" 文件
//步骤2  
LoadModule deflate_module modules/mod_deflate.so//去掉前面的#号
//步骤3
<IfModule mod_deflate.c>
# 告诉 apache 对传输到浏览器的内容进行压缩
SetOutputFilter DEFLATE
# 压缩等级 9
DeflateCompressionLevel 9
#设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>

//步骤4(与步骤3 二选一)
<IfModule mod_deflate.c>
# 压缩等级 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
</IfModule>

 

//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代码
<link href="{:sysconf('browser_icon')}" rel="shortcut icon">//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);
//经验3  (TP5.1)
$sql = Db::name('web_remittanceorder')->where(['id'=>1])->fetchSql()->update(['amount'=>['exp',' amount+'.$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 实体 '&lt;'(小于)和 '&gt;'(大于)转换为字符

//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('<style>*{user-seletct: all;-webkit-user-seletct: text;}</style>');

//二: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.....

 

 

 

 

 

~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章