开发经验小记: tp5 exp查询,sql分析,jq,小程序,右键菜单,linux技巧,shell技巧,mysql等

27 篇文章 0 订阅
8 篇文章 0 订阅

持续更新:【经验不定时更新】,一起学习。


uniapp使用md5

用管理员身份打开控制台,进入项目根目录,输入指令:

npm install --save js-md5

等待安装完成 ,在项目中引用:import md5 from 'js-md5';

在项目中使用:console.log(md5('123456'));


uniapp 使用weixin://dl/scan打开微信扫一扫

// uniapp 使用weixin://dl/scan打开微信扫一扫
if (plus.os.name == "iOS") {
	plus.runtime.openURL("weixin://scanqrcode")
} else if (plus.os.name == "Android") {
	var Intent = plus.android.importClass("android.content.Intent");
	var ComponentName = plus.android.importClass('android.content.ComponentName');
	var intent = new Intent();
	intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"));
	intent.putExtra("LauncherUI.From.Scaner.Shortcut", true);
	intent.setFlags(335544320);
	intent.setAction("android.intent.action.VIEW");
	var main = plus.android.runtimeMainActivity();
	main.startActivity(intent);
}
跳转百度地图导航API(替换内容)
http://api.map.baidu.com/marker?location=纬度,经度&title=定位目标&content=百度奎科大厦&output=html

Linux vim 粘贴出现带#号的文本斜着显示的情况:

用命令解决:

# 先用vim打开文本
# 然后输入命令(设置粘贴模式,就不会出现文本带#号斜着显示了)
:set paste
# 再用i命令切入insert模式
# 处理完文本后,用命令关闭粘贴模式
:set nopaste

利用shell自动备份MySQL指定数据库:

#!/bin/sh
dir=`date +%Y-%m-%d_%H:%M`
mysqldump zcc7>/home/zc/backup-${dir}.sql  -uroot

CentOS查看内网IP:

# 注意!不是ipconfig!
ifconfig -a

mysql慢日志分析:

// mysqldumpslow 
// -t(时间) 10(N秒) 
// -s(排序) t(时间) 
// -g(正则) "select"(正则匹配的内容) 
// /home/tmp/mysql/mysql_slow.log(慢日志文件所在位置)
mysqldumpslow -t 10 -s t -g "select" /home/tmp/mysql/mysql_slow.log;

 php var_export()函数

//用来显示出变量结构
var_export($array,true);//(常用于日志)

 此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。

您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。

$a = var_export($array,true) 将变量打印出来包括类型记录下来 然后输出,常用于记录日志

array (
    0 => 1,
    1 => 2,
    2 =>
    array (
        0 => 'a',
        1 => 'b',
        2 => 'c',
    ),
)

linux 文本替换:

逐个询问是否将每行中的第一个boy替换为girl

:%s/boy/girl/c


逐个询问是否将每行中的所有boy替换为girl

:%s/boy/girl/cg


没有%: 替换光标所在行 ,有%: 替换所有行 。

没有g: 只替换第一个 , 有g: 替换所有 。

没有c: 不询问是否替换 , 有c: 询问是否替换(替换多少个就会询问多少次) 。

//linux打包文件:

tar -cvf 打包后的文件名 要打包的文件(多个文件用空格隔开)

例如:tar -cvf test.zip test(这是个目录,包含了大量文件)

//linux修改文件名:

mv 原文件 新文件

例如:mv test.txt test2222.txt

//PHP判断登录的一个经验总结(tp6):

  1. 提交登录保存session,这个都会。
  2. 请求其它url,需要验证时,怎么办?以前我是在一个功能控制器里实现请求拦截,但是这样代码总是不够优秀。
  3. 总结方法:新建两个基础控制器文件,LoginController,PublicControlller,将需要登录的操作继承LoginController,不需要登陆的继承PublicController。
  4. (可选)在LoginController中加入中间件(我用的LoginCheck.php中间件类,自己命名哈),用中间件验证登录
  5. 验证到未登录时,重定向到不需要登录的PublicControlller中的redirect操作中,由它跳转到登录界面。

//grep搜索包含某文本的文件:

grep 'test' d*  #显示所有以d开头的文件中包含 test的行
grep 'test' aa bb cc    #显示在aa,bb,cc文件中包含test的行

# 例如:
grep 'error' 1616122261-19.log # 查找该文件中包含error错误关键字的行

# 非常实用
grep -C 50 'error' 1616122261-19.log #查看包含error字符串和所在上的前后50行内容

//shell脚本语法检测工具:

#命令行使用

#命令行安装也很简单(记得使用root权限),ubuntu下:
$ apt-get install shellcheck

#centos下:
$ yum -y install epel-release

#Fedora下:
$ dnf install ShellCheck

#使用方法也很简单了:
$ shellcheck myscript.sh

//linux任务的启动与停止:

# 停止
systemctl stop crond.service
# 启动
systemctl start crond.service

//Linux查看系统top -c命令查看内存使用情况

日志查看命令

#查看git.log最后100行内容

tail -n 100 git.log (n是行数)

命令功能:

用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

//CURL发起请求要带上请求协议

如:http:// 和 https://

//判断上传文件的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;
}

//验证银行卡号是否正确和判断是哪个银行(2022-03-14测试:正确的卡号验证也失败,此接口无需使用了)
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效率会很低,因为它是全表扫描,用不到索引

//解决方法如下

重写一遍:

在使用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

注意:select后面必须指定字段名,否则不能用到索引!

//使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的重要性,如果在最初就考虑到,那么在一开始就可以留好口子埋好伏笔,后面再要做完整就不会太复杂。
//要注意的是,其实不代表架构师自己要完全什么都很懂,但架构师应该清楚在某个点上靠谱的人是谁。

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

~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
编写Shell脚本来执行SQL存储过程的示例代码如下: ```bash #!/bin/bash HOSTNAME="127.0.0.1" # 数据库信息 PORT="3306" USERNAME="root" PASSWORD="pwd" DBNAME="dbname" execSql="call procedureName(DATE_FORMAT(NOW(),'%Y-%m-%d'))" echo "Begin execute procedure." mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${execSql}" echo "End execute procedure." ``` 以上代码中,首先定义了数据库的连接信息和要执行的存储过程的SQL语句。然后使用`mysql`命令连接到数据库,并执行存储过程的SQL语句。最后输出执行结果。 请注意,上述代码中的`procedureName`是一个占位符,你需要将其替换为实际的存储过程名称。另外,还需要将`HOSTNAME`、`PORT`、`USERNAME`、`PASSWORD`和`DBNAME`替换为实际的数据库连接信息。 希望以上代码对你有帮助! #### 引用[.reference_title] - *1* [用shell脚本执行mysql存储过程小记](https://blog.csdn.net/wowtous/article/details/42026201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [shell调用MySQL存储过程的问题](https://blog.csdn.net/qq_22473611/article/details/107822134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SDL大华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值