月度存档: 5 月 2020

数据库备份还原命令

备份数据库
mysqldump -hhost -u admin -padmin mydb > 20180803.sql   
还原数据库
mysql -hhostname -uadmin -padmin mydb < 20180803.sql

高效更新wordpress

如何高效更新wordpress,尤其在ftp连接不上的情况下

WP-CLI是官方推出的一款 WordPress 命令行工具。无需浏览器,你就可以实现快速安装、更新主题、配置站点、搜索替换等几乎所有可以想到的功能。

如何安装 WP-CLI 这里不做说明,请移步https://make.wordpress.org/cli/handbook/installing/ 查看官方安装指南。

假如你已经安装好了 WP-CLI,那么首先通过 
wp core check-update
命令获取新版的安装包地址,然后通过自己的途径下载并放到服务器上。
最后执行 
wp core update path/to/zip/file
命令升级 WordPress,输出的内容和你通过网页升级类似。

yii2对接支付宝

主要遇到三个问题:

1 如何引入支付宝的php库

1.1 把下载下来的文件放入web目录下的ali文件夹,然后控制器引入

require_once(“ali/pagepay/service/AlipayTradeService.php”);
require_once(“ali/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php”);

1.2.config配置文件可以直接写在config/params.php里,控制器里用

$config = Yii::$app->params["config"];引用配置文件

<?php
    //config/params.php
return [
    'adminEmail' => 'nbllq@qq.com',
    //'alldata' => 'test'
    "config" => [   
        //应用ID,您的APPID。
        'app_id' => "your id",

        //商户私钥
        'merchant_private_key' => "your key",

        //异步通知地址
        'notify_url' => "外网地址",

        //同步跳转
        'return_url' => "本地地址",

        //编码格式
        'charset' => "UTF-8",

        //签名方式
        'sign_type'=>"RSA2",

        //支付宝网关
        'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",

        //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        'alipay_public_key' => "your key",
]
];

1.3 $aop = new \AlipayTradeService($config); 注意前面的\,如果不加会报错

2. 页面传递给支付宝乱码

解决方法:控制器对应的php文件编码格式改成无bom的utf-8

3.官方的return_url.php验签成功,但是移植到控制器中验签失败

主要是yii2框架的url路由规则影响的,其他框架可能不会有这个问题
解决方法:开启url美化或者把传递的参数中r=对应的控制器参数去掉后再传递,参考代码:

    public function actionAlireturnurl()
    {   
        header("Content-Type: text/html;charset=utf-8");

        $arr = Yii::$app->request->get();
        $rc=array_shift($arr); //!!!!去除r控制器参数,不然验sign会失败!!!!!!花了我一天时间找这个bug,fuck!
        //$alipaySevice = new \AlipayTradeService(Yii::$app->params["config"]); 
        //$result = $alipaySevice->check($arr);
        $config = Yii::$app->params["config"];
        $aop = new \AlipayTradeService($config);
        $result = $aop->check($arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
        4、验证app_id是否为该商户本身。
    */

    //  print_r($arr2);
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);

            //支付宝交易号
            $trade_no = htmlspecialchars($_GET['trade_no']);

            //交易金额
            $total_amount =htmlspecialchars($_GET['total_amount']);

            echo "ok";

            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——


            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";
        }

    }

吐槽下支付宝的沙箱环境

沙箱账户的查看页面居然只支持ie,实在没有想到大厂前端没有做浏览器兼容,我还在chrome上傻乎乎的等了几天,以为沙箱环境抽风出不来,强烈吐槽~

linux下批量修改文件名

网上找了一堆资料,用来比较方便的rename
rename "s/oldstring/newstring//g" *
这个适合oldstring不是变量的情况,如果想用变量怎么弄,那就用shell了,直接在控制台输入

for((i=1;i<=9;i++))
do 
  mv oldname$i newname$i
done

这样比python,php之类的方便多了,给自己的小机灵赞一个~

php 批量重命名文件

如何用php批量重命名文件

/**
 * php 批量重命名文件
 *
 * @return void
 */
function renamefiles()
{
    $paths = "/path";
    $d = dir($paths);
    while (false !== ($entry = $d->read())) {

        if($entry == '.' || $entry == '..'){

        } else {

        }

        if(strpos($entry, '.mp4')){
            // echo $paths.$entry;
            // echo "原 ".$entry;

            echo "<br>";

            // $newname = strtr($entry, '-t=18121111.htm', '');  
            /*把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":
                echo str_replace("world","Shanghai","Hello world!");
                substr(string,start,length)*/

            $newname = substr($entry, 0, 2).".mp4";

            echo $newname;

            echo "<br>";       

            rename($paths.$entry, $paths.$newname);
        }


    }
    $d->close();
    echo "done";
}

linux移动文件夹中前10个文件

linux移动文件夹中前10个文件

linux复制文件夹中前10个文件
ls |head -n 10 |xargs -i cp -r {} /target
linux移动文件夹中前10个文件
ls |head -n 10 |xargs -i mv {} /target

php解析html

simplehtmldom
https://simplehtmldom.sourceforge.io/

gitbook一种分布式写作方式

参考:
GitBook文档(中文版)
GitBook 从懵逼到入门

mysql流程控制

流程控制一般三种:顺序,分支,循环

分支

1.if函数

语法:if(exp1,exp2,exp3)
执行顺序:
如果表达式1即exp1成立,则if函数返回表达式2即exp2的值,否则返回表达式3即exp3的值

2.case结构

语法:case [变量|表达式|字段]#区间判断的时候省略
when 要判断的值或要判断的条件1 then 返回值1或语句1;
when 要判断的值 then 返回值2或语句2;
when 要判断的值 then 返回值3或语句3;

else 要返回的值n
END CASE;
与其他语言相比,没有break,但是;默认和break功能一样

#case案例
create procedure test_case(IN score INT)
begin
    case
    when score>=90 and score<=100 then select 'a';
    when score>=80 then select 'b';
    when score>=60 then select 'c';
    else select 'd';
    end case;
end $

3.if结构

语法:
if 条件1 then 语句;
elseif 条件2 then 语句2;
[else 语句n;]
end if
只能在begin end里用

#if结构案例
create function test_if(score INT) returns char
begin
    if score>=90 and score<=100 then return 'a';
    elseif score>=80 then return 'b';
    elseif score>=60 then return 'c';
    else return 'd';
    end if;
end $

4.循环

分类:while,loop,repeat
控制:iterate类似continue:结束本次循环,进入下一次,
leave类似break:结束当前所在循环

1.while语法

[标记:] while 条件 do 循环体;
end while [标记];

2.loop语法

[标记:] loop
循环体;
end loop [标记];
用来模拟简单的死循环

3.repeat语法

[标记:] repeat
循环体;
until 结束循环的条件
end repeat [标记];

#while案例:根据传入次数n,向table1插入n条记录
##没有返回值,所以用procedure而不用function
create procedure pro_while1(IN insertCount INT)
begin
    declare i int default 1;
        while i<=insertCount do
        insert into table1(name)values(concat("a1",i));
        set i=i+1;
    end while;
end $

call pro_while1(3)$
#leave案例:根据传入次数n,向table1插入n条记录,如果次数>=20,则停止
##没有返回值,所以用procedure而不用function
truncate table table1$
drop procedure pro_while1$
create procedure pro_while1(IN insertCount INT)
begin
    declare i int default 1;
        label1:while i<=insertCount do
        insert into table1(name)values(concat("a1",i));
        IF i>=20 then leave label1;
        end IF;
        set i=i+1;
    end while label1;
end $

call pro_while1(3)$
#iterate案例:偶数次插入
create procedure pro_it(IN count INT)
begin
    declare i int default 0;
    a:while i<count do
        set i=i+1;
        if mod(i,2)!=0 then
                iterate a;
        end if;
        insert into table1(name)values(concat("a1",i));
    end while a;    
end$