php旧笔记

整理云盘的时候发现了学习的时候总结的一些php笔记,现在贴出来希望可以帮助到有需要的人。

1:Ajax寫法:

    $.post('admin.php?route=information/information/getPersonalInfo&token=',{_1_num:_1_num,_name:_name},function(data){

        if(data==1){

            alert("暂无该用户信息,请确认输入信息是否正确");

        }else{

            var _data = JSON.parse(data); //json串轉化成js对象

            $("#text_certificate_number").html(_data.certificate_number); //输出js对象

            openCon();

        }

    })

2:sql語句:

(一)distinct與group by:

    distinct:返回唯一數據(去重,比如兩條記錄的name相同,那麽返回的數據只有一條.distinct必须放在开头)

        如:select distinct name from A;(有兩個name都是lisa,但是id不同)

        返回:$back=array('tony','lisa','jerry');

        如:select distinct name, id from A;(有兩個name都是lisa,id也相同)

        返回:$back=array('1'=>'tony','2'=>'Lisa','3'=>'jerry','3'=>'joe')

    GROUP BY:

        如:select 类别, sum(数量) as 数量之和 from A group by 类别

    distinct和Group by 区别: 

        distinct只是将重复的行从结果中出去; 

        group by是按指定的列分组,一般这时在select中会用到聚合函数。 

        distinct是把不同的记录显示出来。 

        group by是在查询时先把纪录按照类别分出来再查询。 

        group by 必须在查询结果中包含一个聚集函数,而distinct不用。

    例子1:假如有这么一个表:tab_1,它有两个字段:xm、gzlb、je(姓名、工资类别、金额),具体数据如下: 

        xm```````gzlb`````````je 

        ----------------------------------------- 

        张三`````养老金`````1000 

        张三`````护理费`````200 

        张三`````其他```````50 

        ............. 

        李四`````养老金`````800 

        李四`````其他```````50 

        ............. 

        王五`````养老金`````900 

        王五`````其他```````35 

        可以看出每个人的工资都是按类别存放的,如果要返回合计的数据,如: 

        张三``````1250 

        李四``````850 

        王五``````935 

        该怎么写SQL呢?初学者往往会这么写:select xm, sum(je) from tab_1;但结果会是什么样呢?结果将是: 

        张三``````1250 

        张三``````850 

        张三``````935 

        李四``````1250 

        李四``````850 

        李四``````935 

        王五``````1250 

        王五``````850 

        王五``````935 

        这是将全部字段都进行了所有的排列组合,即:笛卡尔积!要防止这个情况的发生,我们就可以用到group by(分组)了! 

        select xm, sum(je) from tab_1 group by xm; 

        上面的SQL指定了用xm字段分组,这样一来就返回出正确的结果了: 

        张三``````1250 

        李四``````850 

        王五``````935 

        ==================================================================== 

    例子2:假设又有这么一个表:tab_2,有这些字段:bh, xm, dah,……(编号、姓名、档案号、……), 

        比如有这样的情况:向该表录入数据的人员非常不认真,重复录入了不少数据,如: 

        bh``````xm```````dah 

        ------------------------ 

        1```````张三`````10001 

        2```````李四`````10002 

        3```````王五`````10003 

        ……………… 

        84``````张三`````10001 

        85``````赵六`````10004 

        ……………… 

        126`````王五`````10003 

        可以看出张三、王五各重复了一次,假设这个表有几万条数据,那么要查出究竟有多少重复的,该怎么查呢? 

        select bh, xm, dah from tab_2 group by xm, sfzh having count(*) >= 2; 

        返回值为: 

        bh``````xm```````dah 

        ------------------------ 

        1```````张三`````10001 

        84``````张三`````10001 

        3```````王五`````10003 

        126`````王五`````10003 

        解释一下刚才的SQL:是从tab_2表中检索编号、姓名、档案号,怎么检索呢?是用姓名、档案号做为分组,分组的条件是记录数大于等于2的。 

    这个比喻很形象:having count()语句相对于group by语句,就相当于where语句相对于select语句 

(二)where與having: 

    Where:是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。

    Having:是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作(對查詢出來的數據作爲查詢條件),在Having中可以使用聚合函数(SUM,COUNT,MAX,AVG...)

    如:Store_Information数据表中销售总额超过1500美圆的商店的信息:

    SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) > 1500 

3: jq直接給(font)标签写样式: $("font").css('font-size','15px');

4: 前台js页面跳转:

    url = 'index.php?route=information/information/getPersonalInfo&information_id=&_num='+_num;  

    location=url;

5://截取第一个斜杠前面的内容可以这样来:

    //echo substr($str,0,strpos($str, '/'))

    //截取第一个斜杠后面的内容可以这样来:

    //echo substr($str,strpos($str,'/')+1);

6: php 转义html标签 反转html标签:

    $a = '123';         //假设这是html代码

    $b =  htmlspecialchars($a);          //将< >这些符号转为<等等

    echo htmlspecialchars_decode($b);    //这个是htmlspecialchars函数的反函数

    echo html_entity_decode($a);         //这个也是htmlspecialchars的反函数

7:报错或者没有效果,使用F12调试方法:

    1:请求ajax没有效果:Network——》XHR——》点击文件,右侧即展示网络请求各种参数及报错,点击preview即可查看报错。

8: jq获取未来某天的日期

    function tab(dayNum){

        var oDate = new Date();  //获取当前时间

        var dayArr = '';     

        var dayArr = new Date(oDate.getFullYear(),oDate.getMonth(),oDate.getDate() + 14);

        return dayArr; 

    }

    tab(7); //获取未来一周的日期

9:弹框样式大全https://craftpip.github.io/jquery-confirm/

10: bing方法给video对象绑定return false的匿名方法。

    这样的效果是禁止鼠标右键的另存为功能。

    $('#video1').bind('contextmenu',function() { return false; });

11://求两个时间相差月份

    //$date1="2019-01-18"

    //$date2="2018-12-01"

    function getMonthNum( $date1, $date2, $tags='-' ){

     $date1 = explode($tags,$date1);

     $date2 = explode($tags,$date2);

     return abs($date1[0] - $date2[0]) * 12 - $date2[1] + abs($date1[1]);

    }

12:header重定向,延时2秒跳转:header("Refresh:2;url=www.baidu.com");

13:get和post方式請求接口詳細説明:

    https://www.cnblogs.com/CHEUNGKAMING/p/5717429.html

14: 上传图片

    $file_size=$_FILES['image']['size'];  

    if($file_size>5*1024*1024) {  

        echo "文件过大,不能上传大于5M的文件";  

        exit();  

    }  

    $file_type=$_FILES['image']['type'];  

    //判断是否上传成功(是否使用post方式上传)  

    if(is_uploaded_file($_FILES['image']['tmp_name'])) {  

        //把文件转存到你希望的目录(不要使用copy函数)  

        $uploaded_file=$_FILES['image']['tmp_name'];  

        //我们给每个用户动态的创建一个文件夹  

        $user_path=$_SERVER['DOCUMENT_ROOT']."/admin/view/plupload/image/".$username;

        // $_POST['image'] = $username.; 

        //判断该用户文件夹是否已经有这个文件夹  

        if(!file_exists($user_path)) {  

            mkdir($user_path);  

        }  

        //$move_to_file=$user_path."/".$_FILES['image']['name'];  

        $file_true_name=$_FILES['image']['name'];  

        $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));  

        //echo "$uploaded_file   $move_to_file";

        $this->request->post['image'] = strstr($move_to_file, "admin/");

        if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {  

            echo $_FILES['image']['name']."上传成功";  

        } else {  

            echo "上传失败";  

        }  

    } else {  

        echo "上传失败";  

    }

15:php特殊符号转化 urldecode()和urlencode()。如“=”转化“%3D”

16:html文本转化纯文本:html_entity_decode()

17:支付宝支付操作流程:https://blog.csdn.net/liangyouzi/article/details/84401936

18:js 字符串所有双引号去掉:

    var list = [0,"2",0,"1",0,0,0,0,0,0,0,0];

    list = list.replace(/\"/g, "");

19:js阻止a标签空链接跳转:

    $('.k').click(function(e){

        if(warning){

            stopDefault(e); 

        }

    })

    function stopDefault( e ){ 

       if ( e && e.preventDefault ) 

          e.preventDefault(); 

         else 

            window.event.returnValue = false;  

    } 

20:php+html页面乱码:header("Content-type: text/html; charset=utf-8"); 

21:mysql字段类型为datetime的字段只查询年月日:

$sql .= " AND date_format(cv.visit_create_date,'%Y-%m-%d') <= '".$filter_user_create_end."'";

22:SELECT COUNT(*)  FROM `表名` WHERE ( unix_timestamp(addtime) > 1538362994 and unix_timestamp(addtime) < 1541041394  ) 

23: php查询两个字符串相同的部分

function longest($str1 ='' , $str2 =''){

    $start=0;

    $end=2;

    $len = strlen( $str1 );

    // 找到两个字符串完全相同的部分,写入数组 $array

    for ($i=0; $i < $len; ) {

        $strPart = substr($str1, $start, $end);

        if(is_int(strpos( $str2, $strPart))){

            $array [] = $strPart;

            $end++;

        }else{

            $i++;

            $start = $i - 1;

            $end = 2;

        }

    }

    // 找到 $array 中最长的字符串

    $longest = '';

    foreach ($array as $val) {

        if( strlen($val) > strlen($longest)){

            $longest = $val;

        } 

    }

    return $longest;

}

echo longest("Mark Chui","Mark");

24: TP在HTML页面直接输出设置的session的值

25:防止重复提交表单:

    (1)控制器设置一个随机数

        $code = mt_rand(0,1000000);  

        session('code',$code);  

    (2)视图用一个hidden类型的input框输出session值,表单提交,控制器判断是否存在session,若存在则提交表单,销毁session;若不存在session,则输出错误消息

        

        if($_POST['originator'] == session("code")){

            unset($_SESSION["code"]);

            $data=array(

            );

            .....

        }else{

            echo '请不要刷新本页面或重复提交表单!';

        }

26: 自动回滚到页面顶部document.body.scrollTop = document.documentElement.scrollTop = 0;

27: jq获取单选框的值 $("input[name='opennew']:checked").val()

28:jq判断单选框是否有作出选择$("input[name='ifshow']:checked").val()==null

29:jq组装checked复选框选中的值

    var catId = '';

    $("input[type='checkbox']:checked").each(function(i, n){ 

        catId += $(this).val()+',';

    }); 

30:$time=time();

    $times=date('Y-01-01',$time);

    $nowTime = strtotime($times); //今年年初的时间戳

    $lastTimes=strtotime("+1 years",$nowTime);  //明年年初的时间戳

31: 数组的值相加的函数array_sum();

32:用JS获取地址栏参数的方法(超级简单)

方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!)

function GetQueryString(name)

{

     var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");

     var r = window.location.search.substr(1).match(reg);

     if(r!=null)return  unescape(r[2]); return null;

}

// 调用方法

alert(GetQueryString("参数名1"));

alert(GetQueryString("参数名2"));

alert(GetQueryString("参数名3"));

33:TP控制器返回上一页:echo "";

    TP控制器返回并刷新上一页:echo "";

34: //点击取消某个操作

    $(".FirmTotalTxt5").click(function(){

        if(window.confirm('确定取消吗?')){

            var _ids="{$goods_info['id']}";

            var url="{:U('Pc/Goods/goods_details')}?id="+_ids;

            window.location.href=url;

        }else{

            return false;

        }

    })

35: 隔几秒刷新页面

    function sure(){

        $('.footmark-delete').hide();

        $('.clear_sucess').show();

        setTimeout(function(){

            location.href=location;

            $('.clear_sucess').show();

        },300)

    }

36: 获取TP框架的方法名:ACTION_NAME

37: 用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。

    方法1:使用list函数(把数组中的值赋给一些变量)

    list($a,$b) = array($b,$a);  

    echo $a.'-'.$b,''; 

    方法2:

    $a = $a . '-' . $b;  

    $a = explode('-',$a);  

    $b = $a[0];  

    $a = $a[1];  

    echo $a.'-'.$b,'';

    // 方法3:  

    // 当两个变量都是数字的时候  

    $a = $a + $b;  

    $b = $a-$b;  

    $a = $a-$b;  

    echo $a . '-' . $b,'';

38:在PHP算法中%的使用:%指的是取余,既是取小于除数的余数

    $a=87%7=3;

49: $str = cd;

    $$str="longdog";

    $$str.="ok";

    echo $cd;

    $$str=$cd="longdog";

    $$str.=longdog."ok"=longdogok;

    $$str=$cd=longdogok;

    echo longdogok;

40: 1+2+3+....+n分别用递归算法和迭代算法计算出来:

    递归(反复调用函数):

       function add($n){

            if($n==1){

                return 1;

            }else{

                return $n+add($n-1);

            }

       }

    迭代(按照某种顺序逐个访问列表中的每一项。比如,for语句):

        function add($n){

            $result = 0;

            for($i=1;$i<$n+1;$i++){

            $result += $i;

            }

            return $result;

        }

    $n=100;

    add($n);

41:

    php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法

    php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime。下面首先还是直奔主题以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳,然后在介绍一下 mktime 函数作用和用法。

    01  //php获取今日开始时间戳和结束时间戳

    02  $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));

    03  $endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;

    04  //php获取昨日起始时间戳和结束时间戳

    05  $beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));

    06  $endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;

    07  //php获取上周起始时间戳和结束时间戳

    08  $beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));

    09  $endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));

    10  //php获取本月起始时间戳和结束时间戳

    11  $beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));

    12  $endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));

    PHP mktime() 函数用于返回一个日期的 Unix 时间戳。

    语法mktime(hour,minute,second,month,day,year,is_dst)

42: 通过ajax加载出来内容,有点击事件,写法:(每个li下面的tehui_car有点击事件,通过ajax加载出来的商品也有,teihui_ul2是ul的class)

    $(".tehui_ul2").on('click','li .tehui_car',function(){

        var _this = $(this);

    })

43: TP框架vendor和library的区别:

    http://www.php.cn/php-weizijiaocheng-381642.html

    1. 手动加载第三方类库

        如果要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,我们都可以通过手动导入的方式加载。

         我们可以使用import方法导入任何类库,用法如:

        // 导入Org类库包 Library/Org/Util/Date.class.php类库

        import("Org.Util.Date");

        // 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库

        import("Home.Util.UserUtil");

        // 导入当前模块下面的类库 

        import("@.Util.Array");

        // 导入Vendor类库包 Library/Vendor/Zend/Server.class.php

        import('Vendor.Zend.Server');

        对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP可以自动识别的类库包包括Think、Org、Com、Behavior和Vendor包,以及Library目录下面的子目录,如果你在Library目录下面创建了一个Test子目录,并且创建了一个UserTest.class.php类库,那么可以这样导入:

        import('Test.UserTest');

        注意,如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,例如:

        public funcion index(){

                import('Test.UserTest');

                $test = new \UserTest();

        }

    2. 手动加载第三方普通.php后缀的原生文件

        如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。 例如,我们把 Zend \ Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:

        public function index(){

            Vendor('Zend.Filter.Dir');

            $obj = new \Dir();

        }

        另外:如果你的文件是a.b.php(b不是class)的话,也可以这样导入:Vendor('目录.a#b');

        实例化对象时候,以class ab {...}示例:new \ab();

    3. 手动加载.php后缀且面向过程的文件 (面向过程就是文件里面没有class aaa{},不用实例化操作,直接使用)

    我们可以使用原生的语法:

    在控制器的方法里面使用:include_once ‘./ThinkPHP/Library/Vendor/lib/aaa.bbb.php’

44:关于public、protected、private

public:公有,可以在任何地方访问

protected:自身及子类可以访问

private:自身可以访问

45:static 静态变量,可以用self::加方法名或者变量名常量名,不能用于访问类自身的属性;

常量不能被赋值修改;

子类调用父类的属性或者方法用parent::加方法名或者变量名常量名,访问类常量时不用在常量名称前面加$符号

static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号

46:const  常量,定义的常量必须是大写英文字母

47:interface 定义一个接口,接口里面的方法不可以实现,接口之间的继承用extends

48:接口和类之间的实现用implements

49:类实现了接口,那么类必须实现接口里面定义的方法

50:abstract定义一个抽象类,抽象类里面定义的方法可以实现也可以不实现

51:子类继承父类,如果父类有构造方法子类没有,那么自动执行父类的构造方法;如果父类没有构造方法子类有,那么自动执行子类构造方法;如果父类子类都有构造方面,那么自动执行子类构造方法,如果需要执行父类构造方法需要使用parent::constract();

52:parent关键字可以访问父类被重写的成员

你可能感兴趣的:(php旧笔记)