NingG +

PHP内容梳理

背景

最近要快速搭建一个网站,用途:实现团队内容的对外展现,第一反应就是用wordpress框架实现,号称5分钟建站,够快了。问题来了:网站要实现一些特定的效果,这个就需要定制一下了,wordpress后端是PHP写的处理逻辑,OK,熟悉一下PHP。(实际上,半年前在baidu的时候,用过一段时间PHP,只不过没有整理,后来没继续使用,也忘得差不多了,就剩下学习方法和感觉了)

学习路线

自己之前接触过1个多月的PHP,当时的内容就是搭建web站点;针对一门不熟悉的语言,只需要掌握其基本知识即可开始工作,包括:

变量

变量,就是存储数据的容器,对变量进行操作就是处理数据;

定义变量

变量名,几点:

关于变量名,建议:

变量定义,几点:

变量类型

这一部分,将介绍3种变量类型:数值型、字符串型和数组;

索引数组如下:

key value
0 Don
1 Jane
2 Roger

关联数组如下:

key value
D Don
J Jane
R Roger

变量赋值

使用变量

特别说明:打印出变量内容,是调试脚本的重要方法。

引号说明

这个比较重要,单拎出来说一下:

单引号内容,原样输出;双引号内容,进行变量带入;

针对引号,几点注意:

预定义变量

PHP中已经预先定义了一些变量,这些变量功能强大,需要熟记。

针对上面 3. 中提到的情况,说明如下:

// 下面输出会出错
print "Thank U : $_POST['name']";

// 可选解决办法(先取出,后使用)
$input_name_value = $_POST['name'];
print "Thank U : $input_name_value";

疑问:能使用双引号,即 $_POST["name"] 样式,来获取数组中内容吗?当然可以,单引号能做,双引号也能。

数组

操作数组:array()函数创建数组:

$list = array ('appales', 'bananas', 'oranges');

默认,数组的索引从0开始;当然有办法从1开始,代码如下:

$list = array(
	1 => 'apples',
	2 => 'bananas',
	3 => 'oranges'
);

//key值也可以为字符串
$list = array(
	'Mon' => 'apples',
	'Tue' => 'bananas',
	'Wed' => 'oranges'
);

//range () 函数创建数组
$evens = range (0, 100, 2);

关于数组的常用操作,小结如下:

数组使用过程总结如下:

特别要说的是foreach遍历数组,举例如下:

//同时,使用key 和value
foreach($array as $key => $value) {
	print "<p>Key is $key. Value is $value. </p>";
}

//只使用value
foreach($array as $value){
	print "<p>Value is $value.</p>";
}

//对于数值索引数组
for($n = 0; $n < count($array); $n++){
	print "<p>Value is $array[$n].</p>";
}

备注:上述$key => $value,可以替换为$k => $v等类似形式。

多维数组

$fruits = array (
	1 => 'apples',
	2 => 'bananas',
	3 => 'oranges'
);

$meats =array (
	'fruits' => $fruits,
	'other' => 'peanuts',
	'cash' => 30.00
);

数组排序,常用函数如下:

函数 排序依据 是否保持key-value对应关系
sort() Values No
rsort() Values No
asort() Values Yes
arsort() Values Yes
ksort() Keys Yes
krsort() Keys Yes
natsort() Keys,自然顺序 Yes
natcasesort() Keys Yes

字符串与数组之间转换,通常如下原因:

数组与字符串间转换实例:

// 将array以','为分割,转换为字符串
$string = implode(',', $array);

//将string以','为分割,转换为数组
$array = explode(',', $string);

将数组中元素分别指定给不同变量,使用 list() 函数:

$date = array('Thursday', 23, 'October');
//为3个变量赋值
list($weekday, $day, $month) = $date;

实践:查看PHP手册中的几个函数,array_key_exists()array_search()in_array()

常量

与变量不同,常量在脚本的执行过程中,一直保持初始值;常量一旦设定就不能更改。

定义常量

使用define()函数

define('CONSTANT_NAME', value);

几点:

预定义常量

运算符

PHP中运算符,参考下表:

运算符 用法 类型
+ 算数
- 算数
* 算数
/ 算数
% 取模 算数
++ 自增 算数
-- 自减 算数
= 赋值 赋值
== 相等 比较
!= 不等 比较
< 小于 比较
> 大于 比较
<= 小于等于 比较
>= 大于等于 比较
! 逻辑
AND 逻辑
&& 逻辑
OR 逻辑
|| 逻辑
XOR 异或 逻辑
. 连接 字符串

函数

特别说明:PHP中函数名与()之间可以有空格,即,如下两种方式都正确:

round(100.2);
round (100.2);

数值格式化

round(),进行数值四舍五入,具体参阅[PHP Manual],举例如下:

<?php
	round(3.4);			//3
	round(4.12, 1);		//4.1
	round(1221, -2);	//1200
?>

类似函数还有:number_format()printf()sprintf()

随机数

rand()mt_rand(),具体不多说,查看操作手册即可;

字符串连接

字符串连接:句点.,举例:$result = $first_name . $last_name;

转换HTML格式

几个问题:

字符串编/解码

背景:通过URL的query向服务器发送参数时,要求参数不能包含空格、特殊字符等;如果一定要使用URL的query向服务器传送数据,可以先对数据进行编码,即可解决此问题。

urlencode(),专门解决这一问题,将字符串转换为适合最为URL的一部分来传输。几点说明:

子字符串

PHP中所有索引的位置都是从0开始的。

日期和时间

说几个函数,有点印象就行,具体用法去查PHP手册:

额外说明几点:

创建函数

一个典型函数的格式如下:

//设置参数默认值
function function_name($arg1 = 'world', $arg2){
	statements;
	//函数的返回值(返回多个值:数组)
	return $name;
}

说几点:

变量作用域

控制结构

几点注意:

几个验证函数:

举例如下:

$var1 = 0;
$var2 = "";
$var3 = "HELLO!"

empty($var);	//TRUE,没有定义的变量
empty($var1);	//TRUE,空值
empty($var2);	//TRUE,空值
empty($var3);	//FALSE,非空(这个是这样吗?)

isset($var);	//FALSE,变量未定义
isset($var1);	//TRUE
isset($var2);	//TRUE

if条件语句

if (condition1) {
	statement(s);
} elseif (condition2) {
	statement(s);
} else {
	statements(s);
}

switch条件语句

switch($var),变量$var,可以为字符串、数值,在case后的value,如果是数值,则不需要加引号。

switch ($var) {
	case value1:
		statements1;
		break;
	case value2:
		statements2;
		break;
	default:
		statements3;
		break;
}

循环语句

主要是for、while,以及foreach,不多说,给个示例:

while(condition) {
	statement(s);
}

do {
	statement(s);
} while (condition);

for (init_exp; condition ; closing_exp){
	statement(s);
}

调试程序

调试程序有2种方式:

  1. 输出变量和错误信息;
  2. 用IDE,打断点,debug;
  3. 查看程序运行日志,特别是出错日志;

输出变量

输出错误信息

安装PHP之后,默认安全配置下,是不允许向Web端输出任何出错信息的,即,display_errors 出于关闭状态;为了方便调试,有两种方法:

当前首选第一个选项,但是只有root用户才有如此权限;普通用户,可以在php页面中添加代码:ini_set('display_errors', 1); 实现为某些脚本开启 display_errors 。说明:这种方式进行的设置,只在当前php脚本执行期间有效,脚本结束后恢复原始设置;display_errors 只能控制是否向浏览器发送错误信息,而不会控制错误的发生。

输出错误信息级别

通过设置display_errors可以实现输出错误信息,但是要输出哪一类的错误信息呢?警告信息要不要输出?

PHP中错误的类型,见下表:

类型 描述 示例
通知 非致命性错误,程序不一定有问题 引用一个没有值的变量
警告 非致命错误,程序有问题 函数误用
解析错误 致命错误,语法错误 缺少分好、引号、圆括号、花括号
错误 致命错误,一般错误 内存分配问题

错误报告常量(不完整,完整版查看[PHP Manual]),见下表:

名称 描述
E_NOTICE 通知
E_WARRING 警告
E_PARSE 解析错误
E_ERROR 错误
E_ALL 所有错误(E_STRICT除外)
E_STRICT PHP代码修改建议

注:上面的常量,是二进制位掩码,可以使用按位运算符来对其进行组合,例如,php.ini中,|~&

两种方式可以设置错误提示级别:

  1. 全局设置:PHP配置文件php.ini中,调整error_reporting()级别;
  2. 局部设置:php脚本中,使用error_reporting()函数;

举例说明如下:

//不报告任何错误
error_reporting(0);

//报告所有错误
error_reporting(E_ALL);

//报告除通知之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);

//所有错误以及代码修改建议
error_reporting(E_ALL | E_STRICT);

Web开发基本过程

Web开发的基本过程:

cookie和session

cookie、session的作用:跟踪用户,记录用户信息。

什么是cookie

客户端保存用户信息的一种方式,服务器通过此信息识别用户身份;将从几点来介绍cookie:

cookie的访问时间和方式:用户输入URL后,浏览器会将cookie信息包含至HTTP请求内发送给服务器。额外几点说明:

读取cookie

预定义的数组$_COOKIE中存储了所有cookie数据,按照key值,从数组$_COOKIE中读取即可。

向cookie中添加参数

函数setcookie(),具体用法如下:

//expiration:过期时间点,单位秒(s);默认关闭浏览器之前有效;
//domain:设置一个子域的cookie;
//secure:为1时,表示只能通过https传送;
//httponly:设置防止JS读取cookie,但不是所有浏览器都支持;
setcookie(name, value, expiration, path, domain, secure, httponly);

setcookie(name, value, time() + 3600);
setcookie(name, value, time() + 3600, '/subfolder/');
setcookie(name, value, time() + 3600, '', 'forum.example.com');

几点注意:

删除cookie

删除cookie,本质就是设置一个空值,同时可以设置一个过去的过期时间:

//重设值,同时设置过去的过期时间
setcookie('username', FALSE, time() - 600);

特别提醒:删除cookie时,一定要使用与设置cookie一致的参数(除去值和过期时间)。

setcookie('user', 'larry', time() + 3600, '', 'forums.example.com');
setcookie('user', '', time() - 600, '', 'forums.example.com');

什么是session

session的数据保存在服务器端,cookie数据保存在客户端;由此,session比cookie拥有更多的优势:

几点说明:

cookie相对于session的优势有:

结论:

创建session

session_start()函数用于创建一个session,并且在session首次启动时发送一个cookie,因此,必须在所有HTML响应发送回浏览器之前,创建session。 第一次开启session时,随机产生一个session ID,并向Web浏览器发送一个名为PHPSESSID(session的名称)的cookie。

一旦启用session,就可以通过向数组赋值的方式来存储数据:

$_SESSION['first_name'] = 'Sam';
$_SESSION['age'] = 14;

每次向session中添加数据时,PHP将向服务器上一个临时文件中添加一些数据:

//session数据在服务器文件中的存储方式
email|s:14:"me@example.com"; loggedin|i:1292;

关于session几点信息:

  1. php.ini中可以配置session信息;
  2. ini_set()函数可以设置session信息;
  3. session_name()函数可以修改session名称(默认名称PHPSESSID),注意:必须在调用session_start()之前使用;
  4. session_set_cookie_params()函数,用户修改session cookie的设置(过期时间、路径、域);
  5. 常量SID用格式name=ID的方式保存一个字符串;
  6. session中可以保存任意类型数据,甚至对象;
  7. 在session中,数据都会以纯文本的形式保存在一个开放可读的文本文件中;永远不要将真实的敏感信息存在session中,例如信用卡数据;
  8. 为提高安全性,可以将数据加密后保存到session中,在读取session后再解密(Mcrypt库);

删除session

服务器端session中包含的数据都保存在$_SESSION数组中,可以对数组重新赋值,以达到删除session的效果,但也需要删除服务器上保存session数据的临时文件,具体操作如下:

//重置session
$_SESSION = array();
//删除服务器端session临时文件
session_destroy();

函数unset($var),可用于删除一个变量,也能达到删除$_SESSION的效果;同时,如果浏览器禁用cookie,则可以在URL上添加session ID作为附属参数,以继续使用session,注意:需要在php.ini中启用enable_trans_side。

文件和目录

Web应用程序,不可避免两个问题:数据存储、检索数据。当前数据存储的方法主要有两种:文件(和目录)、数据库。这一部分,主要介绍一下文件的写入、读取和锁定。

疑问:读取、上传的文件,为什么在Web目录之外?

补充几点:

读取文件:PHP 4 以及以下版本,不能使用file_put_contents(),需要按照旧方法来写数据:打开文件、写数据、关闭文件;

//文件模式mode,查PHP手册很详细
$file_pointer = fopen($file, mode);
fwrite($file_pointer, $data . PHP_EOL);
fclose($file_pointer);

上传文件:通过表单上传,修改3处:

  1. form表单添加enctype,即 <form action=… enctype=”multipart/form-data” method=”post” >;必须使用POST方式;
  2. 添加银行输入框:,用于建议浏览器最大能够上传的文件;
  3. 使用file元素,创建所需的表单:,file类型允许用户上传一个文件;

PHP脚本中,使用$_FILES变量能够引用上传的文件。$_FILES数组包含5个成员:

  1. name,用户上传文件的原始名字;
  2. type,文件MIME类型,例:image/jpg;
  3. size,文件大小(单位Byte)
  4. tmp_name,文件存放在服务器上的临时文件名称;
  5. error,发生错误时,保存的错误代码;(查看PHP手册)

文件上传之后,需要将临时文件移动到最终目标位置:

//将临时文件移动到最终位置
move_uploaded_file($_FILES['pic']['tmp_name'], '/path/filename');

一个php脚本可以同时处理多个文件上传,只要name属性不同即可,此时只需要一个隐含输入框设定MAX_FILE_SIZE。另外,针对移动文件的函数小结:

上传文件时,有几点注意:

  1. php.ini中,开启file_uploads配置;
  2. php.ini中,设置upload_tmp_dir,如果没有设置,可能会指定一个隐含值;
  3. php.ini中,upload_max_filesize和post_max_size用于设定PHP能够处理的文件大小;
  4. form中隐含input元素中设定的MAX_FILE_SIZE只是在前端浏览器处,进行的约束;
  5. 当缺失要上传大文件时,除了上述相关的配置,还应设置两个参数:memory_limit、max_execution_time,来给PHP脚本足够的处理时间和空间;

目录相关

浏览目录:

数据库MySQL

PHP中操作MySQL数据库,基本过程,连接数据库、操作、释放连接,具体几点:

PHP中对MySQL的支持

PHP操作MySQL,根据扩展不同,分为两类:

MySQL错误处理

常见的错误类型有:

具体说几点:

关于PHP中使用MySQL,具体说几点:

为避免SQL注入攻击,可随意用mysql_real_escape_string()函数,来转义危险字符:

$var = mysql_real_escape_string($var, $dbc);

注意几点:

特别说明

PHP基础教程(第4版)的附录部分,有很多进一步学习的建议。

参考资料

Top