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)此中:\/?表现斜杠可无可有,匹配开始和关闭标签。[^>]+表现如果不是右尖括号的字符
重复一次或多次。
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 "new1";
$a=session_name();
$b=session_id();
echo "new2";
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文件
test.php文件
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/}
如:
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.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
页:
[1]