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
相关文章: