日常笔记 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

posted @ 2018-08-02 13:44  肖张  阅读(213)  评论(0编辑  收藏  举报