php雕虫小技

1、使用绝对路径载入文件
    defined('ROOT',pathinfo(__FILE__,PATHINFO_DIRNAME));
    require(ROOT.'/test.php');
2、写入文件前,检查目录写权限
    一般代码:
    $content="please input text";
    $path='e:/text/text.txt';
    file_put_contents($path,$content);
    存在问题:写或保存文件前,确保目录是可写的,假如不可写输出
    错误信息,在linux系统中,需要处理权限,目录权限不当会导致
    很多问题,文件也有可能无法读取。
    1、父目录不存在
    2、目录存在,但文件不可写
    3、文件被写锁住
    改良代码:
    $content='please input text';
    $dir='e:/text';
    $path=$dir.'/text.txt';
    if(is_writable($dir)){
        file_put_contents($path,$contents);
    }else{
        die('文件夹有权限设置或者文件不可写');
    }
3、不要依赖submit按钮值来检查表单的提交行为
    一般代码:
    if($_POST['submit']=='Save'){
        //other thing
    }
    上诉情况大多数情况下正确,除了应用多语言,save可能代表其他含义,不好区分它们所以不要依赖它们
    改良代码:
    if($_SERVER['REQUEST_METHOD']=='POST'&&isset($_POST['submit'])){
        //other thing
    }
4、生成唯一的id 使用函数uniqid()2013/9/1
5、array_fill($start_index,$num,$mix)数组填充
6、mt_rand()与rand() 区别:mt_rand()比rand()产生随机数的平均速度快4倍
8、比较常见的输出:echo,var_dump(),var_export()
9、所有魔术方法:__construct() __destruct() __clone() __set() __get() __isset() __unset() __call() __invoke()
10、reset系列相关函数;reset()将数组的内部指针移动到第一个位置 current() key() next()
11、OOP关键字:class final instanceof private protected public static abstruct interface extends implements :: ->
12、查询出当天的记录: select * from notes where to_days(notes_date)=to_days(now());  to_days()为Mysql时间函数用于计算出天数
13、查询出昨天的记录: select * from notes where (TO_DAYS(NOW())-TO_DAYS(notes_date)) BETWEEN 1 and 2;
14、查询出近7天的记录:select * from notes where DATE_SUB(CURDATE(),INTERVAL 7 DAY) <DATE(notes_date); curdate()得到当前年月日,date_sub()计算时间差
15、查询出近30天的记录:select * from notes where date_sub(curdate(),interval 30 day)<date(notes_date)
16、查询出本月的记录:select * from notes where DATE_FORMAT(notes_date,'%Y%m')=DATE_FORMAT(CURDATE(),'%Y%m'); date_format(date,format)格式化时间
17、查询出上月的记录:select * from notes where PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m'),DATE_FORMAT(notes_date,'%Y%m'))=1; period_diff(P1,P2)返回P1到P2之间的月份间隔数,其中P1和P2的格式是YYYYMM或YYMM
18、在MVC中所有的相对路径参照路径都是入口文件 index.php
19、if(array_key_exists($key,get_object_vars($this))) 在一个类中中判断传入的参数键是否在类中
20、 __DIR__:动态得到当前文件所在目录
     dirname()得到上级目录 dirname(__DIR__) 动态得到当前文件所在目录的上级目录
     __FILE__    动态得到包含文件名的全路径
     basename(__FILE__) 动态得到文件名 包括后面的地址栏参数 如 test.php?a=method&id=2
21、读取txt文件中的信息并以换行为分隔存入到数组中: $txt=file_get_contents(text.txt); $string_arr=explode("\n",$txt) //此处的分隔符必须要是双引号将\n包含起来,不能使用单引号
22、使用fread读取文件内容
    function get_file_content($file_path){
        $fp=fopen($file_path, 'r');
        $data='';
        while (!feof($fp)){        //feof($handle) 其中feof表示测试文件指针是否已经到了文件结束的位置
            $data.=fread($fp, 1024);
        }
        fclose($fp);
        return $data;
    }
23、ini_set()函数的使用
24、array_unique(array) 移除数组中重复的项
25、strlen()与mb_strlen()的区别:
 都是用于获取字符串的长度,其中str_len只针对单字节编码字符,也就是说它计算的是字符串的总字节数。如果是多字节编码如gbk和utf8,使用
 strlen得到的不是字符的个数而是该字符的总字节数。可以使用mb_strlen获取其字符个数,使用mb_strlen要注意两点,一是要开启mbstring扩展
 二是指定字符集
 $str="传智播客php学院";
 echo strlen($str);    //21 当前页面是utf-8字符集,如果是gbk则结果为15
 echo mb_strlen($str); //21 注意 未指定字符集,使用内部字符编码(单字节)
 echo mb_strlen($str,'utf8'); //9
 自定义函数取得带有中文字符字符串的长度
    function strlen_utf8($str){
        $arr=preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY);
        $len=count($arr);
        return $len;
    }
26、截取带有中文的字符串使用 mb_substr()
 $str="你好我叫shushu";
 echo mb_substr($str,2,3,'utf8');
 function substr_utf8($str,$start,$len){
    return implode("",array_slice(preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY),$start,$len));
 }
27、post与get传输的最大容量分别是: post根据php.ini文件的配置 post_max_size(默认为8M),get则是2k
28、打印前一天的时间
    strtotime()函数用于将英文文本的日期时间转换为unix时间戳
    得到前一天的时间:date("Y-m-d H:i:s",strtotime("-1 day"));
    得到上一个月的时间:date("Y-m-d H:i:s",strtotime("-1 Month"))
    得到上一年的时间:date("Y-m-d H:i:s",strtotime("-1 Year")) 或者 date("Y-m-d H:i:s",strtotime("last year"))
    得到上一周的时间:date("Y-m-d H:i:s",strtotime("-1 Week"));
    计算2009-4-1与200-3-2两个日期之差:(strtotime('2009-4-1')-strtotime('2009-3-2'))/(3600*24) 得到两个日期的日期之差
29、list()函数,把一个数组中的值赋给list中的变量 如 list($a,$b)=array('xiaozhang','xiaoli');
30、implode()将数组转成字符串 emplode()将字符串转为数组
31、preg_split()函数:使用正则表达式对字符串分割
    语法:preg_split(正则表达式,分割的字符串,limit,$flag) 其中limit为-1表示没有限制,$flag为PREG_SPLIT_NO_EMPTY表示只返回非空部分
    preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY);
32、array_slice() 从数组中取出一段来 语法:array_slice(array,offset,[length])
33、trim() 消去字符串左右两边的空格 语法:trim($string,【$charlist】)  如果$charlist缺省则消去$string中左右两边的空格,如果存在$charlist则消去
$string中两边的$charlist 如 trim('ashushusdsa','a') 得到的结果是字符串 :shushusds 消掉了左右两边的a
    其他两个函数 ltrim()与rtrim()分别表示消掉左边和消掉右边的指定字符串
34、何为可变变量:获取一个变量的值作为这个可变变量的变量名
35、以Apache模块的方式安装PHP,在文件http.conf中首先要用语句:LoadModule php5_module 'c:/php/php5apache2.dll'; 动态加载PHP模块
然后再用语句 AddType application/x-httpd-php .php 使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
36、取得一个全路径的文件的扩展名的五种方法
    //取得一个全路径的扩展名
    //方法1
    function getExtension1($file_path){
        //对文件地址做分割得到数组
        $path_arr=preg_split('/\./', $file_path,-1,PREG_SPLIT_NO_EMPTY);
        return $path_arr[(count($path_arr)-1)];
    }
    //方法2
    function getExtension2($file_path){
        return pathinfo($file_path,PATHINFO_EXTENSION);
    }
    //方法3
    function getExtension3($file_path){
        $arr=explode('/', $file_path);
        $file_arr=$arr[(count($arr)-1)];
        $extension=explode('.', $file_arr);
        return $extension[(count($extension)-1)];    
    }
    //方法4
    function getExtension4($file_path){
        $extension=strrchr($file_path,'.');
        return ltrim($extension,'.');
    }
    //方法5
    function getExtension5($file_path){
        return substr($file_path, strrpos($file_path, '.')+1);
    }
     echo getExtension4('f:/test/a.txt');
37、intval() 函数 将'101' 转换为101
38、将open_dir转换为OpenDir
 function get($string){
    $arr=explode('_',$string);
    $txt=array_map('toUpper',$arr); //使用array_map()函数使得数组$arr中的每一个元素都调用了函数toUpper
    return implode('',$txt);
 }
 function toUpper($word){
    $word{0}=strtoupper($word{0});
    return $word;
 }
39、array_map(callback,array) 该函数的作用是使得数组array中的每一个元素都回调callback函数
40、统计字符在字符串中出现的次数:substr_count(字符串,字符)
    //自定义函数:统计字符在字符串中出现的次数
    function getNumber($string,$key){
        $arr=explode($key, $string);
        return count($arr)-1;
    }
    echo getNumber('gsggsgsgs','g');
41、ord($string)函数  得到字符串中的ASCII码 如:0-9为48-57 只能得到第一个字符的ASCII值
42、删掉一个网站的所有的Cookie   $_SERVER['HTTP_COOKIE']得到包含所有cookie的字符串 每个cookie之间用";"分割 如:name1=xiaozhang; name2=xiaoli; name4=xiaoluo
    //删除一个站点的所有cookie
    $cookie_str=$_SERVER['HTTP_COOKIE'];
    $cookies_arr=explode(';', $cookie_str);
    foreach ($cookies_arr as $cookie){
        $cookie_arr=explode('=', $cookie);    //得到cookie名与cookie值的数组
        $cookie_name=trim($cookie_arr[0]);    //必须要使用trim()去掉两边的空格
        //echo $cookie_name;
        setcookie($cookie_name,'',time()-3600);
    }
43、chr()
44、ini_get()取得PHP配置信息 ini_set() 配置PHP
45、extract()
46、str_repeat(字符串,次数) 该函数是重复的产生字符串 如:$str=str_repeat('=',10) 将生成10个“=”的字符串
47、mysql_real_escape_string() 转义SQL中的特殊字符
48、fsockopen()
49、feof()
50、header()
51、header_set()
    if(!header_set()){
        header('Location:http://www.baidu.com');
        exit;
    }
52、gmdate()
53、glob()
54、serialize() 对数据序列化
55、unserialize() 对数据反序列化
56、json_decode() 对json格式的数据进行编码
57、json_encode() 对变量进行json编码
58、unlink()删掉文件
59、finfo_open() finfo_file()
60、ucfrist() 将字符串的首字母大写,主要应用于MVC地址栏中平台与模块的单词拼写
61、addslashes()
62、get_magic_quotes_gpc()
63、array_walk_recursive()
64、IE8下不支持html5标签的解决方法:使用javascript:document.createElement('header'); 这句话即告诉IE8说header为一个标签    
65、array_unique(array) 消除数组中重复的项,返回为一个数组
66、js事件监听:
    IE:
    attachEvent(type,callback) type:事件名 如 onclick,callback:事件处理程序
    基于w3c模型的浏览器(firefox 等):
    addEventListener(type,callback,flag)  type:事件名 如click 注意,这里没有on前缀 callback:事件处理程序 flag: 使用捕捉模型还是冒泡模型 默认:冒泡
    解决浏览器兼容性问题:
     /**
      * obj: 为操作的dom对象
      * type: 事件名 不加 'on'
      * callback: 事件处理程序

     function addEvent(obj,type,callback){
        if(window.addEventListener){
            obj.addEventListener(type,callback);
        }else{
            obj.attachEvent('on'+type,callback);
        }
     }
67、js中的event对象 window.event 只支持IE浏览器 火狐等W3C浏览器不支持 这个需要在匿名函数中传递event对象 function(event){}
    如:
    obj.onclick=function(event){
        var evt;
        if(window.event){
            //解决IE浏览器问题
            evt=window.event;
        }else{
            //解决w3c浏览器问题
            evt=event;
        }
    }
68、js中的事件冒泡机制与阻止冒泡:
    <script type="text/javascript">
    window.onload=function(){
        document.getElementById('div1').onclick=function(){
            alert('div1');
        }
        document.getElementById('div2').onclick=function(){
            alert('div2');    //发生事件冒泡 依次弹出div3、div2
        }
        document.getElementById('div3').onclick=function(){
            alert('div3');    //发生事件冒泡 依次弹出div3、div2、div1
        }
    }
    </script>
    <div id="div1">
        div1
        <div id="div2">
            div2
            <div id="div3">
                div3
            </div>
        </div>
    </div>
    阻止冒泡发生
    function stopBubble(evt){
        if(window.event){
            //ie浏览器
            window.event.cancelBubble=true;
        }else{
            evt.stopPropagation();
        }
    }
69、js 字符串的search方法:var str='try you best'; str.search('tr') 说明:该方法是查找字符串中匹配的字符
    如果找到则返回索引位置,如果没有找到则返回-1 实例:js版搜索功能
70、多关键字的搜索功能实现原理:将关键字字符串使用空格分隔,得到数组,再for遍历逐个匹配即可 如 str='中国 中华 台湾' 使用空格分隔成数组再使用 for遍历
    搜索实例:
    $link=mysql_connect('localhost','root','123456');
    mysql_select_db('myshop');
    mysql_query('set names utf8');
    $str='诺基亚 三星';
    $arr=explode(' ', $str);
    $sql="select goods_name from ecs_goods where";
    for ($i=0;$i<count($arr);$i++){
        $key=$arr[$i];
        $sql .=" goods_name like '%$key%' or";    
    }
    $sql=substr($sql, 0,-2);
    $result=mysql_query($sql);
    while ($row=mysql_fetch_assoc($result)){
        var_dump($row);
    }
71、背景透明度兼容性:IE:filter:alpha(opacity:30) 火狐、谷歌:opacity:0.3
72、元素的:offsetLeft、offsetRight、offsetWidth、offsetHeight 的使用
73、JS中根据类名筛选出指定的元素 通用方法
    function getByClass(oParent,sClass){
        var aEle=oParent.getElementsByTagName('*');        //从父节点中得到所有的子节点,其中通配符“*”表示匹配所有的元素
        var aResult=[];
        for(var i=0;i<aEle.length;i++){
            if(aEle[i].className==sClass){
                aResult.push(aEle[i]);
            }
        }
        return aResult;
    }
74、JS中判断变量数据类型使用 typeof 例如:typeof str.match(book) 得到的是一个object类型(数组对象模型)
75、php中的析构函数,销毁对象的顺序是先定义的销毁,原因是对象是名是存在于栈中,栈是先进后出的,名存放在栈中,地址存放在堆中
变量存放在栈中,因为栈有着 小、快的特点,便于变量的反复的读取和写入。堆相对于栈而言,有着大、慢的特点
所谓的引用传递是指:两个栈中的对象指向堆中的同一个内存
按值传递:普通变量
按地址传递:对象变量
76、JS正则表达式的分组匹配
    var pattern=/^([a-z]+)\s([0-9]{4})$/i;    
    var str='google 2012';
    //    alert(pattern.exec(str));
    alert(pattern.exec(str)[0]);    //得到的是全部字符
    alert(pattern.exec(str)[1]);    //得到的是第一个分组匹配成功的字符
    alert(pattern.exec(str)[2]);    //得到的是第二个分组匹配成功的字符
77、JS中对象的方法就是属性
 function Person(p_name){
    this.name=p_name;
 }
 var p1=new Person('xoazhang');
 p1.say=function(){
    alert('我叫'+this.name);
 }
78、JS中检测数据类型:使用 typeof和 instanceof  constructor
    两者的区别:typeof运算符在检查基本数据类型的时候非常好用,但检测引用类型的时候,它就不是那么好用
    通常,我们并不想知道它是不是对象,而是想知道它到底是什么类型的对象。因为数组也是object,null也是object
    所以此时,你需要使用 instanceof 运算符来查看
        
        //检查数据类型,使用 typeof 和 instanceof
        var str=new String('test');
        alert(typeof str);
        var arr=new Array();
        alert(typeof null);
        alert(str instanceof String);    
        alert(arr instanceof Array);    //是否是数组
        var obj={};    
        alert(obj instanceof Object);    //是否是对象
        var reg=/g/;
        alert(reg instanceof RegExp);                        //是否是正则表达式
        function Person(){ }
        var person=new Person();    
        alert(person.constructor);        //得到person对象的构造器
79、解决JS只能取得行内样式的值,而不能取得外联文件样式的值的方法
    if(typeof window.getComputedStyle!='undefined'){
        //支持w3c浏览器
        return window.getComputedStyle(this,null)[attr];    //其中this表示当前元素对象
    }else if(typeof this.currentStyle!='undefined'){
        //支持IE
        return this.currentStyle[attr];
    }
80、状态码的问题
81、使用正则表达式将页面中的js脚本清除掉
        var str='2323<script>test<\/script>ssss';
        var pattern=/(<script.*>.*<\/script>)/;
        var result=str.replace(pattern,' ');
        alert(result);
82、eval()方法 检查JS代码并执行  如 eval('3+5') 得到的结果不是字符串'3+5' 而是8 因为它执行了3+5这个运算
83、css中设置透明色:IE:filter:alpha(opacity=30)    W3C:opacity:0.3
84、window.onresize=function(){窗体发生改变时的动作} window.onresize表示当窗体发生改变时调用的方法
85、document.documentElement.clientWidth :得到当前浏览器的最大宽度 document.documentElement.clientHeight:得到当前浏览器的最大高度
86、获取网页元素的绝对位置
    网页元素的绝对位置指该元素的左上角相对于整个网页左上角的坐标。首先每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器
    (offsetParent对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标
    使用下面函数完成
    //得到元素左边坐标
    function getElementLeft(element){
        var actualLeft=element.offsetLeft;
        var current=element.offsetParent;
        while(current!=null){
            actualLeft+=current.offsetLeft;
            current=current.offsetParent;
        }
        return actualLeft;
    }
    //得到元素上边坐标
    function getElementTop(element){
        var actualTop=element.offsetTop;
        var current=element.offsetParent;
        while(current!=null){
            actualTop+=current.offsetTop;
            current=current.offsetParent;
        }
        return actualTop;
    }
87、解决浏览器对事件对象的兼容问题
    function(event){
        var ev=event||window.event;    //其中window.event支持IE浏览器,从匿名函数中传过来的参数event支持W3C浏览器
    }
88、div拖拽效果的实现
        //div拖拽效果实现
        var login=document.getElementById('login');
        login.onmousedown=function(event){
            var e=event||window.event;
            var diffX=e.clientX-login.offsetLeft;
            var diffY=e.clientY-login.offsetTop;
            document.onmousemove=function(event){
                    var e=event||window.event;    //解决浏览器兼容问题,其中window.event表示支持IE,event表示支持w3c
                    login.style.left=e.clientX-diffX+'px';    
                    login.style.top=e.clientY-diffY+'px';
            }
            document.onmouseup=function(){
                    this.onmousemove=null;
                    this.onmouseup=null;
            }
        }
89、JS取消浏览器的默认行为
    var prevent=function(event){
        var e=event||window.event;
        if(typeof e.preventDefault !='undefined'){
            //W3C
            e.preventDefault();
        }else{
            //IE
            e.returnValue=false;
        }
    }
90、js中取得字符串的第一个字母 如: string='test'; 得到t这个单词 使用 string.charAt(0)
91、js检查浏览器的兼容性
    (function(){
            var version=navigator.userAgent.toLowerCase();
            window.sys={};    //其中{}表示申明为一个对象
            //IE浏览器
            if((/msie ([\d.]+)/).test(version)){
                var info=version.match(/msie ([\d.]+)/);
                sys.ie=info[1];
            }
            //Firefox浏览器
            if((/firefox\/([\d.]+)/).test(version)){
                var info=version.match(/firefox\/([\d.]+)/);    
                sys.firefox=info[1];
            }
            //alert(version); chrome
            if((/chrome\/([\d.]+)/).test(version)){
                var info=version.match(/chrome\/([\d.]+)/);    
                sys.chrome=info[1];
            }
            
        })();
92、filemtime、fileatime、filemtime
93、定义常量常用代码
    if(!defined('SMARTY_DIR')){
        define('SMARTY_DIR',dirname(__FILE__));
    }
94、定义操作系统文件分割符
    if(!defined('DS')){
        define('DS',DIRECTORY_SEPARATOR);
    }
95、strip_tags
96、encodeURIComponent()    JS中中文转码 此方法与php中的urlencode方法效果是一样的
    在ajax的get传值中,如果值为中文,则需要转码再在php文件中接收并解码
    html文件:
    xhr.open('get','./01.php?name=xiaozhang&addr='+encodeURIComponent('北京'),true);    //true表示异步传输
    php文件:
    $addr=urldecode($_GET['addr']);
97、创建ajax对象
    function createXHR(){
            if(window.ActiveXObject){
                //支持IE
                var versions=['Microsoft.XMLHTTP','MSxml2.XMLHTTP','MSxml2.XMLHTTP2.0','MSxml2.XMLHTTP3.0','MSxml2.XMLHTTP4.0','MSxml2.XMLHTTP5.0'];
                for(var i=0;i<versions.length;i++){
                    var xhr=new ActiveXObject(versions[i]);
                    return xhr;
                }                
            }else{
                //支持W3C
                var xhr=new XMLHttpRequest();
                return xhr;
            }
        }
98、ajax之post请求
            var xhr=createXHR();
            xhr.open('post','./01.php',true);    //true表示异步传输 设置为post
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){//表示已经ajax已经处理完成
                    alert(xhr.responseText);
                }
            }
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');    //POST传递必须设置请求头信息
            xhr.send('name=xiaoli&age=20');    //这里填写post传递的数据,而不是null
99、ajax之get请求
            var xhr=createXHR();
            //注意点:get地址栏传值时,如果值为中文则需要使用encodeURIComponent函数对中文字符编码
            xhr.open('get','./01.php?name=xiaozhang&addr='+encodeURIComponent('北京'),true);    //true表示异步传输  设置为get
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){//表示已经ajax已经处理完成
                    alert(xhr.responseText);
                }
            }
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');    //POST传递必须设置请求头信息
            xhr.send(null);    
100、ajax中get与post请求的区别
            1、get请求传递参数使用地址栏,post请求传递参数使用send()方法
            2、get请求中文参数需要转码:使用encodeURIComponent()方法对中文字符转码
            3、post请求需要设置请求头信息使用:setRequestHeader('content-type','application/x-www-form-urlencoded');
101、ajax中同步与异步请求的区别:同步:在一个时间段只有一个请求,彼此之间有先后的依赖关系。异步:在一个时间段可以由多个请求,彼此之间没有先后
的依赖关系。
102、禁止浏览器缓存该页面(ajax中解决IE缓存问题)
    header('Cache-control:no-cache');
    header('Pragma:no-cache');
    header('Expires:-1');
    解决ajax缓存第二种方法是:对每次请求时在地址栏后面加上一个随机数 如:'data.php?num='+Math.random()
103、JS中的eval()方法 :把参数当成表达式运行
104、php中的模式修正符 s:表示化为一行 U:表示禁止贪婪匹配
105、border-collpase:collpase
106、array_intersect(array array1,array array2) 计算数组的交集 array_diff(array array1,array array2) 计算数组的差集
107、JS调试: console.log(调试的对象)
108、dom中设置属性 setAttribute(k,v)
109、jQuery中ajax的实现 $.ajax({type:'get',url:'地址',dataType:'html',data:'传递的数据',success:function(msg){alert(msg)}})
110、php中如何判断一个字符串存在某个字符 strpos('需要查找的字符串','匹配的字符')
111、截取一个URL地址的后缀名
    function getExt($url){
        $extension_str=pathinfo($url,PATHINFO_EXTENSION);
        $index=strpos($extension_str, '?');
        if($index){
            $arr=explode('?', $extension_str);
            $ext=$arr[0];
        }else{
            $ext=$extension_str;
        }
        return $ext;
    }
112、MVC框架中空方法、空模块处理 使用魔术方法 __call() 如果为出现空方法与空操作则会调用 __call()方法触发
113、get_defined_constancts(true)得到系统定义和用户自定义的的常量 使用这个函数去查所有用户自定的常量再在模板中使用
    在ThinkPHP模板中使用常量能代替很多繁杂的操作 : $Think.const.__GROUP__ 得到的是定位到group目录下路径 : /10-15TP/shop/go/index.php/admin
    $Think.const.__URL__ 得到的路径是:/10-15TP/shop/go/index.php/admin/Manager 定位到了控制器
114、mysql中时间戳与一般时间格式的转换:
    unix_timestamp('1997-8-10 22:23:00') 得到的是 875996580
    from_unixtime(时间戳)                得到的是以'YYYY-MM-DD HH:MM:SS'格式的日期
    from_unixtime(时间戳)+0                得到的是以'YYYYMMDDHHMMSS'格式的日期
115、func_get_args() 得到函数所有的参数数组
116、php的作用域是不重叠的,相互之间不能访问。所以在函数内部不能访问函数外的全局变量,在函数外部
不能访问函数内部的局部变量。 每个函数都有独立的局部作用域,相互之间不可访问。
117、array_merge(数组1,数组2) 合并数组
118、js中的join()方法将数组以元素以指定分割符组成一个字符串
    var arr=['apple','sanxin','huasuo'];
    var new_arr=arr.join(',');    //得到的结果是 apple,sanxin,huasuo
119、js将 "apple,sanxin,huasuo" 转换为js数组 str.split(',')
120、根据索引移除数组中的某个元素的方法:
    function removeByIndex(arr,index){
        arr.splice(index,1);
    }
121、根据值移除数组中的某个元素的方法
    function removeByValue(arr,value){
        for(var i=0;i<arr.length;i++){
            if(arr[i]==value){
                arr.splice(i,1);
            }
        }
    }

122、js中的splice(index,nums,item1)方法  该函数时想数组中删除或添加项目,
其中index与nums两个参数必选,item1为可选。如果选了则先删除指定索引元素,再将item1添加到删除的位置。
index表示数组索引,nums表示个数,items表示添加的项目 该函数会改变原来的数组
 var arr=['xiaozhang','xiaowu','xiaoli','xiaoliu'];
 arr.splice(2,1);            //删除数组索引为2的元素
 arr.splice(1,2);            //删除数组索引以1开始之后的两个元素
 arr.splice(1,1,'xiaoluo')  //删除数组索引为1并将xiaoluo添加到刚删除的位置
123、jq实现复选框开关效果
    var flag=false;
    $('a').click(function(){
        $("input[type='checkbox']").attr('checked',!flag);
        flag=!flag;
    })
    实现复选框反选效果
    $('a').click(function(){
        var inputs=$("input[type='checkbox']");
        for(var i=0;i<inputs.length;i++){
            if($(inputs[i]).attr('checked')){
                $(inputs[i]).attr('checked',false)
            }else{
                $(inputs[i]).attr('checked',true);
            }
        }
    });

124、检查图像是否已经被完全加载进来
    $('#theImage').attr('src','image.jpg').load(function(){
        alert('全部加载进来');
    })
125、数据库查询优化
    使用索引:index
    创建index:
    方法1:create index index_name on users(username)
    方法2:alter table tab_name add index[index_name](username)
    使用索引需要注意的问题:如果表执行比较多的插入与修改数据时,不建议使用索引。索引主要用于查询
126、mysql优化七个发面:
    1、表的设计符合3NF
     满足1NF:1、表的字段具有原子性,不能分割 2、表的字段不能重复
     2NF:不能存在完全相同的记录(记录唯一性),一般是给表一个主键来控制,非业务逻辑主键
     3NF:表中不能由冗余的数据
    2、建立合理的索引
    3、使用分表技术
    4、优化SQL语句
    5、创建适当存储过程,触发器,视图
    6、对my.ini的配置优化配置缓存大小
    7、升级硬件与软件
127、explain 指令可以来分析mysql是如何执行你的SQL语句 基本用法:explain sql语句
    explain select * from table\G    其中 \G表示以树形的方式查看sql语句结构
128、数据库以查询为主选择数据库引擎为MyISAM
     数据库以插入与更新为主选择数据库引擎为InnoDB
     mysiam 适用于效率比较高,安全性不够的
     innodb 适用于安全性高,效率稍微低点
129、连接查询
    1、交叉连接:也称笛卡尔积 得到的结果是表1与表2的乘积 select * from 表1 cross join 表2 on 条件
    2、内连接:两个表中的只有满足条件的记录才会出现在结果集中,不满足条件的
    不管是表1还是表2都不会出现。
    select * from 表1 inner join 表2 on 条件  
    3、左外连接 简写为 left join 左边会显示左表的所有记录,右边显示右表的匹配成功的记录,匹配不成功的
    则用null填充
    4、右外连接 简写为 right join 右边会显示右表的所有记录,左边显示匹配成功的记录,匹配不成功的用null填充
    5、自连接    主要用于自己查询自己
130 视图:视图是虚拟表 视图是文本文件里面存放的是sql语句 sql执行生成的是二进制文件
    创建视图:create view view1 as select * from table_name
    删除视图:drop view view1
    使用视图:select * from view1
131、单例模式
    class MySQL{
        private static $instance=null;
        private static function __construct(){
            mysql_connect('127.0.0.1','root','123456');
        }
        //公开实例化方法
        public static function getInstance(){
            if(!self::$instance instanceof self){
                self::$instance=new self;
            }
            return self::$instance;
        }
        //禁止克隆
        private function __clone(){
        
        }
    }
132、多个进程同时写入同一个文件成功
    $fp=fopen('a.txt','w+');
    if(flock($fp,LOCK_EX)){
        //获得写锁 写数据
        fwrite($fp,'test');
        //解除锁定
        flock($fp,LOCK_UN);
    }else{
        echo '文件锁定中';
    }
133、得到url地址的扩展名
 function getExt($url){
    $arr=parse_url($url);            //将url转换为地址
    $file=basename($arr['path']);    //得到文件
    explode('.',$file);
 }
134、检查合法日期
    function checkDate($date){
        if(date('Y-m-d H:i:s',strtotime($date))==$date){
            return true;
        }else{
            return false;
        }
    }
135、smarty模板内建函数
    {foreach from=数组 key='key' item='value'}
        {foreachelse}
    {/foreach}
    foreach的内置变量
    $smarty.foreach.name.iteration:索引(从1开始)
    $smarty.foreach.name.total:        循环的总次数
136、smarty开启缓存及缓存时间:
    $smarty->caching=true;
    $smarty->cache_lifetime=7200;    //设置缓存时间
    默认缓存时间为3600秒 $cache_lifetime=3600
    检查缓存:$smarty->isCached("tpl.html")
    清除缓存:$smarty->clearCached('tpl.html');
    清除所有缓存:$smarty->clearAllCached();
    局部缓存:$smarty->assign('var',$var,true);    第三个参数表示是否不缓存
    {$var nocache=true} 指定$var不缓存
    {nocache}
        不缓存的内容
    {/nocache}
137、smarty模板fetch读取某个文件内容并输出 {fetch file='文件名' isassign='var'} 表示保存本次结果但不输出
138、json是属性的集合
139、prototype:使用原因:扩展对象当前实例的属性或方法。功能:返回对象构造器的引用
140、闭包原理:当一个函数里面包含另一个函数,并且返回里面函数的值,则当在函数外部使用一个全局变量
指向返回的函数的首地址时,里面的函数所占用的内存不会被回收,而函数内部的局部变量也不会被回收。这就是闭包原理。
    function f1(){
        var i=10;
        function f2(){
            alert(i);        
        }
        return f2;
    }
    var d=f1();    //得到f2的首地址
    d();    //执行f2()
141、正则表达式的常用模式:
    1、忽略大小写模式(i) /^test$/i
    2、多行模式(m)        /^test$/m    
    3、懒惰模式(U)        /^test$/U
    4、支持UTF-8转义表达式(u) /^test$/u
142、过滤所有的html标签的正则表达式:<\/?[^>]+>  其中:\/?表示斜杠可无可有,匹配开始和关闭标签。[^>]+表示如果不是右尖括号的字符
重复一次或多次。
143、XSS攻击:指的是css和javascript脚本攻击,主要在地址栏和论坛留言表单中 ,解决方案是:对特殊字符“<”,“>”等html标签过滤
可以使用 htmlspecialchars() 或者使用正则表达式过滤。
143、microtime(true) 表示微妙数。该函数主要用于测试一个过程的执行总时间。用结束时间减去开始时间。
144、在使用Session中,session_start()必须在程序最开始执行,前面不能有任何输出内容。但是有时候确实需要输出或者不能确定是否有输出则可以如下:
    ob_start();
        session_start();
        $_SESSION['user']='xiaoluo';
    ob_end_flush();
145、禁用Cookie之后,传递SessionID可以通过 URL或者表单来传递。如下
    a.php:
    echo "<a href=new.php>new1</a>";
    $a=session_name();
    $b=session_id();
    echo "<a href=new.php?a=$b>new2</a>";
    
    new.php:
    $session_name=session_name();
    //取得sessionid
    $sessionID=$_GET[$session_name];
    //使用session_id设置获得的Session
    session_id($sessionID);
    session_start();
    var_dump($_COOKIE);
    var_dump($_SESSION);
146、javascript进行加密验证和非平衡图形验证码
147、IP限制
148、Token法
149、表单欺骗
150、getenv('REMOTE_ADDR') 得到环境变量的函数
151、MySQL常见引擎对比:
    MyISAM:    非事务存储引擎,表锁  支持小数据,小并发,适用于频繁查询
    InnoDB: 支持事务引擎,行锁 支持大数据,大并发,适用于插入更新比较多的应用
152、SQL注入:
    如:select * from table where user='xiao' and pwd='111'
    下面的SQL语句可以绕过验证
    select * from table where user='xiao' and pwd='111' or 1=1
    这条语句可以绕过用户名和密码的验证。
    一般而言,如果用户名或密码通过GET传递过来则 如下地址可以绕过用户名与密码验证
    http://www.chuanzhi.com/10-25/06sql.php?user=xiao&pwd=admin' or '1=1
    防SQL攻击可以使用函数 addslashes(string) 会把所有传入所有的'(单引号)、"(双引号)、\(反斜杠)和空字符
153、文件缓存
154、ignore_user_abort() 关闭浏览器时PHP脚本也将继续执行
155、set_time_limit() 设置脚本最大执行时间,默认值为30秒,如果为0表示没有限制。
    PHP定时执行任务的实现
    config.php文件
    <?php return 1; ?>
    test.php文件
    <?php
        ignore_user_abort();
        set_time_limit(0);
        $interval=60*30;
        do{
            $run=require('config.php');
            if(!$run){
                die('process abort');
            }else{
                //要执行的代码
                sleep($interval);    //等待5分钟
            }
        }while(true)
    ?>
156、javascript对URL编码的函数:
    编码函数:encodeURI(string)        该函数是对整个URL编码
    解码函数:decodeURI(string)
    编码函数:encodeURIComponent()  该函数是对组成部分进行个别编码
157、设置客户端缓存:
    注意:
    header('Cache-Control:max-age=86000,must-revalidate');
    header('Last-Modified:'.gmdate('D,d M Y H:i:s').'GMT');
    header('Expires:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');
    注意:HTTP的日期时间是格林威治时间(GMT),而不是本地时间
    例如:Expires:Fri,30 Oct 1998 12:41:12 bm  GMT
158、日志管理
    PHP日志:
    打开PHP的Log记录,只需要在php.ini文件中设置如下选项
    Log_errors = On        //开启日志记录和记录的错误等级
    LogLevel warn        
    error_log = e:/error.log    //记录Log的位置。
159、ThinkPHP中URL访问的几种模式
160、ThinkPHP中的令牌
161、array_merge($arr1,$arr2) 合并数组
162、设置PHP.ini文件最大并发数、apache最大并发数
163、浏览器端使用JS正则表达式验证 服务器端使用php正则表达式验证
164、PHP中多态的使用
    function add(Person person){
        if(person instanceOf chinese){
            echo '中国人的类';
        }
        if(person instanceOf usa){
            echo '美国人的类';
        }
        if(person instanceOf english){
            echo '英国人的类';
        }
    }
165、构建流畅类的接口
    class Goods{
        private $good_name;
        private $good_price;
        public function setName($good_name){
            $this->good_name=$good_name;
            return this;
        }
        public function setPrice($good_price){
            $this->good_price=$good_price;
            return this;
        }
    }
    $goods=new Goods();
    $goods->setName('xiaozhang')->setPrice('2000');
166、PHP的断点续传
167、关于虚拟主机的详细配置信息(重要)、
168、正则表达式反向引用:引用字表达式内容时,如果在正则表达式直接使用使用\1号,如果在另外地方使用用$1
169、apache发生错误,看错误日志可以可以方便调试
170、将session保存到memcached中
171、对myisam的存储引擎表,进行碎片整理。optimize table 表名
172、create table table_1 like table_2    根据创建结构相同的表
173、a标签的href和onclick同时使用时会发生的问题:a标签的href执行页面跳转,onclick执行ajax请求。
    当两者同时使用时,a标签会先执行跳转,ajax请求会中断,也就是说ajax请求不到数据。
    解决方案是:阻止a标签的默认行为,当ajax请求数据完成后再再执行a标签的页面跳转
174、dede中在html模板页面中引入某模板的标签是 {dede:global.cfg_templets_skin/}
    如:<link href="{dede:global.cfg_templets_skin/}/css/index.css" type="text/css"  rel="stylesheet"/>
175、网站图片的现加载效果
176、格式化小数的函数 round(数字,2) 表示保留两位小数
177、以换行转化为数组 explode("\r\n",$str) 使用\r\n的原因是与操作系统有关。
178、服务器优化措施:
1、查看慢查询的条数,定位性能脖颈
    show global status like '%slow%'
2、适当使用Query Cache
3、增加Mysql最大连接数
    查看最大连接数:show variables like 'max_connections'
4、从表中删除大量数据后,可运行 optimize table tab_name 进行碎片整理
5、对于MyISAM,适当设置 table_cache
179、压力测试软件:ab.exe apache的bin目录下。ab.exe -c 100 -n 1000 地址
180、删除地址栏参数的算法
181、Sphinx 词库 搜狗词库 语言包的制作
182、把Sphinx 安装成一个系统服务  --install
183、ifnull(字段名,'test') 数据库中判断字段名如果为空为输出test
184、dedecms中的防脚本攻击的函数:在include/helpers/filter.helper.php文件中
185、filemtime()得到文件最后修改时间
186、缓存内容
    ob_start();                    //开启缓存
    include './test.html';        //将该数据写到缓存中
    $_content=ob_get_content();    //得到缓存内容
    ob_clear();                    //清空缓存区
187、实现局部不缓存的,使用ajax去实现。
188、var_export()打印出带有php语法格式的字符串
    $content=var_export(数组,true) 不会直接输出出来,但是可以用变量接受
    var_export(数组,false) 直接输出
    该函数可以将数组信息以有效的PHP语法格式写到文件中
189、对数组做缓存
    方案1:序列化数组存到文件中,用时再反序列化
    方案2:直接使用var_export()格式化数组,再写到文件中
190、TP框架中的实例化模型 $model=M('Model')与$model=D('model')的区别
    如果需要要使用模型中的数据,则使用D,如果只是需要使用TP模型中的方法则使用M
191、如何取json得数据
    var json={'person':[{'name'=>'xiaozhang','age':20,'sex':'male'},{'name':'xiaowu','age':20,'sex':'famale'}]}
    取得json中的某一个值:json.person[0].name 得到的是person节点下的第一个数组下的name的值 xiaozhang
192、使用空模型,应用场合:带有连接查询的SQL语句的执行,可以实例化空模型,再调用query()
193、无限极分类
脚本延迟执行:sleep(10)延迟10秒 不定参数 func_get_args()
194、ckeditor的使用
195、$.ajax({
    type:'post',
    url:''
    data:$('form').serilize(), //技巧部分 得到表单中的所有序列化数据
    success:function(msg){
    
    }
})
196、stript_tags()过滤html标签
197、$(str).each(function(k,v){
        alert(v);
    })
198、set_time_limit(0) 设置脚本执行时间为没有限制
199、parse_url($url) 解析域名 得到的是一个数组:hhtp,wwww.baidu.com,/name/xiaoming
200、开启安全模式下,有些函数是失败的,如mkdir,fopen,fread,fwrite,exec,system等涉及到文件系统的系统函数不能执行
    默认是关闭的safe_mode=off  开启是safe_mode=on
201、char、varchar、text的区别
     char    :255字符
     varchar:65535字节
     text:65535字符
202、SQL注入攻击:
当在URL地址提交 id=1 or 1=1时会产生SQL注入 防范方法是使用intval(value)将数据转换成整数
使用 addslashes(str) 验证字符串,将单引号”"“转换成”\'“ 双引号“"”转换为”\"“
使用mysql_real_escape_string() 转义sql语句中的特殊字符
203、跨站脚本攻击:使用htmlspecialchars函数来防范
203、在php.ini文件中将magic_quotes_gpc=on时,它会把提交的变量中的所有的单引号,双引号,反斜线和空字符会自动转化为含有反斜线的转义字符。
204、SQL注入专题
    1、select注入:sql语句:select * from user where username like '%$search%' order by username
    注入语句:aabb%' or 1=1 order by id#
    注入成的语句是:select * from user where username like '%aabb%' or 1=1 order by id #order by username
    加入没有含有aabb的用户名,那么or 1=1使返回值依然为真,使其返回所有值
    还可以注入:%' order by id#
    注入成功的语句是:select * from user where username like '% %' order by id#order by username
    2、update users set password='$pwd',

205、char与varchar的区别:
    char与varchar的区别在于两者的保存方式和检索方式
    char为固定长度,varchar为可变长度,如char(4),varchar(4) 如果为'ab'则 char为'ab  '未知的长度以空格填充,而varchar为'ab'不会以空格填充
    检索方式:'ab  ' varchar数据类型检索出来是原数据'ab  ',而char数据类型检索出来的是'ab'会删除尾部的空格
    float、decimal的区别
    float为浮点数,decimal为定点数,float为产生不精确的情况,如111.32可能会变成111.31
206、TP中打印出SQL语句信息$this->getLastsql()
207、PHP中使用eval()可以将字符串解释为php脚本执行 如
    $str="echo 'xiaozhang';";
    eval($str);
208、SQL优化:
    优化的一般步骤:1、使用show status了解SQL的执行效率 2、定位执行效率低的SQL语句(通过慢查询日志文件或slow processlist)
    3、通过explain分析低效的SQL语句() 4、采取对应的优化措施
    使用show status 命令了解各种SQL的执行频率,其中show session status 显示的是session级别的统计结果,show global status 显示的是global级别的结果
    在show status中 下面的参数对MyIsam和Innodb存储引擎都有计数
    1、Com_select 执行select操作的次数
    2、Com_insert 执行insert操作的次数
    3、Com_update 执行update操作的次数
    4、Com_delete 执行delete操作的次数
    以下几个参数时对Innodb存储引擎计数
    1、Innodb_rows_read select查询返回的行数
    2、Innodb_rows_inserted 执行Insert操作插入的行数
    3、Innodb_rows_updated 执行update操作更新的行数
    4、Innodb_rows_deleted 执行delete操作删除的行数
    对于事物型的应用,通过Com_commit和Com_rollback可以了解事务提交和回滚的情况
    以下几个参数可以了解数据库的基本情况
    1、Connections 试图连接Mysql服务器的次数
    2、Uptime 服务器的工作时间
    3、Slow_queries 慢查询的次数
    通过explain分析低效的SQL语句
        select_type:    select 类型
        table:            输出结果集的表
        type:            表示表的连接类型 当表中只有一行是type的值时为system是最佳的连接类型
        当select的表连接没有使用索引时,type的值为all,表示对该表为全表扫描,这时需要通过创建索引
        来提高表连接的效率。
        possible_keys:    表示查询时,可以使用的索引列
        key:            表示使用的索引
        key_len:        索引长度
        rows:            扫描范围
        extra            执行情况
    索引的存储类型目前只有两种(btree和hash),具体和表的模式相关
    myisam btree
    innodb btree
    memory hash,btree
    btree为二叉树 hash为哈希
    查看索引使用情况:如果索引正在工作,Handler_read_key的值将很高。这个值代表了一个行被索引值读的次数
    Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。
    show status like 'Handler_read%'
    优化措施:整理文件碎片:optimize table (删除大量数据后)
    优化group by语句:默认情况下mysql排序所有group by col1,col2 查询时会隐式的指定order by col1,col2 但是你又想
    避免排序结果的消耗,可以执行order by null禁止排序。
209、字符串的反转,如:$str='hello,world' 不使用php函数
    function fn1($str){
        $len=strlen($str);
        $new_str='';
        for($i=$len-1;$i>=0;$i--){
            $new_str.=$str[$i];
        }
        return $new_str;
    }
210、php中操作mongodb
    将对应的版本的mongodb.dll文件放入php的ext文件夹下,开启mongodb.dll的扩展
    $mongo=new Mongo();    //创建Mongo对象
    $data=array('name'=>'xiaoming','age'=>20);
    $mongo->cms->user->insert($data);    //执行插入
    //修改操作 在控制台中的修改是:db.user.update({'name':'xiaoluo'},{'$set':'xiaoli'})
    $mongo->cms->user->update(array('name':'xiaoluo'),array('$set':'xiaoli'))
    //取出数据
    $arr=$mongo->cms->user->find();    //得到的是一个游标
    while($arr->hasNext()){
        $d=$arr->getNext();    //取得下一条记录是数据的格式
        echo $d['name'];
        echo $d['age'];
    }
211、在控制台下操作mongodb
    切换数据库:use cms 切换到cms数据库中(由于mongodb是无模式的数据库所以如果不需要主动创建数据库,只要里面插入数据则会自动生成数据库)
    插入数据: db.user.insert({'name':'xiaozhang'},{'age':20})
    删除数据: db.user.remove({'name':'xiaoluo'})    //删除了name为xiaoluo的一条记录
    修改数据: db.user.update({'name':'xiaowu'},{'$set':{'age':20}})    //将name为xiaowu的一条记录修改name为xiaoli 如果没有age这个字段则主动添加上
    查找数据: db.user.find()     //查找出所有数据
    按条件查询:db.user.find({'name':'xiaoluo'})    //查找出name为xiaoluo的记录
    查找数据: db.user.findOne() //查找出一条记录
    使用游标查询数据
    var data=db.user.find();    //得到一个游标 不能使用for语句遍历输出
    while(data.hasNext()){
        var dd=data.next();
        print(dd.name);
        print(dd.age);
    }
212、mongodb的特点:
    1、面向文档的数据库
    2、无模式(无需建表,也无需建数据库)
    3、以BSON格式存储数据(一种类JSON的格式)
    4、javascript作为操作语言
    5、支持多种语言:php、python、java、c++
    6、支持GridFS




posted @ 2013-10-25 23:24  罗导  阅读(1167)  评论(0编辑  收藏  举报