日常笔记 2018.03.27-2018.08.02
1、tp5实现 (A and B ) or (C and D)
$where1 = "";
$where2 = "";
if($user['position_id'] == 27){//财务
$where1 = function($query)use($service_id){
$query->where([
'd.finance_public_id' =>['=',$service_id],//销售提交用户续费
'cr.renew_status'=>['in','0,1,2'],
]);
};
$where2 = function($query)use($service_id){
$query->where([
'de.finance_public_id' => ['=',$service_id],//客服提交媒体续费
'cr.renew_status'=>['in','4,5,6'],
]);
};
// $whereor = [
// 'de.finance_public_id' => ['=',$service_id],//客服提交媒体续费
// 'cr.renew_status'=>['in','4,5,6'],
// ];
}
$result = Db::table('think_user')->where(function ($query) {
$query->where('id', 1)->whereor('id', 2);
})->whereOr(function ($query) {
$query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp');
})->select();
->where($where1)
->whereOr($where2)
2、删除和创建索引
ALTER TABLE `go_shoplist` DROP INDEX `index_lottery`;
ALTER TABLE `go_shoplist` ADD INDEX index_lottery(`q_end_time`,`jiexiao_time`,`waittime`,`is_accomplish`,`is_room`);
3、四舍五入:
php:round($a,2)
JS: a = a.toFixed(2);
转化为浮点类型 floatval($a);
4、
__LINE__ 文件中当前行号
__FILE__ 文件的完整路径和文件名
__DIR__ 文件所在的目录
__construct 魔术方法 http://www.jb51.net/article/112504.htm
5、文件上传:http://www.jb51.net/article/119950.htm
$file = request()->file('files');
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
// 成功上传后 获取文件信息
// 输出 jpg
echo $info->getExtension(); echo "<hr/>";
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName(); echo "<hr/>";
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename(); exit;
6、分页转化为数组,数据处理过后,再将数组转化为分页。
分页后数据处理 (V5.0.9)
1、if($order->toArray())
{
$order->toArray();
foreach($order as $k=>$v){
$data = array();
$data = $v;
$data['img'] = unserialize($v['img'])[0];
$order->offsetSet($k,$data);
}
}
V5.0.9版本开始 支持分页类后数据直接each遍历处理,方便修改分页后的数据,而不是只能通过模型的获取器来补充字段。
2、$list = User::where('status',1)->paginate()->each(function($item, $key){
$item->nickname = 'think';
});
如果是Db类操作分页数据的话,each方法的闭包函数中需要使用返回值,例如
3、$list = Db::name('user')->where('status',1)->paginate()->each(function($item, $key){
$item['nickname'] = 'think';
return $item;
});
7、array_column($msg, 'id'); 将二维数组转化为一维数组
8、select distinct name 。。。。。去重,相同字段读取一个出来
9、相同记录,去重留最小id的记录。
delete from cmf_admin_menu where parent_id=167 and name='客服续费记录' and id not in(select min(c.id) from (select cdm.id from cmf_admin_menu as cdm where cdm.parent_id=167 and cdm.name='客服续费记录') as c);
注意问题:同一张表查询并删除,要建立中间表,并且中间表要起别名
10、下拉列表恢复原状态,取消当前点击值:$("option")[0].selected = true;
11、console.log(data);
error:function(e){
console.log(e.responseText);
}
12、$user=Db::query("select sale_rebate from cmf_media_frame where id=? limit 1",[$project[0]['user_id']]);
13、 Db::startTrans();
try{
#根据类型处理数据,决定了走的步骤,赢 ,平,亏,
$deal_data=$this->dealwith_renew_sale_status($insert_data,$time,$uid);
#插入记录
Db::name('renew_record')->insert($deal_data);
// 提交事务
$error=false;
Db::commit();
}catch(\Exception $e){
// 回滚事务
$error=true;
Db::rollback();
}
14:、在现在基础上加某个天数转换为时间戳
mktime(date("H",$time),date("i",$time),date("s",$time),date("m",$time),date("d",$time)+intval(10),date("Y",$time));
15、$("option")[0].selected = true;
16、{$time|date="Y-m-d H:i",###}
17、 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写
18、二分查找
php:
function binsearch($x,$a){
$c=count($a);
$lower=0;
$high=$c-1;
while($lower<=$high){
$middle=intval(($lower+$high)/2);
if($a[$middle]>$x){
$high=$middle-1;
} elseif($a[$middle]<$x){
$lower=$middle+1;
} else{
return $middle;
}
}
return -1;
}
javascript:
var Arr = [3, 5, 6, 7, 9, 12, 15];
function binary(find, arr, low, high) {
if (low <= high) {
if (arr[low] == find) {
return low;
}
if (arr[high] == find) {
return high;
}
var mid = Math.ceil((high + low) / 2);
if (arr[mid] == find) {
return mid;
} else if (arr[mid] > find) {
return binary(find, arr, low, mid - 1);
} else {
return binary(find, arr, mid + 1, high);
}
}
return -1;
}
binary(15, Arr, 0, Arr.length - 1);
19、
sort()函数用于对数组单元从低到高进行排序
rsort()函数用于对数组单元从高到低进行排序
asort()函数用于对数组单元进行从低到高进行排序,并保持索引关系。
arsort()函数用于对数组单元进行从高到低进行排序,并保持索引关系。
ksort()函数用于对数组单元按照键名从低到高进行排序。
krsort()函数用于对数组单元按照键名从高到底进行排序。
20、
javascript
Math.ceil()向上取整
Math.floor()向下取整
Math.round()四舍五入
21、mysql InnoDB 和 MyISAM引擎区别
MyISAM:
支持表级锁
不支持事务
增删改查性能---select性能较高,适合执行查询较多的情况使用
count(*) ----MyISAM存储引擎记录表行数,所以在使用count(*)时 只需取出存储的行数,而不是遍历表,效率较高。
InnoDB:
支持行级锁
支持事务,为承受高并发增加了竞争力
增删改查性能---如果进行大量增删改操作推荐使用InnoDB存储引擎,它在删除时是对行删除,不会重建表。
其他:实现了外键、提供了多版本数据的提取。
22、索引的利弊
索引的好处:
a、提高数据检索的效率,降低索引过程中必须要读取的数据量,降低数据库IO成本
b、降低数据库的排序成本,因为索引就是对字段数据进行排序后存储的,如果待排序字段与索引字段一致,就在取出数据后不用再次排序了,因为通过索引取得的数据以满足排序要求。另外,分组操作时先排序后分组,所以索引同样可以省略分的排序操作,降低内存与CPU资源的消耗。
弊:会将低增删改的操作速度,因为执行这些操作的同时会对索引文件进行重新排序或更新。
23、组合索引遵循‘最左前缀’结果。简单理解就是只从最左面的开始组合
alter table `zhang` ADD INDEX `zuhe`(name,city,age) ;
所有组合情况
name,city,age
name,city
name
24、
SELECT * FROM event_log a WHERE DATE_FORMAT(a.`create_time`,'%Y-%m-%d %h:%i:%s') >='2017-03-02 10:00:00'
AND DATE_FORMAT(a.`create_time`,'%Y-%m-%d %h:%i:%s') <= '2017-03-02 10:20:00'
SELECT date_format(NOW(), '%Y-%c-%d %h:%i:%s' ) as post_date_gmt
25、TP ajax
//查询出该用户下面的所有项目
function ajax_getProject(){
var customer_id=$("#customer_id").val();
if(customer_id!=0){
$.ajax({
url:"{:url('Renew/ajax_getProject')}",
type:"get",
data:{customer_id:customer_id},
dataType:"json",
success:function(data){
var str="";
//项目信息
if(data.code==1){
var info=data.info;
console.log(info);
str+="<option value='0'>请选择对应项目</option>";
for(var i=0;i<info.length;i++){
str+="<option value="+info[i].aid+">"+info[i].entry_name+"</option>";
}
}else{
str+="<option value='0'>客户暂时没有项目</option>";
}
$('#pid').html(str);
//打款信息
var tstr='';
var info=data.money_info;
if(data.money_code==1){
for(var i=0;i<info.length;i++){
tstr+="<input type='checkbox' name=pay_money[] value="+info[i].money_id+" />"+info[i].info+"<br/>";
}
}else{
tstr+="客户暂时没有能付款的打款记录";
}
$("#pay_money_value").html(tstr);
},
error:function(e){
console.log(e.responseText);
}
})
}
}
public function ajax_getProject(){
$data = $this->request->param();
$customer_id=intval($data['customer_id']);
$project=Db::query("select user_id,id as aid,entry_name,sale_rebate as discount from cmf_customer where customer_id=?",[$customer_id]);
if($project){
/*foreach($project as $key=>$val){
$user=Db::query("select discount from cmf_user where id=?",[$val['user_id']]);
$project[$key]['discount']=$user[0]['discount'];
}*/
$data['code']=1;
$data['info']=$project;
}else{
$data['code']=0;
$data['msg']='该用户暂未添加项目';
}
#查询该用户通过的打款记录,并且剩余余额大于0
$money=Db::name('money')
->where('customer_id='.$customer_id." and money_statu=2 and surplus_money >0 ")
->select()->each(function($item,$key){
$item['info']="打款时间: ".date("Y-m-d H:i:s",$item['receipt_time'])."--剩余余额: ".$item['surplus_money'];
return $item;
});
if(count($money)<=0){
$data['money_code']=0;
}else{
$data['money_code']=1;
$data['money_info']=$money;
}
echo json_encode($data);
}
26、浮点数的加减乘除运算
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1,arg2){
var r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
//减法函数,用来得到精确的减法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSub(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSub(arg1,arg2){
var r1,r2,m,n;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2));
//last modify by deeka
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2) {
var m=0,s1=arg1.toString(),s2=arg2.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
<br>//验证一下:
console.log(accAdd(1.79, 0.12)); //1.91
console.log(accSub(2.01, 0.12)); //1.89
console.log(accDiv(0.69, 10)); //0.069<br>console.log(accMul(1.01, 1.3)); //1.313
27、
public 公共的所有都可以调用
protected 受保护的,自己和自己的子孙可以调用,leiA LEIB 实例化B要用A里面的protected方法,必须经过类B中方法的中转
private 自己和自己的内部方法可以调用
<?
//父类
class father{
public function a(){
echo "function a";
}
private function b(){
echo "function b";
}
protected function c(){
echo "function c";
}
}
//子类
class child extends father{
function d(){
parent::a();//调用父类的a方法
}
function e(){
parent::c(); //调用父类的c方法
}
function f(){
parent::b(); //调用父类的b方法
}
}
$father=new father();
$father->a();
$father->b(); //显示错误 外部无法调用私有的方法 Call to protected method father::b()
$father->c(); //显示错误 外部无法调用受保护的方法Call to private method father::c()
$chlid=new child();
$chlid->d();
$chlid->e();
$chlid->f();//显示错误 无法调用父类private的方法 Call to private method father::b()
28、config设置URL伪静态后缀
'url_html_suffix' => 'html',
29、echo不是函数是语言结构,echo可以输出一个或多个字符串,echo输出的速度比print快,echo咩有返回值。
print函数,如果字符串成功显示返回true,否则返回false,print只允许输出一个字符串,返回值总是1,
print_r();可以把字符串和数字简单的打印出来,而数组则以括起来的键和值的列表形式显示。
var_dump()返回数据类型
30、要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过 php 中自定义的 $GLOBALS数组获取,PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。:
<?php
$a=5;//全局变量
$b=3;//全局变量
function t1()
{
global $a,$b;
echo $a-$b; // 输出 2
}
t1();
echo PHP_EOL;
function t2()
{
echo $GLOBALS['a']-$GLOBALS['b']; // 输出 2
}
t2();
?>
31、
要想使用Session的验证码技术,首先要启用PHP自带的绘图库,应该在php.ini文件目录下启用 extension=php_gd2.dll ,重启apache生效;
32、
create database cmf;
create user `cmf`@'localhost' identified by 'cmf123mm';
grant all privileges on `cmf`.* to `cmf`@'localhost' identified by 'cmf123mm';
33、
form表单禁止enter键提交
onkeydown="if(event.keyCode==13)return false;"
34、jquery .html()原内容 覆盖、取代 .append()原基础追加
35、jquery中的 $(#id)与document.getElementById( id )的区别
jquery选择器 $(#id) 返回的是jquery对象,用document.getElementById( id )返回的是DOM对象。
(1)jquery对象可以使用两种方式转换为DOM对象, [ index ] 和 .get( index )
$(#id)[0] 得到DOM对象
$(#id).get( 0 ) -----》 DOM对象
(2)DOM对象转成jquery对象:
$(DOM对象)
用Jquery的时候,用.each()可以遍历包装集里面的DOM对象
36、
$userBrowser = $_SERVER['HTTP_USER_AGENT']; //判断是否是ie内核
$fileName = '会员列表-'.date('Y-m-d', time()).'.xls';
if( preg_match( '/MSIE/i', $userBrowser ) ) {
$fileName = urlencode($fileName);
}else{
$fileName = iconv('UTF-8', 'GBK//IGNORE', $fileName);
}
header('pragma:public');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.$fileName.''); //日期为文件名后缀
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式
$objWriter->save('php://output');
37、//定义编码
header( 'Content-Type:text/html;charset=utf-8 ');
38、TP5模板时间戳转化为时间格式
{$vo.media_tk_time|date="Y-m-d H:i:s",###}
39、javascript待页面加载完就开始运行的代码
window.onload=function (){
}
40、$_SESSION['uid'] = $info['uid'];
$session_id = $_SESSION['session_id'] = session_id();
41、
/*手机号码验证*/
function _checkmobile($mobilephone=''){
if(strlen($mobilephone)!=11){ return false; }
if(preg_match("/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|14[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$|17[0|3|4|5|7|6|8]{1}[0-9]{8}$/",$mobilephone)){
return true;
}else{
return false;
}
}
/*邮箱验证*/
function _checkemail($email=''){
if(mb_strlen($email)<5){
return false;
}
$res="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/";
if(preg_match($res,$email)){
return true;
}else{
return false;
}
}
42、在建立联合索引的时候,一定要把离散度大的放在前面,这样的话效果比较好
43、时间使用int类型。ip使用bigint类型
jQuery方法,需要引用jQuery文件:
复制代码
<script type=”text/javascript”>
$(document).ready(function (){
});
</script>
$(function (){
});
40、onfocus="this.value = '';"
onblur="if (this.value == '') {this.value = 'Password';}"
41、
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
意思是报告所有的错误,但除了E_DEPRECATED和E_STRICT这两种。
下面列举一些错误报告级别:
值 常量 说明
1 E_ERROR 报告导致脚本终止运行的致命错误
2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)
4 E_PARSE 报告编译时的语法解析错误
8 E_NOTICE 报告通知类错误,脚本可能会产生错误
32767 E_ALL 报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)
error_reporting(E_ALL ^ E_NOTICE); // 除了E_NOTICE之外,报告所有的错误
error_reporting(E_ERROR); // 只报告致命错误
echo error_reporting(E_ERROR | E_WARNING | E_NOTICE); // 只报告E_ERROR、E_WARNING 和 E_NOTICE三种错误
注意:配置文件php.ini中display_errors的默认值为On,代表显示错误提示,如果设置为Off,就会关闭所有的错误提示。
42、设置夺宝后台设置支付宝密钥,私钥用rsa_private_key.pem文件内容
43、获取一个url中json内容,并把内容转化为数组 json_decode 将json串转化为数组
$url = "http://a.tthaoduo.com/api/open_get?token=88vhxut6763nxa4q57&code=cqssc&format=json";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
$ssc = curl_exec($ch);
curl_close($ch);
$ssc=json_decode($ssc,TRUE);
43、i.IP地址存成 UNSIGNED INT
44、API管理文档https://www.eolinker.com 手机:18301680475 密码:18732959757