php笔记

2014-6-30    分类: php注入,网络安全

*phpfh

变量和常量区分大小写
$a =10;
$A =20;
以上变量名是区分大小写的.
echo Echo 不区分大小写
可变变量
php1

 

变量赋值[传递赋值(独立),引用赋值(关联)]
$one=10; //10赋值跟one
$two=$one //one赋值给two,即使改变one的值,two的值不会变

$two=&$one //引用赋值 改变one或者two就是等于改变了另一个变量。

PHP变量类型和JS一样都是不用去声明指定的类型,只要看值来判断变量的类型。
变量类型
php2

查看类型var_dump($a);

单引号 和 双引号 的区别,
如果只是单纯的输出字符串和转义\' \\就使用单引号,否则就是用双引号,
双引号可以同时输出字符串里面的变量和多个转义字符为什么不使用呢?因为会占用资源。
数据类型之间转换
setType(变量,类型)
例如:
$str="100.234abc";
setType($str,int); //输出的值是100,这个函数是在原类型上改变。

$a=(int)$str; //这个方法将字符串重新转型赋值给$a,原类型$str不会变。

$a=intval($str); // 此方法跟第二个一样都是类型临时转化。

类型临时转化的有:intval()、 floatval() 、strval()
以上都是强制转换
因为PHP是弱类型的语言不考虑类型转化就可以相加例如
$a=10;
$b="100abc";
$c=true;
$d=12.34;
$sum=$a+$b+$c+$d; //相加的话PHP会将其他类型自动转换成数字型,这就是PHP开发快的原因。
跟变量有关的PHP内置函数,如下
isset() //判断一个变量是否存在,不管变量是不是空都算存在。(null也算变量不存在)
empty() //判断一个变量是不是为空,为空的话返回true否则false。(""、0、"0"、null、false、array()、var $var都为空)
unset();//删除变量。
setType()//类型之间强制转换
var_dump()//查看类型(缩写),这个既能看到类型也能看到值
getType()//查看类型(扩写),只能看出类型。
判断变量类型函数(PHP强大就在于内置函数太多使用起来方便)
is_bool();
is_int() is_integer() is_long()
is_string()
is_float() is_double() is_real()
is_array()
is_object()
is_resource() //判断变量是否是资源类型
is_null()

is_scalar() //判断是否是 整形 浮点型 字符串
is_callable()//判断是否是有效的函数名
is_numeric()//判断一个变量是不是数字型
定义一个常量的方法
define("常量名","常量值");

判断一个常量是否存在用defined("常量名");

常量值永远不会变,也不能被unset()删除是全局变量,赋值只能是标量(int,float,bool,string)
常量的值一旦声明了也不能改。
运算符------

%取余数

.在PHP中字符串连接用的是.而在js中用的是+。
+= -= *= /= %= //例如 $a+=10; $a=$a+10;

.= //例如 $a.="abc" $a=$a."abc";

$str='<table>';
$str.='</table>'; //输出结果就是<table></table>
位运算符 在JS 和PHP 几乎很少用到

``符号可以里面可以执行系统命令然后将结果赋值给一个变量
例如
$str=`ipconfig /all`;

 

文件和文件目录的相关操作

echo basename('c:\www\1.php')   //只获取文件名 1.php

echo dirname('c:\www\1.php')  //获取路径  c:\www\

print_r(pathinfo('c:\www\1.php'))   //获得此文件的 绝对路径、格式、名称。

realpath('1.php')  // 获取到此文件所在的绝对路径 c:\www\1.php

魔法常量

__FILE__  // 获取文件绝对路径例如  c:/www/2.php

 

循环

范围判断使用if else
单个值判断使用switch

break //退出它所在的循环体,循环体后面的代码还执行

exit  //在它后面的代码一概都不执行

continue //退出此时刻的循环继续后面的循环

 

 随机数

echo mt_rand(0,100);  //包括0和100的0到100的随机整数。

格式化数据

$i=123456.789;

$b=number_format($i,2);  //对$i变量格式化,保留2位小数没有的话就.00补充

$b  //123,456.78

数学函数

abs()   //绝对值

floor()  //舍去小数保留整数

ceil()   //只要小数点不是0,都会向整数加1

round() //四舍五入

min()  //求最小数

max()  //求最大数

以上是常用的,其他的还有很多需要自己查资料了

函数
函数中末尾加上return $str,函数的值就会返回给调用处,调用就成了一个值,这样可以输入数据库。
例如
function table(){
$str='<table></table>';
return $str;
echo '1111'; //在return后面写代码无效,同时也可以使用return当作函数的结束语句。
}

echo table(); //table()就是一个值了。
echo table().'你好'; //如果是值数字也可以参与运算
函数中要使用函数以外的全局变量就要使用global,例如。
$a=10;
function table(){
global $a; //这样才能使用上全局的$a
$a+=10;
}
static 在函数中变量中声明此时的变量就相当于这个函数的全局变量,此变量会共用。
例如,
function test(){
static $a=0;
$a++;
echo $a."<br>";
}

test(); // a=1
test(); // a=2
test(); // a=3

函数里的参数变量和函数外的变量不会有冲突。

 

变量函数,就是把函数赋值给一个变量,然后变量括号里面穿参数。
例如,
function one($a,$b){
return $a+$b;
}

function two($a,$b){
return $a*$b;
}

$var=one; //自动寻找 函数名是one的函数
$var="two"; //自动寻找 函数名是two的函数

echo $var(3,4); //可以这样穿参数

 

为函数设置默认参数

function($a=10){   //设置默认参数

return $a;

}

 

数组

数组的一些特性
php3
1,如果数组索引0自定义在后面,那么索引0前面的数组元素都没忽略。
2,自定义数组索引,数组后面的索引默认接着最大一个索引开始。
php4

可以自定义索引,如果其他没有自定义的索引就默认是0开始
数组中加入数组
$user =array(array(),array(),array());

php笔记

 

 

数组遍历

1,for循环(数组的索引必须是数字和有规律,PHP中不推荐使用)
2,foreach php中推荐使用
foreach(数组变量 as 自定义变量){
循环次数由数组的元素个数确定;
每次循环都会将属性值赋值给自定义变量;
}

foreach(数组变量 as 自定义索引变量=>自定义属性值变量){
每次循环都会自动将数组的索引和属性值 赋值给自定义索引变量 和 自定义属性值变量
}

3,while() list() each() 组合使用

each(数组)
第一次调用返回数组的第一个属性和属性值,结果是数组,固定是属性是0,1,key,value,
0,key是属性
1,value是属性值
第二次调用返回数组第二个属性和属性值,以此类推。如果继续调用返回的就是false。

打印结果//Array([1]=>值 [value]=>值 [0]=>索引 [key]=>索引 );

 

list(数组)

list($a,$b,$c)=$array // $arry数组只能是下标为数字的才能使用list();
也就是说例如 $array=array('age'=>19,'name'=>'小陈') 这样的数组就不能赋值给list()
list()=数组 //将数组赋值给list()函数
list($name,,$age)=array('zhangsan',10,'男'); //要一一对应 *list()只能接受索引是数字的,并且按数字小到大赋值
例子一:
$user=array("id"=1,"name"=>"zhangsan","age"=>10,"sex"=>"nan");
list($key,$value)=each($user); //打印出 Array([1]=>1 [value]=>1 [0]=>id [key]=>id );
//但是list()的参数只能接受数字,虽然先打印出[1]=>1在到[0]=>id,
赋值顺序是[0]=>id先赋值给$key,[1]=>1在赋值给$value

例子二:
$ip="192.168.1.128";
$ips=explode(".",$ip); //将IP以点分割成为一个数组。
list(,,,)=explode(".",$ip);
3个函数组合使用例子:
$user=array("id"=1,"name"=>"zhangsan","age"=>10,"sex"=>"nan");
while(list($key,$value)=each($user)){ //利用while一直循环直到each执行到false的时候跳出while循环,
echo $key."-----".$valu; //each逐个调用赋值给list,思路在例子一。
}

控制数组执行步骤
next(数组) // 执行一次指针指向下一步。
prev(数组)
reset(数组) //返回第一个指针初始化意思
end(数组)
current(数组) //获取当前数组的属性值,执行多次指针不变。
key(数组) //获取当前数组的索引

 

!!用法其实就是将真实存在的数据转化成为布尔值 和JS用法一样
例如
echo each($array); //显示array 说明是有数据的 为true

echo !each($array); // null空白不显示数据

echo !!each($array); // 1 此时就转化成了布尔值

循环数组里的数组以下两种方法:

each_array

php2

 

 

 

数组的相关处理函数

索引/属性值 的操作
1,array_values(); //将数组的属性值取出来从新排列一个索引从0开始的新数组。

2,array_keys(); //取出数组的索引重新排列成一个数组索引又是从0开始。
array_keys(数组,"属性值",true) //这里的填写属性值就获取到此属性值的索引排列成一个数组
//第3个参数默认是false,如果写true意思是是否严格按照类型判断

3,in_array("属性值",数组,true) //判读这个属性值在不在这个数组里面,在返回true 不在返回false
//第三个参数为true,属性值的类型就必须严格匹配

4,array_key_exists("索引",数组) //判断索引在不在数组中

5,array_flip //将数组中的 索引和属性值 交换

6,array_reverse(数组) //数组里的元素顺序颠倒

 

统计数组元素个数 和 属性值的唯一性
1,count(数组,1) //统计数组里面的元素个数,如果加上1,就会将元素为数组的元素一样统计出来。

2,array_count_values //分类统计数组里面的属性值出现的重复次数,返回结果是数组。
例如返回 array( [linux]=>2,[apache]=>2 ); //属性值成了索引,重复个数成了属性值。

3,array_unique //移除数组中重复的属性值,保留原来数组不变创建新数组。
数组元素过滤

4,extract()  //将数组的索引转成变量。

例如$array=array('wo'=>'陈格');

extract($array);

echo $wo; //陈格
1,array_filter(数组,"函数")
例子:
$arr=array(1,2,3,-4,4,5,-5,-12);
$arr1=array_filter($arr,"myfun"); //将数组中的元素一个个带入函数中,true就重新返回数组false就删除。
function myfun($n){
if($n>0){
return true;
}else{
return false;
}
}
返回 //=array(1,2,3,4,5,-12);
2,array_walk() 例子说明
$arr=array("os"=>"linux","wb"=>"apache");
array_walk($arr,"myfun1","========");
function myfun1($value,$key,$p){
echo $key.$p.$value."<br>";
}
返回 // os========linux
wb========apache

array_walk($arr,"myfun1");
function myfun1(&$value,$key){ //属性值处加了&符号
$value="ffffff"; //统一将全部的属性值都重新赋值成为ffffff
}
返回 // array("os"=>"ffffff","wb"=>"ffffff");

 

3,array_map() //统一在原来属性值上添加相同内容
$arr=array("os"=>"linux","wb"=>"apache");
$arr1=array_map("myfun1",$arr); //将数组中的属性值带入函数中
function myfun1($n){
return "==".$n."==";
}
返回 // array("os"=>"==linux==","wb"=>"==apache==");
$arr=array("os"=>"linux","wb"=>"apache");
$arrr=array("os"=>"win","wb"=>"iis");
$arr1=array_map("myfun1",$arr,$arrr); //两个数组长度要一样
function myfun1($n,$t){
if($n==$t){
return "same";
}
return "diff";
}

返回 // array([0]=>diff,[1]=>diff);

php3

数组的排序函数

sort() //根据值小到大排序 (索引被改变成从0,1..)

rsort() //根据值大到小排序 (索引被改变成从0,1..)

ksort() //根据索引值小到大排序 并保留原来的索引和值的关系

krsort() //根据索引值大到小排序 并保留原来的索引和值的关系

asort() //根据值小到大排序 并保留原来的索引和值的关系

arsort() //根据值大到小排序 并保留原来的索引和值的关系

自然数排序
natsort() 区分大小写
natcasesort() 不区分大小写

例如
$data=array("file1.txt","file11","file2.txt","file22.txt");
如果使用普通的排序例如是sort()结果是
("file1.txt","file11","file2.txt","file22.txt")
file11排在了file2后面显然不是我们想要的
如果使用natsort(),排序结果会正常。
("file1.txt","file2","file11.txt","file22.txt")
如果区分大小写那么大写的会排在前面
("File2.txt","file1","file11.txt","file22.txt")

用户自定义排序
usort() uasort() uksort()

例如usort() //小到大排序 索引会重新赋值0 开始

$arr = array("Peter", "glenn","Cleveland","peter","cleveland", "Glenn");
usort($arr, "my_sort");

function my_sort($a, $b)
{
if ($a == $b) return 0; //0 排序不变
return ($a > $b) ? -1 : 1; //a>b,a赋值1向后退 否则赋值-1前进
}
print_r ($arr);

uasort() // 跟usort功能一样但是索引值不变

uksort() // 大到小排序 但是索引值不变

数组拆分 合并
$a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
array_slice() //过滤数组,选指定数组中的元素
print_r(array_slice($a,1,2)); //[0] => Cat [1] => Horse
print_r(array_slice($a,-2,1)); //[0] => Horse

array_splice() //过滤数组,跟上面差不多

array_combine($a1,$a2); //合并数组, $a1数组是索引,$a2数组为值,两数组合并成一个数组

array_merge($a,$b,$c,....); //合并数组,前面的数组如何后面的数组索引重复,就会被后面的覆盖。
array_merge($a) //输入单个数组,索引从默认从0开始。
参考http://www.w3school.com.cn/php/func_array_merge.asp

array_intersect($a1,$a2); //选出数组公共的部分,选出的数组索引以$a1的为准

array_diff($a1,$a2);//选出不同的部分排列为数组,选出的数组索引以$a1的为准

栈(最后进的最先出,就像上子弹一样)

例如在数组中入栈(向数组添加元素)
$a1=array('php','word');
$a1[]='one'; //数组末尾增加元素,入栈推荐使用这种方法
$a1[]='two';

array_push($a1,'one','two'); //数组末尾增加元素,改变原数组。

array_pop($a1);//出栈默认删除最后一个,最后进的最先出

堆(先进先出,就像吸管一样)

array_unshift($a1,'one','two'); //数组最前面添加元素,改变原数组。

array_shift($a1,'one','two'); //删除数组最前面元素。

unset() //可以删除变量,数组中的元素,对象中的成员。
unset($a1[5]);

其他操作数组函数

array_rand($a1,1); //随机取1个数组的索引

如果随机获取2个要怎么写:

array_rand

shuffle($a1); //随机排列数组。

array_sum($a1); //数组中的元素求和

range()//创建简单有规律的数组。
range('a','k') //索引是0,创建a到k的数组
range(0,50,10) //索引是0,创建一个数组值是0到50并且数值差为10

 

 文件包含

require('demo.php')  //引入的文件不存在,以下的代码不会执行。

include()  //  引入的文件不存在,以下的代码继续执行。

require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误
include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误。

 

 

 

字符串操作处理

为什么要处理字符串,是因为字符串是要写入数据库为了减少冗余和提供安全必须要对字符串处理之后才传入到数据库,防止恶意注入。

trim()  //清除字符串最两边的空格。

ltrim()  //清除最左边

rtrim()  //清除最右边

nl2br()  //效果是将用户的回车键和\n在html上解析成<br>,例如发贴需要回车换行。

htmlspecialchars()  //将特殊字符转义,主要防止XSS

strip_tags()  //删除字符串里所有的html标签

addslashes()  //将特殊多加一个\转义(在传入到数据库中)

stripcslashes()  //多出来的/删除掉  (在显示到页面中)

explode('@','chen@163.com')  //按@拆分成一个数组。

implode('@',数组)  //将一个数组里的元素用@合并成一个字符串。

strtok()  //将一个字符串以多个分割点为准进行分割,例如:

php_strtok

 

substr('字符串',0,2)   // 从第0个位置开始取2个字符串,返回字符串

str_split('字符串')   //将字符串拆分成单个个体,返回数组

strrev('字符串')   // 将字符串顺序倒过来

字符串比较

strcmp('c','b')  //c>b 返回1  < 返回-1  =返回0,区分大小

strcasecmp()  //不区分大小

strnatcmp('2','10')  //按自然排序,把10看成一个数字

strcmp('2','10')  //按非自然排序,10看成了1

substr_count('abcde','a')  //a 在字符串出现的次数

strlen('abc')  //3  字符串长度

strstr('abce','b')   // 得到 bce  ,区分大小写

stristr('abce','B')   // 得到 bce  ,不区分大小写

strpos('abceb',‘b’)  //返回1索引0开始,查找某字符串最先出现在一段字符串的什么位置

strrpos('abceb',‘b’)  //倒序,最后出现的位置

str_replace('Lee','Wq','This is Lee!')  //This is Wq 字符串替换

substr_replace('abce','$$$',0,2) // $$$ce   从第0个位置开始替换2个

*注意以上的方法适用于英文字符串处理对于中文字符串处理还需要百度下

时间戳

详细设置方法点这里

date_default_timezone_set('Asia/Shanghai')  //先设置服务器时区

checkdate(7,16,2015)  //月日年  检查时间是否有误

date('Y-m-d H:i:s')  // 2015-11-11

time()  //直接获取当前时间戳

date('Y-m-d H:i:s',时间戳)  //第二个参数加入时间戳可以转化成 正常时间格式

gettimeofday()  //返回数组,返回当前时间信息。

getdate() //返回数组,获取详细的当前时间信息。

mktime(时,分,秒,月,日,年)   //获取指定时间戳

strtotime('2011-11-11 20:20:20')  //将指定时间转成时间戳

microtime()  //返回 当前微妙数和时间戳  (微妙数+时间戳就是当前最精确时间)

Cookie 与 Session区别

cookie和session都可以跨页面获取到另一个页面设置的值

cookie用途:存储在客户端中,记录会员登录信息,购物车。。因为它不占用资源服务器,关浏览器自动删除。

session用途:存储在服务器端,服务器才能获取客户端不能,用在后台管理登录人少的,安全一段时间不操作就自动过期默认1440秒后自动删除,关浏览器也自动删除。

setcookie('name','lee',time()+(7*24*60*60))  //创建一个cookie属性为name值为lee,且在7天后过期

$_COOKIE['name']  //获取name的值  (慢2,3秒才能获取到)

setcookie('name','lee',time()-1)  //删除一个cookie 让时间过去1秒

使用session前 必须之前开始功能 session_start()

$_SESSION['name']='lee';  //创建一个session

$_SESSION['name']  //获取

unset($_SESSION['name'])  //删除指定session

session_destroy()  //删除所有session (删除慢2,3秒)

上传文件相关函数

案例https://www.xgllseo.com/zp/imgup/img.php

PHP上传配置是在php.ini这里设置的,重要参数是:

file_uploads  //服务器是否开启上传

upload_max_filesize  //设置文件上传最大MB

<form enctype="multipart/form-data">  //此属性必填否则不能上传

<input type="hidden" name="MAX_FILE_SIZE" value="1000000"> //推荐设置一个隐藏域这里可以快速判断上传的文件大小是否操作了服务器允许的大小免去了用户上传后才发现自己上传的文件超过了服务允许的大小等待的时间。

$_FILES  //返回一个数组,可以获取到上传文件的信息,例如

name   //文件名   123.jpg

type   //文件类型  image/jpg  不同浏览器显示类型不一样要注意兼容

tmp_name  //获取临时文件 用于判断上传的文件是否成功

error  //返回数字,上传成功返回0,其他不同数字返回的错误信息不一样

error1

size  // 文件大小 字节单位

如果获取文件信息?例如

<input type="file" name="userfile" />

$_FILES['userfile']['tmp_name']   //原理同上

is_uploaded_file()    //判断文件是否上传成功 (必须用post方式上传文件)

例如:is_uploaded_file($_FILES['userfile']['tmp_name'])

move_uploaded_file(临时文件地址,存放地址)

例如:move_uploaded_file($_FILES['userfile']['tmp_name'],‘upload/123.jpg’)

is_dir()  //判断一个目录是否存在

mkdir('upload',0777)   //创建一个目录

 

php操作数据库(增、删、改、查)

$conn = mysql_connect('localhost','root','123');   //连接

mysql_select_db('school');    //选择数据库

mysql_query('SET NAMES UTF8');   //  设置字符集

$query = "SELECT * FROM grade";   // 查询grade表下所有信息

$result = mysql_query($query);   //执行成功,返回数组

print_r(mysql_fetch_array($result,MYSQL_ASSOC));   // 看返回数组信息

mysql_free_result($result);  //释放记录集资源

mysql_close();  //关闭数据库

 

新增数据
$query = "INSERT INTO grade (name,email,point,regdate) VALUES ('胡心鹏','bigbird@sina.com.cn',67,NOW())";
@mysql_query($query) or die('新增错误:'.mysql_error());

修改数据
$query = 'UPDATE grade SET point=87 WHERE id=8';
@mysql_query($query) or die('修改错误:'.mysql_error());

删除数据
$query = "DELETE FROM grade WHERE id=8";
@mysql_query($query) or die('删除错误:'.mysql_error());

 

例子:把某表的每行数据都遍历出来

$query = "SELECT id,name,email,regdate FROM grade";
  $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
  while (!!$row = mysql_fetch_array($result)) {
  echo $row['id'].'----'.$row['name'].'----'.$row['email'];
  echo '<br />';
 }

php操作mysql常用函数:

mysql_fetch_array();   //返回一个数组,显示数据库信息

mysql_field_name($result,3)   //显示指定 字段名称

mysql_num_rows();  //有多少行数据

mysql_num_fields() // 多少字段

 

 

字符串截取

mb_substr($str,1,20,'utf-8')  //载入字符串,开始位置,截取多少内容,字符集

获取字符串长度

mb_strlen($str,'utf-8')

 

php面向对象

php5