作者: ethan

  • mysql多表组合查询

    背景

    因业务数据量太大,所以正常业务场景仅支持进一个月的数据, 数据表: tb, 历史30天前的数据,一次存入备份表tb_202006tb_202005,。。。

    现,需求,后台不仅支持tb表的查询,还要根据时间范围查询备份表的数据

    解决

    select * from tb where [查询条件] union select * from tb_202006 where [查询条件] order by id desc limit 0, 100

    通过union语句,将多表数据累加在一起,统一order, limit。

    业务场景中,根据筛选的时间范围,确定需要累加的所有数据表,然后进行sql组装即可

  • 获取两个时间点间的所有月份

    背景

    业务场景中,涉及到查备份表,因此需要根据时间范围,确定需要查哪些备份表,就涉及到,根据两个时间点,获取其间所有月份的需求

    解决

            $month = [ ];
            for (  ; $begintime <= $endtime ; $begintime = strtotime('+1 month', $begintime) ) {
                $month[] = date ( "Ym" , $begintime );
            }
            $endMonth = date("Ym", $endtime);
            if (!in_array($endMonth, $month)) {
                $month[] = $endMonth;
            }

  • php empty判断’0’与”

    问题

    今天线上出现一个bug, 用户昵称是’0’的,展示为空

    原因

    原因是以下判断逻辑:

    $name = !empty($userInfo['name']) ? $userInfo['name'] : ''

    很随手写的逻辑,但却隐藏着一个大坑。

    当$userInfo[‘name’] = ‘0’时,该语句的结果 $name = ”, bug就这么出现了。

    解决

    代码修改:

    $name = isset($userInfo['name']) ? $userInfo['name'] : ''

  • sql匹配中文,完美

    匹配中文sql

    select id,text from test where hex(text) REGEXP 'e[4-9][0-9a-f]{4}' limit 20

    sql解读

    hex会把字符串中的每一个字符转换成两个16进制数
    我是你爷爷的爷爷 => E68891 E698AF E4BDA0 E788B7 E788B7 E79A84 E788B7 E788B7

    中文utf8编码区间:\u4e00-\u9fa5 –> e4b880-e9bea5 –> e[4-9][0-9a-f]{4}

  • 两台电脑连同一个显示器

    前端时间,因为新买了一台电脑,但是因为已经有显示器,感觉再买一个很多余,但是总不能每次都自己手动拔插线吧,所以就网上查了查,发现了还真有一个专门解决这个问题的神器,这里跟大家分享下:

    VGA二进一出切换器

    VGA二进一出切换器,从上图中可以看到,我们可以把多台电脑的VGA线插到转换器上,而转换器上的线插到我们的显示器上,同时VGA上有一个切换按钮,只要点击按钮,显示器显示的内容就会自动在两条电脑间切换了。

    当然,除了VGA二进一出切换器,还有四进一出等等,看具体需求,有的切换器上还带有键盘鼠标插口,可以同时实现,键盘鼠标控制的

  • php:file_get_content() ssl报错

    今天再开发时,发现利用file_get_content() 获取https的文件内容时,获取不到内容,会报ssl 错误

    file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

    查了相关资料,解决方法,如下,即去掉 file_get_contents() 函数的证书校验

    $opts = [
        "ssl" => [
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ]
    ];  
    
    $response = file_get_contents("https://www.example.com",false, stream_context_create($opts));
  • 钟摆,你失忆了吗?

    今天读了欧·亨利的一篇短篇小说《钟摆》。

    故事的内容讲述的内容很简单,就是一直忽视妻子的丈夫,在妻子突然不在的时候,幡然醒悟自己的幸福生活不能够没有妻子,想起了妻子的一切美好,以及对自己多年行为的愧疚,但当妻子回来后,刚才回忆的美好,心中的愧疚突然就烟消云散,以前怎样现在还是怎样。

    故事很简单,讲述的却基本是我们每个人都有过的,或者可以说是我们的某种劣根性的存在——只有当失去了才会知道美好,而当失而复得时却又再次忘去了美好。

    我们的内心就像小说的名字一样,“钟摆”,总是在摇摆不定,也许前一刻你还在为某件事后悔,难过,自责,但当重新有机会再去弥补的时候,却还是与以往并没有任何的改变。

    想象一下,是否曾经有过无数个时刻,也许是因为各种因素的触发,突然间感觉脑子一下清醒过来,回顾往昔,自惭自愧,下定决心,改过自新,但没过多久就好像清醒的脑袋一下子浑噩失忆了一般,和以往并没有任何改变,如此这般循环往复,这也许就是我们的劣根性吧!

    并不是劝诫,因为笔者本人也并没有克服掉这种劣根性,但笔者希望在此清醒的时刻,记录下这些心中的想法,防止自己再次“失忆”,同时也希望此时很多处于“失忆”状态的朋友,能够暂时的“回忆”起一些东西,即便只是一点点也是好的,希望大家不要再做一个“钟摆”了。

    与君共勉!

  • php 远程图片转base64

    业务中涉及到物理删除图片,需要将原始图片以base64的方式存储下来

    $imageInfo = getimagesize($picUrl);
    $content = file_get_contents($picUrl);
    $base64Data = 'data:' . $imageInfo['mime'] . ';base64,' . base64_encode($content);

  • php file_get_contents下载优化

    业务中需要下载文件,原先用的file_get_contents方式,导致下载接口超时报错。

    问题

    下载接口超时报错

    原因

    echo file_get_contents($down_url);

    通过echo file_get_contents()方式,速度过慢

    解决

    利用 readfile() 函数替代 file_get_contents()

    readfile($url) 等价于 echo file_get_contents($url)

  • php explode空字符串误解

    记录一个关于php explode的误解
    
    $a = '';
    $b = explode(',', $a);
    问,$b是空数组吗?
    
    答案: 不是

    举例

    <?php
    
    $a = '';
    $b = explode(',', $a);
    
    var_dump($b);
    if (!empty($b)) {
        var_dump('not empty');
    } else {
        var_dump('is empty');
    }

    输出:

    array(1) {
    [0]=>
    string(0) ""
    }
    string(9) "not empty"

    解决:

    array_filter 可过滤掉数组空值(false, null, ''), 当然也可自定义过滤方式。
    <?php
    
    $a = '';
    $b = explode(',', $a);
    
    $b = array_filter($b);
    
    var_dump($b);
    if (!empty($b)) {
        var_dump('not empty');
    } else {
        var_dump('is empty');
    }

    输出:

    array(0) {
    }
    string(8) "is empty"