mysql查询订单表数和订单金额的每年每月每日统计

首先介绍几个mysql函数
FROM_UNIXTIME()函数时间戳转换时间
SELECT FROM_UNIXTIME(1588238359) AS 时间
year()获取时间的年份
SELECT YEAR(‘2020-04-30 17:19:19’) AS 年
month()获取时间的月份
SELECT MONTH(‘2020-04-30 17:19:19’) AS 月
day()获取时间的日
SELECT DAY(‘2020-04-30 17:19:19’) AS 日
下面查询统计每年的订单(createtime在数据库为时间戳)
数量
SELECT year(FROM_UNIXTIME(createtime)) 年,COUNT(*) FROM order WHERE 1 group by year(FROM_UNIXTIME(createtime))
金额
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,SUM(price) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime))

下面查询统计每年的订单(createtime在数据库为时间戳)
数量
SELECT year(FROM_UNIXTIME(createtime)) 年,COUNT(*) FROM order WHERE 1 group by year(FROM_UNIXTIME(createtime))
金额
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,SUM(price) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime))

下面查询统计每月的订单(createtime在数据库为时间戳)
数量
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,MONTH(FROM_UNIXTIME(createtime)) 月,COUNT(*) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime)),MONTH(FROM_UNIXTIME(createtime))
金额
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,MONTH(FROM_UNIXTIME(createtime)) 月,SUM(price) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime)),MONTH(FROM_UNIXTIME(createtime))

下面查询统计每日的订单(createtime在数据库为时间戳)
数量
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,MONTH(FROM_UNIXTIME(createtime)) 月,DAY(FROM_UNIXTIME(createtime)) 日,COUNT(*) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime)),MONTH(FROM_UNIXTIME(createtime)),DAY(FROM_UNIXTIME(createtime))
金额
SELECT YEAR(FROM_UNIXTIME(createtime)) 年,MONTH(FROM_UNIXTIME(createtime)) 月,DAY(FROM_UNIXTIME(createtime)) 日,,SUM(price) FROM order WHERE 1 GROUP BY YEAR(FROM_UNIXTIME(createtime)),MONTH(FROM_UNIXTIME(createtime)),DAY(FROM_UNIXTIME(createtime))

发表在 mysql, PHP | 留下评论

解决 github 打开慢或者打不开问题

今天使用github突然打不开,打开也非常慢,就在网上找了一下解决方法

首先看看自己是什么环境,Linux/windows

我的是windows

  1. 打开C:\Windows\System32\drivers\etc
  2. 目录里面的打开hosts文件(若为linux系统,则定位到/etc/hosts)
  3. 在hosts文件最后添加
192.30.253.113 github.com
192.30.253.113 github.com
192.30.253.118 gist.github.com
192.30.253.119 gist.github.com

4.保存文件,之后再刷新网站就可以使用了

 

 

发表在 github, 其他 | 留下评论

微信小程序底部菜单路径(tabBar)在页面内部跳转相同不能跳转

app.json
{
“tabBar”: {
“list”: [{
“pagePath”: “index/index”,
“text”: “首页”
},{
“pagePath”: “index/other”,
“text”: “其他”
}]
}
}

方法一
other.wxml
<view bindtap=”ceshi”>切换到首页 </view>
other.js
ceshi: function (){
wx.switchTab({
url: ‘/index/index’
})
},
方法二
other.wxml
注意只有tabBar的链接才能使用 open-type=”switchTab”,正常页面可以使用redirect,navigate,reLaunch
<navigator url=”/index/index” open-type=”switchTab”>切换到首页</navigator>

发表在 小程序 | 留下评论

微信小程序使用缓存进行计次缓存过期

发表在 小程序 | 留下评论

PHPExcel导出实例

首先到https://github.com/PHPOffice/PHPExcel下载PHPExcel,自行用git下载。

/**
* @param $data array 具体数据
*
* @param $title array 第一行的数据
*
* @param $filename string 文件名称
*
*/

public function exportexcel($data = array(), $title = array(), $filename = ”)
{
require_once MODULE_ROOT . ‘/model/Classes/PHPExcel.php’;
require_once MODULE_ROOT . ‘/model/Classes/PHPExcel/IOFactory.php’;
require_once MODULE_ROOT . ‘/model/Classes/PHPExcel/Writer/Excel2007.php’;
ob_end_clean();

if(empty($filename)) $filename = time();
if(!is_array($title)) return false;
$header_arr = array(‘A’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’M’, ‘N’,’O’,’P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,’X’,’Y’,’Z’);

$objPHPExcel = new PHPExcel(); //初始化PHPExcel()

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);//设置保存版本格式
$filename = $filename.’.xlsx’;

$objActSheet = $objPHPExcel->getActiveSheet();
foreach ($title as $k => $v) {
$objActSheet->setCellValue($header_arr[$k].’1′, $v);
}
$startRow = 2;
foreach ($data as $row) {
$e=0;
foreach ($row as $key => $value){
$objActSheet->setCellValue($header_arr[$e].$startRow, $value);
$e++;
}
$startRow++;
}
header(“Pragma: public”);
header(“Expires: 0”);
header(“Cache-Control:must-revalidate, post-check=0, pre-check=0”);
header(“Content-Type:application/force-download”);
header(“Content-Type:application/vnd.ms-execl”);
header(“Content-Type:application/octet-stream”);
header(“Content-Type:application/download”);;
header(‘Content-Disposition:attachment;filename=’.$filename.”);
header(“Content-Transfer-Encoding:binary”);
$objWriter->save(‘php://output’);
}

发表在 PHP | 留下评论

PHP缓存区output_buffering分析和实际应用

在php.ini里面output_buffering的默认是on

php输出之后不会立马输出,而是先到达buffer(缓存区),当buffer满了或者运行完毕之后才将数据输出出去
<?php
echo 1;
echo “<hr/>”;
$buffer = ob_get_contents();//只是得到输出缓冲区的内容,但不清除它
echo $buffer;

默认情况下
PHP进行输出(echo,var_dump,print_r)->PHP缓存->系统缓存(apache、nginx)->浏览器缓存->浏览器显示
echo->php buffer->webServer buffer->browser buffer->browser display
上面程序这时输出
1
1

关闭了output_buffering
echo->webServer buffer->browser buffer->browser display
上面程序这时输出而不输出缓存中的信息
1
当然可以通过ob_start();进行手动开启
<?php
ob_start();
echo 1;
echo “<hr/>”;
$buffer = ob_get_contents();//只是得到输出缓冲区的内容,但不清除它
echo $buffer;
上面程序这时输出
1
1

在php.ini里面output_buffering(开启情况下)的默认值是4096(4kb)
可以使用ob_start()手动激活php buffer,这样即使超过4kb也不会输出到浏览器中,而是输出到buffer
可以使用ob_end_flush()或者ob_end_clean() 关闭输出到buffer

ob_end_flush()
只是把PHP缓冲区中的数据发送到客户端浏览器,调用之后
PHP缓冲区中的数据依然存在,ob_get_contents()依然可以获取PHP缓冲区中的数据拷贝

ob_clean_clean()
将PHP缓冲区中的数据删除,但不发送给客户端。

实际应用中
1.静态文件的缓存
有很多程序后台都会有生成首页文件,生成静态化文件等功能
适合不经常更改数据,需要反复读取数据页面
这样可以使用户直接读取静态文件而不需要通过PHP处理业务
2.header,session,cookie
<?php
echo 1;
header(“content-type:text/html;charset=’utf-8′”);//session_start() SetCookie()
//在程序中echo 1;已经给浏览器发送了一个头部信息,当运行到header()就会继续发送并更改了之前头部的信息

<?php
ob_start();
echo 1;
header(“content-type:text/html;charset=’utf-8′”);
当使用ob_start()之后就会把echo 1;的输出信息到了buffer中,页面结束之后吧缓存按照http协议返回给浏览器

3.文件下载
很多时候回使用PHP下载文件比如数据导出,如果是大文件,需要读入到内存传输给用户,这样会导致响应时间变长
使用缓存进行一部分一部分的读取之后进行缓存最后进行传输,这样可以降低内存,浏览器持续接收数据

发表在 PHP | 留下评论

微信第三方公众平台开发流程(公众号)

1.拿到ticket(每隔10分钟,有效时间比两个小时长)
2.根据ticket拿到component_access_token(有效时间2小时)
3.根据component_access_token拿到授权码pre_auth_code(有效时间10分钟)
4.生成授权二维码
5.管理员确定
6.判断是否授权确认
7.判断是否授权过
8.创建数据表
一,微信开发平台接入
1.在开放平台上绑定公众号,绑定之后可以在不同公众号获取相同unionId功能

2.开放平台接入第三方应用,可以脱离公众号开发,扩展第三方应用

填写基本信息

勾选赋予权限

开发配置,关联的公众号取上面添加的公众号原始ID

授予开放平台账号权限

授权接入文档(获取授权码):https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=5af6f1174c1e2e443b02f7a5c49238b854815352&lang=

注:redirect_uri=不带http的应用调用域名,和2中配置的授权回调域名保持一致

4.后台程序调用授权接口生成授权二维码

5.公众号管理员扫码确认绑定(使用页面扫码授权方式处理)

6.后台程序可以获取code->access_token->openid

发表在 公众号 | 留下评论

微信第三方平台授权流程

1,获取第三方平台access_token
http请求方式: POST(请使用https协议)
POST数据示例:
{
“component_appid”:”appid_value” ,
“component_appsecret”: “appsecret_value”,
“component_verify_ticket”: “ticket_value”
}
返回结果示例
{
“component_access_token”:”61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA”,
“expires_in”:7200
}
2,获取预授权码
http请求方式: POST(请使用https协议)
POST数据示例:
{
“component_appid”:”appid_value”
}
返回结果示例
{
“pre_auth_code”:”Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw”,
“expires_in”:600
}
3,引导进入授权页面
在任何一个html或者jsp页面,加一个按钮,按钮的响应地址为:
该网址中第三方平台方需要提供第三方平台方appid、预授权码和回调URI
4,授权后回调URI,得到授权码和过期时间
授权流程完成后,会进入回调URI,并在URL参数中返回授权码和过期时间(redirect_url?auth_code=xxx&expires_in=600)
5,使用授权码换取公众号的授权信息
接口调用请求说明
http请求方式: POST(请使用https协议)
POST数据示例:
{
“component_appid”:”appid_value” ,
” authorization_code”: “auth_code_value”
}
返回结果示例
{
“authorization_info”: {
“authorizer_appid”: “wxf8b4f85f3a794e77”,
“authorizer_access_token”: “QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM”,
“expires_in”: 7200,
“authorizer_refresh_token”: “dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY”,
“func_info”: [
{
“funcscope_category”: {
“id”: 1
}
},
{
“funcscope_category”: {
“id”: 2
}
},
{
“funcscope_category”: {
“id”: 3
}
}
]
}

发表在 公众号, 小程序 | 留下评论

商品每日每周每月排序redis

//实例化链接redis
$redis = new Redis();
$redis->connect(‘127.0.0.1’, 6379);
//设置时区
date_default_timezone_set(‘Asia/Shanghai’);
$day = mktime(23, 59, 59, date(“m”), date(“d”), date(“Y”));
//设置每天信息
//$redis->lPush(‘goods_day’, $id);
$redis->sadd(‘goods_day’, $id);//list lPush  可以包含相同的值, Set sadd值只能是唯一
$redis->expireAt(‘goods_day’, $day);//有效时间
$redis->incr(‘goods_day_score_’.$id);//每次加载加1
$redis->expireAt(‘goods_day_score_’.$id, $day);//有效时间
$redis->set(‘goods_day_data_’.$id, json_encode($goods));//添加商品信息只能存字符串所以需要 json
$redis->expireAt(‘goods_day_data_’.$id, $day);//有效时间
//设置每周信息
$week = mktime(23,59,59,date(“m”),date(“d”)-date(“w”)+7,date(“Y”));
//$redis->lPush(‘goods_week’, $id);
$redis->sadd(‘goods_week’, $id);//list lPush  可以包含相同的值, Set sadd值只能是唯一
$redis->expireAt(‘goods_week’, $week);
$redis->incr(‘goods_week_score_’.$id);/*加一*/
$redis->expireAt(‘goods_week_score_’.$id, $week);
$redis->set(‘goods_week_data_’.$id, json_encode($wallpaper));
$redis->expireAt(‘goods_week_data_’.$id, $week);
//进行读取数据
$sort[‘BY’] = ‘goods_week_score_*’;//排序字段
$sort[‘limit’] = array(($pindex – 1) * $psize, $psize);//分页
$sort[‘SORT’] = ‘DESC’;//排序方法
$sort[‘GET’] = ‘goods_week_data_*’;//获取数据内容
$res = $redis->sort(‘goods_week’,$sort);//获取数据
foreach($res as &$k){
 $k = json_decode($k,true);//数据处理
}
return $res;//获取信息

发表在 redis | 留下评论

manifest.xml说明

<!–定义模块的基本设置属性–>
<application setting=”true”> 保存此模块需要的配置参数
<name><![CDATA[文章评论]]></name> 模块的名称
<identifie><![CDATA[lm_comment]]></identifie> 模块的标识
<version><![CDATA[0.1]]></version> 模块的版本
<type><![CDATA[business]]></type> 模块的类型
(business(主要业务),customer(客户关系),activity(营销及活动),services(常用服务及工具),other(其他))
<ability><![CDATA[给微擎自带的CMS添加评论功能]]></ability> 模块的简述
<description><![CDATA[给微擎自带的CMS添加评论功能]]></description> 模块的详细描述
<author><![CDATA[phillo]]></author> 模块的作者
<url><![CDATA[http://bbs.we7.cc/]]></url> 模块发布的链接
</application>

<platform>
<!–定义此模块需要订阅的事件–>
<subscribes>
<message type=”text” /> 可以处理文字状态
<message type=”image” /> 可以处理图片状态
<message type=”voice” /> 可以处理音频状态
<message type=”video” /> 可以处理视频状态
<message type=”shortvideo” /> 可以处理短视频状态
<message type=”location” /> 可以处理定位状态
<message type=”link” /> 可以处理链接状态
<message type=”subscribe” /> 可以处理关注状态
<message type=”unsubscribe” /> 可以处理取关状态
<message type=”qr” /> 可以处理二维码状态
<message type=”trace” /> 可以处理视频类型
<message type=”click” /> 可以处理点击状态
<message type=”view” /> 可以处理事件类型
<message type=”merchant_order” /> 可以处理订单类型
</subscribes>
<!–定义此模块需要处理的事件–>
<handles>
<message type=”text” />
<message type=”image” />
<message type=”voice” />
<message type=”video” />
<message type=”shortvideo” />
<message type=”location” />
<message type=”link” />
<message type=”subscribe” />
<message type=”qr” />
<message type=”trace” />
<message type=”click” />
<message type=”merchant_order” />
</handles>
<!–定义此模块是否需要规则触发–>
<rule embed=”false” /> 定义此模块是否需要消息处理,规则路由
<card embed=”false” /> 定义此模块是否需要封面路由
</platform>

<!–定义模块在左侧本模块菜单下拉列表中的附加菜单操作–>
<bindings>
<menu>
<entry title=”评论列表” do=”CommentsList” state=”” direct=”false” />
<entry title=”文章风格列表” do=”Display” state=”” direct=”false” />
</menu>
<profile>个人中心导航链接
<entry title=”我的” do=”my” state=”” direct=”false”/>
<entry title=”提交记录” do=”myrecord” state=”” direct=”false”/>
</profile>

</bindings>

<install><![CDATA[]]></install> 安装模块需要执行的文件或者操作
<uninstall><![CDATA[]]></uninstall> 卸载模块需要执行的文件或者操作
<upgrade><![CDATA[]]></upgrade> 更新模块需要执行的文件或者操作

微擎在安装或卸载模块时会根据manifest.xml生成(或删除)数据库中相应记录,并执行manifest.xml里指定的脚本。

manifest.xml文件内容详细介绍如下:

manifest – xmlns *(新增)*
用来为此模块XML的命令空间,此处必须填写”[http://www.we7.cc](http://www.we7.cc/)”.

manifest – versionCode
用来说明当前模块适用于哪个版本的微擎, 用来保证模块的兼容性. 多个支持的版本请使用逗号隔开.

manifest – application 用来定义模块的基本设置属性
manifest – application – setting 用来说明此模块是否有针对模块的设置项, 设置项可以保存此模块需要的配置参数(此参数针对不同的公众号分别保存)

manifest – application – name
模块的名称

manifest – application – identifie
模块标识符, 应对应模块文件夹的名称, 微擎系统按照此标识符查找模块定义

manifest – application – version
模块当前版本, 此版本用于模块的版本更新

manifest – application – type *(新增)*
模块的类型,方便在左侧菜单中归类与显示, 目前分为 business(主要业务),customer(客户关系),activity(营销及活动),services(常用服务及工具),other(其他)

manifest – application – ability
模块功能描述, 使用简单的语言描述模块的作用, 来吸引用户

manifest – application – description
模块详细描述, 详细介绍模块的功能和使用方法

manifest – application – author
模块的作者, 留下你的大名吧

manifest – application – url
模块的发布页, 可以通过这个url来访问你的模块最新情况

manifest – platform
用来定义模块用以处理公众平台消息的设置项

manifest – platform – subscribes
消息订阅器定义(消息订阅器提供了一种处理公众平台消息的方式, 可以接受到指定类型的消息, 来进行分析和统计, 不能用以处理消息返回结果. 这种处理是并行的, 同一个消息会被每一个订阅它的模块接收到)

manifest – platform – subscribes – message
定义需要被订阅器订阅的消息类型, 这里的消息被 WeModuleReceiver 处理

manifest – platform – handles
消息处理器定义(消息处理器用于接收公众平台的消息, 并返回相应的处理结果. 这种处理是互斥的, 同一个消息只能从一个模块返回处理结果)

manifest – platform – handles – message
定义需要被处理器处理的消息类型, 这里的消息被 WeModuleProcessor 处理

manifest – platform – rule *(变更)*
定义此模块是否需要规则触发

manifest – platform – rule – embed
当前模块进行消息处理时需要定义规则, 是否使用规则路由. (使用规则路由必须要能处理text类型消息, handles节点中必须包含 )

manifest – bindings *(新增)*
定义此模块的封面,管理菜单,微站菜单及规则扩展菜单

manifest – bindings – cover
定义模块的封面入口,封面入口为单条图文信息即是模块需要对用户开放的**入口地址**.

manifest – bindings – cover – call
定义模块动态扩展菜单项, 此值对应 WeModuleSite 类中的方法, 返回的值结构与entry相同, 将成为此节点的菜单项.

manifest – bindings – cover – entry
模块绑定菜单的定义结构. 需要定义 title – 操作的名称, do – 模块操作入口, state – 附加的用户参数(定义于WeModuleSite)

manifest – bindings – rule
定义规则的附加操作, 每个entry代表一个附加操作.

manifest – bindings – menu
定义模块在左侧本模块菜单下拉列表中的附加菜单操作, 每一个entry代表一个菜单操作.

manifest – bindings – home
定义模块在微站首页的扩展菜单项, 每一个entry代表一个微站首页菜单项.

manifest – bindings – profile
定义模块在微站个人中心的扩展菜单项, 每一个entry代表一个微站个人中心菜单项.

manifest – bindings – shortcut
定义模块在微站快捷菜单的扩展菜单项, 每一个entry代表一个微站快捷菜单项.

manifest – install
安装执行脚本, 这里支持两种形式: php脚本和sql语句. 如果安装时只需要写入数据库相关内容, 可以在此直接定义sql语句. 也可以使用php文件, 例如: install.php 代表执行模块定义目录下的 install.php

manifest – uninstall
卸载执行脚本, 参上

manifest – upgrade
升级执行脚本, 参上