php高手快速进阶
——————————————————————————————————————————————————————
PHP应用-会话跟踪
——————————————————————————————————————————————————————
HTTP是一个无状态的协议,此协议无法来维护两
个事务之间的联系。
n 当一个用户请求一个页面后再请求另外一个页面
时,HTTP无法告诉我们这两个请求是来自同一个
人。
n 会话控制思想就是能够在网站中跟踪一个变量,
我们可以跟踪变量,就可以做到对用户的支持,
并根据授权和用户身份显示不同内容
会话跟踪四种技术
®URL重写
®隐藏表单域
®Cookie
®Session
URL重写
n 隐藏表单域
Cookie
®是保存在客户端的一小段文本文件
®使用cookie的限制。一个浏览器能创建的
cookie数量最多为300个,并且每个不能超过
4KB,每个Web站点能设置的cookie总数不能
超过20个
®setcookie() / $_COOKIE[‘xxx’]
Cookie数组
®其一:
setcookie("CookieArray[0]", "Value 1");
setcookie("CookieArray[1]", "Value 2");
®其二:
setcookie("CookieArray[“one”]", "Value 1");
setcookie("CookieArray[“two”]", "Value 2");
删除Cookie
®1、调用只带有name参数的setcook
®2、设置Cookie的失效时间为time()
Session
®Session从用户访问页面开始,到断开与网站
连接为止,形成一个会话的生命周期
®Session会话时,SessionID会分别保存在客户
端和服务器端两个位置,对于客户端使用临时
的Cookie保存(Cookie名称为PHPSESSID)
或者通过URL字符串传递,服务器端也以文本
文件形式保存在指定的Session目
使用会话的基本步骤如下:
®开始一个会话
session_start()
session.auto_start=1
®注册会话变量
$_SESSION[‘xxx’]=xxx
session_encode():序列化-编码
session_decode():还原-解
使用会话变量 isset($_SESSION[‘myvar’])
®注销变量并销毁会话 unset ($_SESSION[‘xxx’])
session_unset()
$_SESSION = array()
session_destroy()
常用函数
®session_id()
®session_name()
®session_regenerate_id()
Session跨页传递(不使用Cookie)
®1、设置php.ini中的session.use_trans_sid = 1
或者编译时打开了--enable-trans-sid选项,让
PHP自动跨页传递session id。仅适用于
Linux/Unix。
®2、手动通过URL传值、隐藏表单传递session
id。
®3、用文件、数据库等形式保存session_id,在
跨页过程中手动调用。
关于Session的相关配置(php.ini)
————————————————————————————————————————————————————————————
PHP应用-时间与日期
相关函数
®string date ( )
®int time ( )
®int mktime ( )
®array getdate ( )
®bool checkdate ( )
MySQL与PHP日期
®MySQL中的日期和时间是以ISO8601标准处
理,以年开始
®PHP中得到MySQL的日期输入格式
n date()
®也可以在MySQL端进行转换
n date_format(date_column,‘%m
————————————————————————————————————————————————————————————
PHP应用-连接MySQL
连接步骤
®建立连接
®发送查询语句
®遍历结果集
®关闭连接
连接
®resource mysql_connect ( 主机 , 用户名 , 密
码 )
®bool mysql_select_db ( 数据库名[,连接标识
符] )
查询
®resource mysql_query ( SQL语句[,连接标识
符] )
n对于SELECT,执行成功返回一个资源;失败返回
FALSE
n对于INSERT、DELETE、UPDATE语句返回TRUE
或FALSE表示是否执行成功。
®resource mysql_db_query(数据库名, SQL语
句 [,连接标识符] )
检索结果集
®array mysql_fetch_row ( resource result )
®array mysql_fetch_array(查询结果指针[,数
组储存型态常数])
n MYSQL_ASSOC: 关联数组
n MYSQL_NUM: 索引数组
n MYSQL_BOTH
列数和记录数
®mysql_num_fields(查询结果指针)
®mysql_num_rows(查询结果指针)
n 列的信息
®object mysql_fetch_field(查询结果指针,列位
置)
mysql_result(结果集资源,记录行号,[字段名
称字符串])
®bool mysql_data_seek(结果集资源, 移动行号)
n 关闭连接
®bool mysql_free_result ( resource result )
®bool mysql_close ( [resource link_identifier] )
错误处理
®int mysql_errno ( [resource link_identifier] )
®string mysql_error ( [resource link_identifier] )
其他处理函数
® mysql_pconnect -- 打开一个到 MySQL 服务器的持久
连接
® mysql_create_db -- 新建一个 MySQL 数据库
® mysql_drop_db -- 删除一个 MySQL 数据库
® mysql_fetch_object -- 从结果集中取得一行作为对象
® mysql_affected_rows -- 取得前一次 MySQL 操作所影
响的记录行数
调用存储过程
®如果有OUT变量,声明一个MySQL变量
mysql_query("set @a=$password");
®调用存储过程 mysql_query("call proceduer([var1]...)");
®返回执行结果
mysql_query("select @var)"
调用函数 mysql_query(“select function([var1]...)");
————————————————————————————————————————————————————————————————————
PHP应用-表单ppt纲要
向服务器端发送数据的方式
GET
POST
$_GET
$_POST
$_REQUEST
$_ENV
$_SERVER
表单提交过滤
表单验证
表单缓存
状态码
200 成功
302 请求的资源现在临时从不同的 URI 响应请
求
401 请求要求进行身份验证
404 服务器找不到请求的网页
500 服务器遇到错误,无法完成请求
503 服务器暂时不可用
header()
输出状态值到浏览器,主要用于访问权限控制
header(‘HTTP/1.1 404 Not Found’);
header(‘Status: 404 Not Found’);
重定向功能
header("Location: http://www.php.net");
强制用户每次访问这个页面时获取最新资料,而不是
使用存在客户端的缓存
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
——————————————————————————————————————————————————————————————————
PHP正则表达式
正则表达式是用于描述字符排列和匹配模
式的一种语法规则。它主要用于字符串的
模式分割、匹配、查找及替换操作。
n 在PHP中有两套正则表达式函数库:
®一套是由PCRE库提供的。使用“preg_”为前缀
命名的函数;
®一套由POSIX扩展提供的。使用以“ereg_”为前
缀命名的函数;
在PCRE中,通常将模式表达式(即正则表
达式)包含在两个反斜线“/”之间,如
“/apple/”。
n 除了字母、数字和斜线“\”以外的任何字符都
可以作为定界符。
n 正则表达式主要组成:
®原子(普通字符,如英文字符)
®元字符(有特殊功用的字符)
®模式修正字符(对正则表达式语义的修正)
原子字符包括所有的英文字母、数字、标
点符号以及其他一些符号。
®单个字符、数字,如a-z,A-Z,0-9。
®原子,如(ABC)
®原子表,如 [ABC]。
®转义字符,如:\d, \D, \w ,\W,\s,
元字符是具有特殊含义的字符
* 0次、1次或多次匹配其前的原子
+ 1次或多次匹配其前的原子
? 0次或1次匹配其前的原子
{m} 表示其前原子恰好出现m次
{m,n} 表示其前原子至少出现m次,至
少出现n次(n>m)
{m,} 表示其前原子出现不少于m次
^ 或 \A 匹配字符串串首的原子
$ 或 \Z 匹配字符串串尾的
[^] 匹配除方括号中的原子外的任何
字符
[] 匹配方括号中的任一原子
() 整体表示一个原子
. 匹配除换行之外的任何一个字符
\\1 第一个()原子
| 或
模式修正符
i -可同时匹配大小写字母
m -将字符串视为多行
x -模式中的空白忽略不计
e -将替换的字符串作为表达
相关函数
int preg_match(string $pattern, string $content [,array $matches])
preg_match_all()
array preg_grep(string $pattern,array $input)
string preg_quote(string str[,string delimiter])
array preg_split (string $pattern,string$string[,int $limit[,int flags]])
mixed preg_replace(mixed $patten,mixed
$replacement,mixed $subject[,int
——————————————————————————————————————————————————————————————————————、
php面向对象
AJAX(Asynchronous JavaScript and XML)
其实是多种技术的综合
n AJAX的四个主要组件
¨XMLHttpRequest
¨JavaScript
¨CSS
¨DOM
异步通讯
利
¨带来更好的用户体验
¨把一些服务器负担的工作转嫁到客户端
¨可以调用外部数据。
¨基于标准化的并被广泛支持的技术,不需要下
载插件或者小程序。
¨进一步促进页面呈现和数据的分离。
弊
¨浏览器的支持:AJAX 大量使用了Javascript 和AJAX
引擎,IE5.0 及以上、Mozilla1.0、NetScape7 及以上
版本才支持,Mozilla 虽然也支持AJAX,但是提供
XMLHttpRequest 的方式不一样。
¨后退功能失效:AJAX 更新页面内容的时候并没有刷新
整个页面。
¨对流媒体的支持:没有FLASH好。
¨一些手持设备(如手机、PDA 等):现在还不能很好
的支持Ajax
XMLHttpRequest对象
¨ XMLHttpRequest最早是在IE5中以ActiveX组件形式实现
¨ XMLHttpRequest在其他浏览器中以本地JS对象实现
var xhr;
function createXMLHttpRequest(){
if (window.ActiveXObject){
try{
xhr = new ActiveXObject("Msxml2.XMLHTTP"); // IE5
}catch(e){
xhr = new ActiveXObject("Microsoft.XMLHTTP"); // IE5.5
}
}else if (window.XMLHttpRequest){
xhr = new XMLHttpRequest(); // firefox
}
}
XMLHttpRequest方法
¨ open(“method”,”url”):建立对服务器的调用,
¨ send(content):向服务器发送请求
n GET方式时一般为NULL
n POST方式是,数据用此方法发送
¨ setRequestHeader(“header”,”value”):为首部设定值,
之前必须调用open方法
¨ getResponseHeader(“header”):返回指定首部的串值
¨ abort:停止当前请求
XMLHttpRequest属性
¨ readyState:请求的状态。有5个可取值:0=未初始
化,1=正在加载,2=已加载。3=交互中,4=完成
¨ onreadystatechange:每个状态改变时都会触发这个事
件处理器,通常会调用一个JavaScript函数
¨ status:服务器的HTTP状态码(200为ok,404为Not
Found)
¨ statusText:HTTP状态码的对应文本(OK,NOT
Found等)
responseText:服务器的响应,表示为一个文本串
¨ responseXML:服务器的响应,表示为XML,这个对象
可以解析成一个DOM对象
发送简单请求步骤
¨创建XHR对象
¨注册事件
¨创建一个请求
¨发送一个请求
¨内容解析(responseText、responseXML)
————————————————————————————————————————————————————————————————————
php面向对象--PHP模板
模板是可复用代码的衍生概念。
模板使页面与代码分离。
模板方便制作不同语言版本。
模板提高开发速度和性能。
发展历史
¨内嵌PHP代码
¨分离通用代码
¨解释型模板体系
¨编译型模板体系
¨缓存模板体系
两种模板引擎
¨需程序处理的模版引擎程序开发者必须要负责变量的呈现逻辑,也就是说他必须把变量的内容在输出到模版前先处理好,才能做assign的工作。
完全由模版本身自行决定的模版引擎
Smarty优点
¨速度快
¨编译行
¨缓存技术:Smarty可以缓存成一个静态的HTML页
¨插件技术:实际上就是可以编辑‘自定义函数’和自定义
‘变量’
¨模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
Smarty不适合
¨实时刷新的内容
¨小型网站
Smarty安装
¨拷贝libs
¨/libs Smarty的功能类目录
/tempalates 模板文件目录
/templates_c 模板缓存文件目录
/configs 配置文件目录
/cache 缓存文件目录
模板文件
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html;
charset=gb2312” />
<title> {$title} </title>
</head>
<body>
{$content}
</body>
</html>
PHP文件
<?php
include_once(“libs/Smarty.class.php"); //包含smarty类文件
$smarty = new Smarty(); //创建smarty对象
$smarty->template_dir = "./templates"; //设置模板目录
$smarty->compile_dir = "./templates_c"; //设置编译目录
$smarty->left_delimiter = "{"; //定义左边界符
$smarty->right_delimiter = "}"; //定义右边界符
$smarty->assign(“title”, “Hello”); //进行模板变量替换
$smarty->assign(“content”, “Hello, World”); //进行模板变量替换
$smarty->display("index.tpl"); //编译并显示
?>
其他设置
¨$smarty->cache_dir = "cache";
¨$smarty->cache_lifetime = 60 * 60 * 24;
¨$smarty->caching = 1;
基本语法
¨注释: {* 注释内容*}
¨变量: {$变量名}
¨索引数组: {$数组名[索引]}
¨关联数组: {$数组名.元素名}
¨对象: {$对象名->属性名}
¨函数: {函数名称[ 参数名1=值1[ 参数名2=值2]]}
从配置文件引用的变量
¨配置文件名为: *.conf
¨在模板中引入:{config_load file="配置文件
名.conf"}
¨在模板中的变量标签:{#变量名#}或
{$smarty.config.变量名}
变量调节器
¨{$变量名|调节器名} //用于变量
¨{“字符串”|调节器名} //用于字符串
¨{函数名|调节器名函数的参数名=值} //用于函
数
¨{$变量名|调节器名1[|调节器名2|...]} //使用多
个调节器
条件
¨条件表达式与PHP中相同即可
¨{if 条件表达式1}
内容1
[{elseif 条件表达式2}
内容2
{else}
内容3]
{/if}
输出内容
¨'{'字符: {ldelim} }'字符: {rdelim}
¨{literal}{/literal} 里面的文本内容将不会被模板
引擎解析,原样输出
¨{php}php语句;{/php}
输出内容
¨'{'字符: {ldelim} }'字符: {rdelim}
¨{literal}{/literal} 里面的文本内容将不会被模板
引擎解析,原样输出
¨{php}php语句;{/php}
循环
¨{foreach from=$数组名item=当前元素的变量
名称[ key=当前元素的键名] }
循环体...
{$当前元素的变量名称}
{foreachelse}
循环不执行时语句
{/foreach}
输出内容
¨'{'字符: {ldelim} }'字符: {rdelim}
¨{literal}{/literal} 里面的文本内容将不会被模板
引擎解析,原样输出
¨{php}php语句;{/php}
{section name = name loop =
$varName[ start = $start step = $step max =
$max show = true]}
¨name: section的名称,不用加$
输出内容
¨'{'字符: {ldelim} }'字符: {rdelim}
¨{literal}{/literal} 里面的文本内容将不会被模板
引擎解析,原样输出
¨{php}php语句;{/php}
——————————————————————————————————————————————————
php面向对象--PDO
PDO扩展是在PHP5中加入,该扩展提供
PHP内置类PDO来对数据库进行访问,不
同数据库使用相同的方法名,解决数据库
连接不统一的问题。
安装PDO
连接
¨ $conn = new
PDO("mysql:host=localhost;dbname=dhee", "root",
"123456");
PDO::query()
¨主要用于有记录结果返回的操作,如SELECT
PDO::exec()
¨主要用于没有结果集合返回的操作,如INSERT、
UPDATE、DELETE等,它返回当前操作影响的列数
获取结果集:
¨PDOStatement::fetchColumn() 是获取指定记
录的某个字段,缺省是第一个字段
¨PDOStatement::fetch() 是用来获取一条记录
¨PDOStatement::fetchAll()是获取所有记录集
关闭连接
¨$conn = null;
setAttribute()
¨PDO::CASE_LOWER: 强制列名是小写
¨PDO::CASE_UPPER: 强制列名为大写
n setFetchMode()
¨PDO::FETCH_ASSOC : 关联数组形式
PDO::FETCH_NUM : 数字索引数组形式
PDO::FETCH_BOTH : 两者数组形式都有,这
是缺省的
预处理语
¨PDO::prepare()
¨PDOStatement ::execute()
调用存储过程
<?php
$stmt = $dbh->prepare("CALL hello_sp(?)");
$value = 'hello';
$stmt-
>bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// call the stored procedure
$stmt->execute();
print "procedure returned $value\n";
?>
事务
¨PDO::beginTransaction()
¨PDO::commit() 或PDO::rollBack()
————————————————————————————————————
面向对象的概念(OOP)
¨对象
¨类
¨对象和类的关系
PHP5已经完全支持面向对象
属性
¨在类定义中声明变量,即创建了类的属性
方法
¨在类定义中声明函数,即创建了方法
PHP中属性与方法的引用操作符是“ - > ”
$this
¨对象内部代表这个对象的引用
构造函数
¨function __construct ( [参数] ) { ... ... }
¨当创建一个对象时,它将自动调用构造函数
构造函数兼容
¨PHP4中,构造函数的名称必须与类名相同。
为了向下兼容,如果一个类中没有名为
__construct( )的方法,PHP将搜索一个与类名
相同的方法
析构函数
¨function __destruct ( ) { ... ... } ¨析构函数是 PHP5新添加的内容,在 PHP4中没
有析构函数
¨析构函数允许在销毁一个类之前执行的一些操
作或完成一些功能
¨析构函数不能带有任何参数
访问类型
¨这是PHP5的新特性,但却是OOP语言的一个
重要特性,而且大多数OOP语言都已支持。
PHP5支持如下 3种访问修饰符:
• public (公有的默认的)
• private (私有的)
• protected (受保护的)
• public
¨类的成员将没有访问限制,所有的外部成员都
可以访问(读和写)这个类成员
¨在PHP5之前的所有版本中,类的成员都是 public的
• private
¨对于该类的外部代码是不允许改变甚至读操作
protected
¨对于该类的直接子类有访问权限
OOP三个基本特征
¨封装
¨继承
¨多态
封装
¨封装性就是把对象的属性和行为结合成一个独
立的相同单位,并尽可能隐蔽对象的内部细节。
¨将类的成员变量声明为 private,再通过public 的
方法来对这个变量进行访问
私有属性的访问
¨set/get方法
¨在PHP5中,预定义了两个函数__get()和
__set()来获取和赋值其属性,检查属性的
__isset()和删除属性的方法__unset()
__get()
n __set()
function __get($property_name) {
if(isset($this->$property_name)) {
return($this->$property_name);
} else {
return null;
}
}
function __set($property_name, $value) {
$this->$property_name = $value;
}
__isset()
n __unset()
function __isset($name) {
return isset($this->$name);
}
function __unset($name) {
unset($this->$name);
}
继承(is a) ¨在PHP中只有单继承,但一个类可以被多个类
继承
¨可以有多层继承,即一个类可以继承某一个类
的子类
¨子类继承父类的所有内容,但父类中的private部分不能直接访问
¨子类中新增加的属性和方法是对父类的扩展
覆盖
¨子类中定义的与父类同名的属性是对父类属性
的覆盖,同名的方法也是对父类方法的覆盖
¨子类中的访问权限>=父类权限
¨调用父类被覆盖的方法:类名::或parent::
parent::__construct();
parent::$name;
parent::fun();
多态
¨对象的多态性是指在父类中定义的属性或行为
被子类继承之后,可以具有不同的数据类型或
表现出不同的行为
¨在PHP中,多态的特性并不明显
包含(has a)
¨一个类中包含另一个类对象
final
¨使用final关键字标记的类不能被继承
¨使用final关键字标记的方法不能被子类覆盖
static
¨在类内部,不能用$this来引用静态变量或方
法,而需要用self来引用
self::$静态属性、self::静态方法
¨在类外部可以使用
类::$静态属性、类::静态方法
const
¨在类里面定义常量使用的是”const”
¨self::CONSTANT; // 类内部访问
¨类名::CONSTANT; // 类外部访问
__toString()
¨直接输出对象引用时自动调用
对象的比较
¨==是比较两个对象的内容
¨===是比较对象的句柄,即引用地址
n 对象类型检测
¨instanceof操作符用于检测当前对象实例是否
属于某一个类的类型
克隆对象
¨在PHP5中要创建一个对象的副本,使用关键
字clone来实现
¨$obj2 = clone $obj;
n __clone()
¨在对象克隆时自动调用
¨__clone()可以没有参数,它自动包含$this和
$that两个指针,$this指向复本,而$that指向
原本
__call()
¨调用不存在的方法时自动调用
n __autoload()
¨自动加载类
function __autoload($class_name) {
include("$class_name"."_class.php");
}
序列化
¨serialize()
¨unserialize()
抽象方法和抽象类
¨abstract function 方法名( );
¨abstract class 类名{ }
¨抽象类不能被实例化,一个抽象类中必须有一
个抽象方法
接口
¨如果在一个抽象类中包含的只有抽象方法,可
以将其定义为interface(接口)
¨class 类名implements 接口名{ }
¨接口中只能声明常量属性,接口中的方法必须
定义为公有、抽象
¨接口中的方法也可以声明为static