您的位置:首页 > 编程语言 > PHP开发

自学php笔记

2013-12-24 12:39 351 查看
1,函数名称是不区分大小写的,但是变量名称是区分大小写的,
2,在MySql中sql执行的语句是不分大小写的,但数据库和表名是区分大小写的
3,在sql语句中,字符串要用一组单引号''或者双引号""包起来,
4,当字段是字符串型是必须用一组''或者""包起来,否则会报错;当字段是int数值形式标准是不用引号,但如果用了也不会报错,MySql会自动转换为相应数值型
5,mysql中的自我复制
insertinto表名1(字段名,..,..,..)select字段名,..,..,..from表名1


var_dump()一个函数向页面输出类型



对于.这个并置的字符串运算
$m=123;
$n=23;
echo"$m"."$n";
结果依然是字符串的链接12323;

instanceof判断是否属于一个类的对象;


例如:
classA{
....
}
classBextendsA{
......
}
$b=newB()
$binstanceofB返回true
$binstanceofA返回true
$binstanceofDisplayable返回false(由于A和B都没有实现接口)
注意:




在php中,当给函数/方法传入参数时,不能传递该参数的类型,但可以使用类类型提示,指定必须传入的参数类类型
如果传入的参数类类型不是指定的类型,将产生一个错误
functioncheck_hint(B$b){
....
}
正确;
functioncheck_hint(A$b){
....
}
正确,因为$b是类B的实例,但类B继承了类A
但如果$a是类A的实例,使用下面的传入是错误的
functioncheck_hint(B$a){
..........
}


php中没有无符号数,都是有符号数。





计算机底层都是以补码的形式进行的
正数
原码=反码=补码
负数
反码:符号位不变,其他各位取反
补码:在反码的基础上,加一

所以对于位运算时要注意的是:
1.计算机底层是以补码的形式运行的,所以位运算首先要写出各自的补码,然后才能进行位运算。
2.对于位运算的理解:是逐为与、或、取反等等,此时包括符号位,所以负数的~是正数:~-5=4;

对于左移和右移:(注意:上面所说的对于计算机底层的运行形式:补码在这里依然是这样,要以补码形式来进行位移)
1.无论是左移还是右移,符号位都是不变的
2.右移,低位溢出,高位用符号位来补
3.左移,低位补0;

php数组:
php数组中可以存放任意类型的数据类型;

*包括null、数组、对象


php中的索引可以是自己指定;同时true、false、null也是可以的,小数为索引是自动截断小数部分

print_r()打印关于变量的易于理解的信息,(来显示数组的有关信息)
print_r()打印关于变量的易于理解的信息。(详细内容见php参考手册)
var_dump()打印变量的相关信息
对于print_r()和var_dump()区别:
没有明显的区别只是var_dump()打印的变量信息更多更全面,而print_r()打印的是易于理解的信息(注意手册中的说法)

php中的数组是可以动态增长的:


$a=array(2,3);|$a=array(2,3);

$a[2]=56;|$a[3]=45;

echo$a[2];|echo$a[3]

输出:56|输出:45



上面的例子说明php中的数组灵活性很大,在许多语言中上面的写法是错误的,

explode(,)对字符串拆分

定义数组array()

可以用array()语言结构来新建一个array。它接受任意数量用逗号分隔的键(key)=>值(value)对。

二维数组:

$arr=array(arr(....),array(....),array(....));

$arr[0]=array(.....);
$arr[1]=array(.....);
$arr[2]=array(.....);

关联数组:


$arr=array(1=>arr(....),"sd"=>array(....),"12"=>array(....));

$arr[1]=array(.....);
$arr["sd"]=array(.....);
$arr["12"]=array(.....);

注意:(数组中有很多需要注意的地方,详细要阅读参考手册)



1.如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

<?php

//这个数组与下面的数组相同...



array(5=>43,32,56,"b"=>12);





//...



array(5=>43,6=>32,7=>56,"b"=>12);



?>


2.观察下面的数组错误:
$arr=array($a1,$a2);
$a1=array(....);
$a2=array(...);
此时的错误时上面的两个变量和下面的定义变量只是名字表面一样,而且上面的数组中给的变量没有明确,本身就有语法问题,
如果要实现就要调整位置:
$a1=array(....);
$a2=array(...);
$arr=array($a1,$a2);
这里主要注意的是:函数是顺序执行的,所以要先把$a1和$a2数组变量定义好,然后程序执行到$arr=array($a1,$a2);才能明白其中的$a1和$a2是哪个具体的数组。

******
数组中还有很多的要注意的地方,有问题要详细查看参考手册
******

关闭notice级别的错误

1.在php.ini文件中改动error_reporting

改为error_reporting=E_ALL&~E_NOTICE

2.如果只是想在提示notice错误的页面禁止notice,就需要加上这句话
error_reporting(E_ALL^E_NOTICE)

php排序
1.冒泡法
2.选择排序
3.插入排序
4.快速排序

查找:快速查找、二分查找(前提:二分查找的数组必须是一个有序数组)

php面向对象
创建类方法:

class类名{

......

}

创建对象:

$对象名=new类名();
$对象名=new类名;


访问对象属性:

$对象名->属性名;



****
现实项目中我们命名类文件的名称是遵循这样的规律:类名.class.php
****


对象在内存中的存在形式:



所以对于实例对象之间的相互赋值:$b=$a;
对于变量$a赋给变量$b,就是将变量$a存储的地址给变量$b,此时堆区中的实际对象存放地址同时被变量$a和$b指向,
但是对于数值变量:

$a=78;
$b=$a;
$b=$b+8;
echo‘$a’;
echo‘$b’;
输出:78

86
此处$b=$a是值传递;



$a=78;
$b=&$a;
$b=$b+8;
echo‘$a’;
echo‘$b’;
输出:86


86

如果给函数传递的是基本数据类型(整数、小数、布尔、字符),究竟传递的是什么?

在默认的情况下传的是值,如果你想传入地址可以使用&

当给函数传入参数对象时是:地址传递

在php中,如果给函数传递的是数组,则默认情况下是传值(值拷贝);如果希望传入地址,则应当加&(&$数组名)

成员方法(函数)

形式:访问修饰符function方法名([参数列表]){


方法体;
return结果;(此处也可以不返回,根据实际需求)





}


对比前面学过的函数,我们可以发现,他们非常的相似,这里只是多了一个访问修饰符和放置的位置不同(成员方法在类里面)
调用成员方法的机制和前面我们学习的调用函数的机制是一样的。
注意:虽然php中的类定义方式和java中的很相似,但是php中的成员方法和java中的成员方法在定义时是有区别的:function,在java中是不需要这个关键字的。



文件代码的引入:



require'object.php'
require_once'object.php'
include'object.php'
include_once'object'



变量的作用域:


作用域指的是在一个脚本中某个变量可以使用或可见的范围,php具有6项基本的作用规则
1.内置超级全局变量可以在脚本的任何地方使用和可见
2.常量,一旦被声明,将可以在全局可见,他们可以在函数内外使用
3.在一个脚本中声明的全局变量在整个脚本中是可见的,但不是在函数内部
4.函数内部变量声明为全局变量时,其名称要与全局变量名称一致
5.在函数内部声明的静态变量,函数外部是不可见的,在函数的多次执行过程中保存该值
6.函数内部创建的变量对于函数来书是本地的,当函数终止时,该变量也就不存在了。


超级全局变量:

$GLOBALS['']全局变量数组,键值就是变量名($GLOBALS['var']等效于global$var)
$_GET['']
$_POST['']
$_SESSION['']会话变量数组
$_COOKIE['']cookie变量数组
$_REQUEST['']所有用户输入的变量数组,包括$_GET$_POST$_COOKIE所输入的内容
$_SERVER['']
$_FILES['']
$_ENV['']





当成员方法中使用全局变量:$GLOBALS['var']global$var$this->var




php构造方法:具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

特点:1,没有返回值



2,当创建一个类的新对象时,系统会自动调用该类的构造方法完成对新对象的初始化
3,可以重载(重载只是一种语法规则),不能覆盖




形式:



php4中:
class类名{





publicfunction类名(参数列表){
......
}





}



php5中:
class类名{





publicfunction__construct(参数列表){



....



}



publicfunction类名(参数列表){
......
}



}


当上面两个构造方法同时存在于一个类中时,优先选择第一个第一个function__construct(){},并且一个类中只能有一个构造方法起作用,之所以一个类中写两中主要是为了考虑兼容。

php析构方法:


析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

主要用于释放资源


形式:

function__destruct(){



......


}

析构方法自动调用
析构方法主要用于销毁资源
析构方法调用的顺序,先进后出也就是栈
析构方法什么时候被调用:


1.程序退出时
2.当一个对象成为垃圾对象(没有任何变量再引用该对象)时,该对象的析构方法就会被调用
一旦一个对象成为垃圾对象,析构方法就会立即调用
3.一个类只有一个析构方法,并且析构方法没有参数列表

php静态变量(static),也称类变量类方法


定义静态变量:
访问修饰符static变量名;
访问静态变量:




在类外部:类名::$类变量名
在类内部:sel::$类变量名或者类名::$类变量名



注意:

静态变量和方法可以不实例化类直接访问,不能通过类对象访问其中的静态成员(除静态方法外)
为兼容php版本,如果没有说明可见性,默认是public
不能用非静态的对象名->操作符这种方式访问静态变量
同样不能使用::来访问一个非静态的

php静态方法(类方法
形式:

访问修饰符staticfunction方法名(){

......

}


访问静态方法:
在类外部:类名::类方法名或者对象名->类方法名
在类内部:sel::类方法名或者类名::类方法名
当我们操作静态变量的时候,我们可以考虑静态方法


注意


静态方法中不能访问非静态方法

由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用

非静态方法既可以操作非静态变量也可以操作静态变量

静态方法只能操作静态变量



php面向对象三大特征:继承、封装、多态
一、封装:就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,只有通过成员方法才能对数据进行操作
封装中重要的访问控制符:





以上访问修饰不写时,默认是public


**那么如何访问这些限制符修饰(protected、private)的数据?


php为我们提供一对方法(‘魔术’方法/函数--详细见参考手册:类与对象->魔术方法):
__set()
__get()
上面的方法管理了所有的,现在已经不建议使用。
建议使用自己写的特定的方法:
publicfunctionsetXxx(参数列表){





...



}

publicfunctiongetXxx(){
...
}


二、继承:对已存在代码的扩展,实现代码的复用
三、多态:简单的概括为“一个接口,多种方法”,在程序的运行中才决定调用哪个方法/函数。多态是允许你将父对象设置成为和它的一个或更多的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作



***php成员方法中相互调用时前面加$this->test();***

php继承()


形式:
class类名extends父类名{



.....

}
根据上面的访问修饰符我们就可以知道,在继承中:子类只能继承父类中的由public、protected修饰的变量和方法;而被private修饰的变量和方法是不能被继承的。


php中的继承是单继承,意思就是说只能有一个父类,
但是可以b继承a,c继承b,此时c中就有一些a中的属性或方法,当然这种连续的继承可以不限次数(当实在需要多重继承时,我们可以勉强使用这种方法来替代,但这种实现方式和多继承是不一样的,如果想试想“多重继承”我们可以使用接口)




当创建子类对象时默认不会自动调用父类的变量和方法

如果我们想在子类中调用父类的构造方法或者其他方法,形式:
类名::方法名()
parent::方法名()//此处的parent不能大写当在子类中调用父类方法时,里面的$this->变量指的是当前子类重写的那个同名变量值


php多态
php方法的重载(overload)


方法的重载是多态的一种实现,重载指的是:多个方法具有相同的方法名,但是参数列表个数、类型会有不同,通过参数列表的不同来区分这些具有相同名称的方法。
注意:





php5虽然可以支持重载,但在具体的实现上与其他语言有较大的差别。如果试图定义多个同名的方法,那么程序运行将会报错

重载实现:(第73讲)



1.php5默认情况下不直接支持方法重载


2.可以使用‘魔术’方法:__call具体形式见参考手册类与对象->重载(不推荐这样用)来模拟重载的效果

php方法的覆盖/重写(override)

重写/覆盖试想:具有相同的方法名(参数列表)和参数列表注意:但是这里的参数名称是可以不一样的



子类方法的访问修饰符必须>=父类方法的访问修饰符

php多态体现:


若果子类覆盖父类的方法,就调用子类方法;如果子类没有覆盖父类的方法,则调用父类的方法

php抽象类:(本身不能被实例化,主要是为了继承,抽象类可以继承实体类和抽象类3)
形式:

abstractclass类名{



$变量名=xx;



abstractfunction方法名(参数列表){
。。。。
}




}

注意:


1.抽象类和抽象方法前面必须加abstract
2.当一个方法被abstract修饰时此时它所在的类也必须是抽象类
3.抽象类不一定必须包含抽象方法,也就是说抽象类可以没有抽象方法
4.抽象类中也可以有不是抽象方法的方法(正常的方法),也就是说抽象类中可以由抽象方法、也可以有正常方法;但是有抽象方法的类必须是抽象类
5.当子类继承一个抽象类(父类),此时要求子类要么声明为抽象类,要么实现父类中的所有抽象方法,否则会报错。
6.抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数



php接口:接口的作用就是定义一些方法,等着其他类来实现它;接口体现了编程中的搞内聚,低耦合
接口使用的基本语法:

interface接口名{



属性(默认是public,必须是常量,此常量调用:接口名::常量名);
方法头;



}
注意:





1,接口中的方法都不能有方法体

2,可以同时实现多个接口
3,实现接口需要实现接口中的所有方法,
4,接口都不能被实例化
5,接口的方法必须都是public,默认就是public
6,接口不能继承类,但接口可以继承接口(接口继承接口是多重继承),类和接口之间是实现(抽象类也能实现接口)

class类名implements接口名【可以同时实现多个接口】{

......

}


什么时候使用接口?
1,定规范
2,定下规范,让别的程序员来实现
3,当多个类之间是平级的(没有继承关系),这些类都要实现某些功能,只是实现的这些功能在各个实现类中的方法体操作不同(比如添加学生信息到数据库和添加到xml中,都是添加学生信息,但具体的添加操作却在不同类中不一样)



php中继承和实现的比较:

1,我们可以认为实现接口是对单一继承功能上的补充
2,在不破坏类层级关系的前提下,对某个类功能扩展
什么时候使用抽象类?什么时候使用接口?

1.接口里面方法都是没有实现的,
抽象类里面可以有部分是实现的方法
2.由于1中提到的接口和抽象类的区别我们可以想到:当我们在许多子类中有一些共同的方法时,我们可以在抽象类中实现这个方法,然后集成的子类中就可以用,而不用每个中的去实现它(这就是抽象类中允许出现实现的方法),而接口更多时是提供给我们方法,但要求我们自己实现,具体看下面例子:


比如做一个画面的功能。
定义一下画图的接口,一个画的方法。
这样,你可以有子类画矩形,画圆。。。。但这样,你不能做一些共通的功能。
如果是一个抽象类就好一些。
定义一个画图的抽象,一个抽象的画的方法。一个清除的友好方法。
这样你的子类都可以调清除方法。来清除画过的东西。



3,开发过程中,用的比较的多的还有一种是接口和抽象的结合使用,
写一个接口,然后再写一个抽象类(implements此接口),在抽象类中实现部分方法,具体类继承此抽象类,实现此接口。



php关键字final


PHP5新增了一个final关键字。

1.如果父类中的方法被声明为final,则子类无法覆盖该方法(但是可以继承,继承下来不覆盖,就是说你可以调用父类中的这个方法,使用。但是不能覆盖重写方法体);

2.如果一个类被声明为final,则不能被继承。

3.final不能修饰变量


php关键字const

const常量名(大写,不能有&且不能有修饰符)=初始值;
调用:类名::常量名或sel::常量名(不能使用$this->常量名)




接口::常量名



注意:

1,常量默认是全局可见的,并且系统规定了,不能修改,所以常量前面不能有修饰符
2,常量一定定义,就要立即初始化(赋值)。并且常量初始化完成后就不能在修改(常量不是属于某一个实例的,所以不能修改,知道常量在内存中的存在就很好理解,见下图)
3,define['常量名',值]和这里的const是一样的效果,提倡使用const






php错误和异常处理:

php错误处理三种方式:


1,使用简单的die()
2,创建自定义错误函数(处理器)这是针对系统错误的





语法:(下面的函数名可以改)



error_function(error_level,error_message,error_file,error_line,error_context)







错误级别:










错误处理程序或错误处理句柄:
set_error_handler(设置处理错误的回调函数【例如上面处理错误的函数error_function】,【错误的级别】)




使用例子:



<?php
//errorhandlerfunction
functioncustomError($errno,$errstr)
{
echo"<b>Error:</b>[$errno]$errstr";
}

//seterrorhandler
set_error_handler("customError");

//triggererror
echo($test);
?>


输出:



Error:[8]Undefinedvariable:test




3,错误触发器(trigger_error())针对处理逻辑错误



类似与上面2的处理机制,修改处理句柄和处理函数,只是处理句柄中的错误级别分别是E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE
形式:



调用错误触发器的时候同时指定错误级别(E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE【默认】)



trigger_error(“错误输出信息”,错误级别)

php错误日志保存



error_log($err_info."\r\n",3,"myerr_info.txt");


php异常处理(php中的异常需要手动throw抛出,无法想java一样当try块内出现异常时系统自动抛出异常)



1.进行异常处理的代码放在try代码块内,每个try后至少有一个catch捕获异常,可以有多个catch捕获不同的异常


2,当捕获到一个异常后,try{}块里面的后续代码不继续执行


3,当抛出一个异常,但没有catch捕获,则提示一个UncaughtException....(未捕获异常)


4,当catch一个异常时,在catch块里可以处理异常也可以不处理异常
5,php允许catch块内再次抛出(throw)异常
6,可以自定义异常类



classmyExceptionextendsException{



.......



}


自定义顶级异常(就是修改系统默认的异常)



1,异常处理函数(异常处理器)



functionmyException($exception){



......



}
2,异常处理句柄



set_exception_handler("异常处理函数名");

错误和异常:


php中的异常需要手动throw抛出,无法想java一样当try块内出现异常时系统自动抛出异常
php中的错误发生时可以自动调用错误处理器


php进阶






http协议(83-88)


1,http协议是建立在tcp/ip协议的基础上
2,我们的web开发,数据的传输都是建立在http协议上的
3,http协议全称超文本传输协议








超全局变量$_SERVER



$_SERVER是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(scriptlocations)等等信息的数组。这个数组中的项目由Web服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。(在这个超全局变量$_SERVER['此处有数组索引(具体索引意义看手册)'])




页面的跳转:



header(“Location:demo.php”)



http中的请求方式:



GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT,其中最常用的时候GET和POST
GET和POST的区别:




1,安全性上,GET请求的数据会显示在地址栏中,POST请求的数据会放在http消息体里
2,可以从提交数据的大小看




2.1,http协议本身是没有限制数据的大小的
2.2,限制数据的大小是浏览器对GET和POST的限制,一般上限制GET请求数据为:2K+35,对POST没有限制,因为POST请求数据是放在消息体中的而GET请求数据是放在地址栏中的,所以浏览器对GET请求的数据做出了大小限制

3,由于上面提到的GET请求数据会放在地址栏中,所以需要收藏书签时使用GET请求会更好些

http状态行(状态码)





php数据库编程

php有三种方式操作mysql数据库


1,mysql扩展库:



mysql扩展库是php程序中的一个专门存放操作mysql数据库函数的库



2,mysqli扩展库
3,pdo


环境搭建:



启用mysql扩展库,在php.ini文件中去配置mysql扩展库(extension=php_mysql.dll即为启用;extension=php_mysql.dll为没有启用)
可通过函数phpinfo()--输出关于php的配置信息

对于下载http表头信息设置







dropdatabasedatabase1//删除整个数据库



droptabletest//删除表的数据和结构
deletetabletest//删除表的数据
MD5(‘xxx’)加密


对于mysql客户端汉字添加乱码处理






SQL语句不区分大小写,但数据库和表的名称是区分大小写的

php连接数据库:

mysql扩展库操作mysql数据库步骤如下:


1,获取链接
$conn=mysql_connect("localhost/127.0.0.1","root","root");



第一参数:MySQL服务器名称。可以包括端口号,例如"hostname:port",
第二个参数:mysql服务器用户名
第三个参数:用户密码
例如:



$conn=mysql_connect("localhost","root","root");
if(!$conn){



die("连接失败".mysql_error())//mysql_error()函数显示连接失败错误信息



}else{



echo"连接成功";



}


2,选择数据库


$ret=mysql_select_db("数据库名",[$conn])


mysql_select_db()设定与指定的连接标识符所关联的服务器上的当前激活数据库。如果没有指定连接标识符,则使用上一个打开的连接。如果没有打开的连接,本函数将无参数调用mysql_connect()来尝试打开一个并使用之。



第一个参数:数据库名
第二个参数:可以不写,MySQL连接。如不指定连接标识,则使用由mysql_connect()最近打开的连接。如果没有找到该连接,会尝试不带参数调用mysql_connect()来创建。如没有找到连接或无法建立连接,则会生成
E_WARNING
级别的错误。


3,设置操作编码
mysql_query("setnamesutf8");
保证我们php程序是按照utf-8码操作的
4,发送指令sql(ddl数据定义语句,dml数据操作语言【update、insert、delete、】,dql(select),dtl数据事物语句rollback,commit....)
$sql="select*from表名wherexxx=xx";
$res=mysql_query($sql,[$conn]);//mysql_query—发送一条MySQL查询



第一个参数:sql语句
第二个参数:选填,可以不填,和上面的意思一样;
例如:



$result=mysql_query("SELECTmy_colFROMmy_tbl")
ordie("Invalidquery:".mysql_error());





5,接受返回结果
6,释放资源,必须当$res是资源类型时
mysql_free_result($res)
关闭连接
mysql_close($conn);//可以没有,建议有,如果有和没有系统都会在一段时间后关闭

2,mysqli扩展库:mysql(mysqlimprove)mysql扩展库的增强版


1,mysql扩展库和mysqli的比较



1.1,mysqli的稳定性、安全性和效率有所提高
1.2,mysqli支持面向对象编程,同时也向前兼容提供了面向过程的编程;也就是说以前的mysql是面向过程的





mysqli提供了两套库:面向对象函数库和面向过程函数库;其中的函数都是每每对应;


2,mysqli的入门案例



2.1,配置php.ini文件让php支持mysqli扩展库



extension=php_mysqli.dll

2.2,建库、建表



使用以前的数据库

2.3,编写代码







程序中的$res代表sql语句执行的结果



如果执行的是DML语句,则返回bool值
如果执行的是DQL语句,则返回的是MySqli_Result结果集对象

mysqli扩展库中提供四种方式来获取mysqli_result结果集


面向对象/面向过程mysql扩展库



mysqli_result::fetch_row/mysqli_fetch_row<==>mysql_fetch_row
mysqli_result::fetch_assoc/mysqli_fetch_assoc<==>mysql_fetch_assoc
mysqli_result::fetch_array/mysqli_fetch_array<==>mysql_fetch_array
mysqli_result::fetch_object/mysqli_fetch_object<==>mysql_fetch_object



mysqli中释放结果和内存有三种方式:


面向对象



voidmysqli_result::free(void)
voidmysqli_result::close(void)
voidmysqli_result::free_result(void)

面向过程:
mysqli_free_result



php中超全局变量:9个

$_GET通过GET方法传递给该脚本的变量数组
$_POST通过POST方法传递给该脚本的变量数组
$_REQUEST所有用户输入的变量数组,包括$_GET、$_POST、$_COKIE
$_FILES与文件上传相关的变量数组


$_ENV环境变量数组

$_COKIEcookie变量数组
$_SESSION会话变量数组
$_SERVER服务器环境变量数组
$GLOBALS所有全局变量数组


1,$_GET
1.1,检查是否接受到数据时,使用isset()或empty()函数,最好使用empty()


例如:if(empty($_GET['name'])){
。。。
}else{。。。。。}



1.2,注意汉字在不同浏览器中乱码,特别是IE5.5、IE6




3,$_REQUEST所有用户输入的变量数组,包括$_GET、$_POST、$_COKIE
由于$_REQUEST可以接受上面三种方式提交的数据,$_GET方法还可以在地址栏中注入,所以得到的这个变量数据不可信

当不清楚页面是以什么方式提交的时,我们可以使用$_SERVER['REQUEST_METHOD']方法来判断
不过一个来说我们是清楚自己的页面是什么方式提交的,很少用到



MVC设计模式
控制器(Control)设定原则:
我们没有必要每一个请求,就对应一个控制器,可以把同一逻辑的请求,提交给一个控制器即可

session和cookie是最重要的用户行为跟踪技术
cookie:
boolsetcookie(string
$name
[,string
$value
[,int
$expire
=0[,string
$path
[,string
$domain
[,bool
$secure
=false[,bool
$httponly
=false]]]]]])
1,第一个参数$name<-->第二个参数$value也就是一个key对应一个valuecookie可以保存多个key<==>value对
2,cookie第三个参数(time()+3600)time()表示格林威治时间,加上一个预定结束cookie的时间秒数,
注意:如果没有正确设置时间或者没有设置时间,cookie是不会保存到客户端的
3,cookie能够保存的信息就是字符串
4,cookie保存是以明文的方式保存,所以一些敏感信息使用cookie不好
5,cookie保存的中文文件会使用url进行编码,所以在保存的文件中看不到中文,可以使用urldecode进行解码
6,对于多个
setcookie("","",time()+3600);
setcookie("","",time()+600);
setcookie("","",time()+60);
虽然保存在同一个网站的cookie文件中,但是每一个失效的时间可以不一样,根据自身的设置;

session是服务器端的技术
使用session前必须首先初始化:session_start()
session_start();
session_unset();
session_destroy();//如果没有安全退出(手动退出)服务器端的session会等待垃圾回收机制删除

session默认1440s失效也就是24min可以在php.ini中配置


                                            
                                        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: