sql 按天分组统计问题 to_char() 函数

最近遇到一个问题,需要统计数据库中每一天的数据新增量,大家都知道可以使用 GROUP BY 对时间字段分组来实现统计每天的新增量的。关键是我我的数据库中时间字段存储的是 2016-12-16 14:21:33 这样的数据,如果直接使用这个时间字段来统计出来的是不准确的。以下原始sql语句:

SELECT pubtime, COUNT(pubtime) AS num
FROM qt_document
WHERE tid = 292
GROUP BY pubtime
ORDER BY pubtime DESC
LIMIT 10

结果看图:
没有优化


阅读全文 >>

chrome json格式化展示插件

现在面向API开发是越来越多,其中API数据交互使用JSON格式的也成为主流,在开发过程中因为JSON格式用肉眼直接判别是有些许难度的,尤其是大段大段的JSON代码,会让你找的头晕目眩。

之前我都是复制这段JSON代码,粘贴到 http://json.cn/ 这个网站上帮我格式化,大大的提高了阅读JSON代码的效率。但是由于每一次都需要在这个网站上翻译,难免有时候网络问题,或者没有网络的时候,只能眼巴巴的用记事本一点点分拆。

后来找到一款还不错的chrome插件,可以解决这个问题,这款插件在发现该页面是JSON格式的时候,会自动格式化这段JSON代码,便于我们阅读。

插件的名字是:JSONView
如果你可以访问Chrome应用商店,那就打开这个链接下载吧:Chrome应用商店
如果因为众所周知的原因访问不了,那就点击这里下载我备份的:下载地址

使用前后对比图
使用前




阅读全文 >>

PHP获取客户端IP的方法

PHP获取客户端IP的方式有很多,我这里提取了几大CMS程序获取IP的方法,然后总结整理,得到下面这个获取客户端IP地址的PHP函数,你可以直接把这个函数复制的你的项目中,在需要的地方直接调用就好了,也可以把这两个函数封装到自己的工具类里面,不过需要稍加修改。

这个获取的IP的真实性还是有一些问题的,比如如果用户使用了梯子,那么这个可能获取到的IP就是梯子的IP,而不是用户电脑的真实IP,不过对于大多啥情况下获取的IP地址是真实的,所有大可放心拿去在项目中使用。

如果你有更好的获取客户端真实IP的方法,希望你在下面的留言中分享出来,让我也见识见识真正的行家!

以下就是两个函数的代码:

/**
 * 获取用户IP
 * @return string
 */
function getIp()
{
    $ip = '未知IP';
    if(!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        return is_ip($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : $ip;
    }
    elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        return is_ip($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $ip;
    }
    else
    {
        return is_ip($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : $ip;
    }
}


/**
 * 判断是否是IP地址
 * @param $str
 * @return bool|int
 */
function is_ip($str)
{
    $ip = explode('.', $str);
    for($i=0; $i<count($ip); $i++)
    {
        if($ip[$i]>255)
        {
            return false;
        }
    }
    return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $str);
}

ThinkPHP3.2.3 递归无限分类

因为递归的效率相对来说比较低,所以很少使用,尤其是在查询数据库的时候对数据库的长时间占用很不合理。

但是递归遍历无限分类列表还是相当重要的,而且还可以对数据进行格式化处理,如果嫌弃效率问题,本人给你一个好建议就是缓存。比如当用户登录的时候判断完用户的权限后获取用户可以操作的菜单,然后递归格式化菜单分类列表,然后缓存起来,这样用户之后的操作都不会涉及到递归获取菜单,效率可以大大提升。

以下是在ThinkPHP3.2.3中使用递归遍历菜单的方法:
1.在项目的Common目录中的function.php中添加以下函数:

/**
 *
 * @param array $data 结果集
 * @param int $fid 父类ID
 * @param array $result 结果数据
 * @param int $deep 分类级数
 * @return array
 */
function getList($data, $fid = 0, &$result = array(), $deep = 0)
{
    $deep += 1;
    foreach($data as $key => $val)
    {
        if($fid == $val['fid'])
        {
            $result[$key]['id'] = $val['id'];
            $result[$key]['name'] = "|".str_repeat("--", $deep).$val['name'];
            $result[$key]['fid'] = $val['fid'];
            $this->getList($data, $val['id'], $result, $deep);
        }
    }
    return $result;
}


阅读全文 >>

Nginx配置if巧妙多条件

在Nginx的网站配置文件里面可以使用if(){}来添加判断,但是一开始我理解成了和PHP一样的语法,所以我写了如下规则:

if ( $ssl_protocol = "" && $host = keinx.com ) { return 301 https://$host$request_uri; }

但是当我重启Nginx的时候提示配置文件错误,错误的位置在"&&",后来在网上查询得到原来Nginx的配置只支持一次判断和PHP中的不一样,于是我就写了下面这种规则,就可以满足多重判断了。

set $flg a;
if ( $ssl_protocol = "" ) { set $flg "${flg}b"; }
if ( $host = keinx.com ) { set $flg "${flg}c"; }
if ( $flg = "abc" ) { return 301 https://$host$request_uri; }

然后重新启动Nginx发现没有问题了,在测试一下缺失OK,如果你遇到这样的问题,可以使用这种方法加多重判断,如果你有更好的方法请留言告诉我,谢谢!