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 ;
    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




相关文章:

  • 2021-12-24
  • 2021-05-26
  • 2021-07-03
  • 2021-11-04
  • 2021-09-14
  • 2021-12-03
  • 2021-06-15
  • 2022-02-22
猜你喜欢
  • 2021-11-12
  • 2021-12-01
  • 2021-09-15
  • 2021-07-01
  • 2021-12-02
  • 2022-01-18
  • 2021-10-02
相关资源
相似解决方案