您好,登录后才能下订单哦!
PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
PHP 是免费的,并且使用非常广泛。同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。
PHP 函数的完整参考手册:
Array 函数
Calendar 函数
cURL 函数
Date 函数
Directory 函数
Error 函数
Filesystem 函数
Filter 函数
FTP 函数
HTTP 函数
LibXML 函数
Mail 函数
Math 函数
Misc 函数
MySQLi 函数
SimpleXML 函数
String 函数
XML Parser 函数
Zip 函数
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 简介
PHP 是服务器端脚本语言。
。。。。。。。。。。。。
PHP 是什么?
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
PHP 脚本在服务器上执行。
PHP 可免费下载使用。
PHP 对初学者而言简单易学。
PHP 也为专业的程序员提供了许多先进的功能。
。。。。。。。。。。。。
PHP 文件是什么?
PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
PHP 文件的默认文件扩展名是 ".php"
。。。。。。。。。。。。
PHP 能做什么?
PHP 可以生成动态页面内容
PHP 可以创建、打开、读取、写入、关闭服务器上的文件
PHP 可以收集表单数据
PHP 可以发送和接收 cookies
PHP 可以添加、删除、修改您的数据库中的数据
PHP 可以限制用户访问您的网站上的一些页面
PHP 可以加密数据
通过 PHP,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本,比如 XHTML 和 XML。
。。。。。。。。。。。。
为什么使用 PHP?
PHP 可在不同的平台上运行(Windows、Linux、Unix、Mac OS X 等)
PHP 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS 等)
PHP 提供了广泛的数据库支持
PHP 是免费的,可从官方的 PHP 资源下载它: www.php.net
PHP 易于学习,并可高效地运行在服务器端
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 安装
您需要做什么?
为了开始使用 PHP,您可以:
找一个支持 PHP 和 MySQL 的 Web 主机
在您自己的 PC 机上安装 Web 服务器,然后安装 PHP 和 MySQL
。。。。。。。。。。。
使用支持 PHP 的 Web 主机
如果您的服务器支持 PHP,那么您不需要做任何事情。
只要在您的 web 目录中创建 .php 文件即可,服务器将自动为您解析这些文件。
您不需要编译任何软件,或安装额外的工具。
由于 PHP 是免费的,大多数的 Web 主机都提供对 PHP 的支持。
。。。。。。。。。。。
在您自己的 PC 机上建立 PHP
然而,如果您的服务器不支持 PHP,您必须:
安装 Web 服务器
安装 PHP
安装数据库,比如 MySQL
官方 PHP 网站(PHP.net)有 PHP 的安装说明: http://php.net/manual/en/install.php
。。。。。。。。。。。
PHP 服务器组件
对于初学者建议使用集成的服务器组件,它已经包含了 PHP、Apache、Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程。
。。。。。。。。。。。
WampServer(服务器)
Windows 系统可以使用 WampServer,下载地址:http://www.wampserver.com/,支持32位和64位系统,根据自己的系统选择版本。
WampServer 安装也简单,你只需要一直点击 "Next" 就可以完成安装了。
XAMPP(集成服务器)
XAMPP 支持 Mac OS 和 Windows 系统,下载地址:https://www.apachefriends.org/zh_cn/index.html。
。。。。。。。。。。。
IDE (Integrated Development Environment,集成开发环境)
Eclipse for PHP(免费)
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台(如果未安装JDK,则需要先 下载 JDK 安装)。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
支持 Windows、Linux 和 Mac OS 平台。
Eclipse for PHP 官方下载地址:http://www.eclipse.org/downloads/packages/eclipse-php-developers/heliosr
PhpStorm(收费)
PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。
PhpStorm 非常适合于PHP开发人员及前端工程师。提供诸于:智能HTML/CSS/JavaScript/PHP编辑、代码质量分析、版本控制集成(SVN、GIT)、调试和测试等功能。
支持 Windows、Linux 和 Mac OS 平台。
PhpStorm 官方下载地址:http://www.jetbrains.com/phpstorm/download/
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 语法
PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器。
http:/ /www.iis7.com/b/ssyqdq/
。。。。。。。。。。。。。。
基本的 PHP 语法
PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php 开始,以 ?> 结束,语法:<?php // PHP 代码 ?>
PHP 文件的默认文件扩展名是 ".php"。
PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 变量。变量是用于存储信息的"容器"
。。。。。。。。。。。。
与代数类似
x=5
y=6
z=x+y
在代数中,我们使用字母(如 x),并给它赋值(如 5)。
从上面的表达式 z=x+y ,我们可以计算出 z 的值为 11。
在 PHP 中,这些字母被称为变量。
变量是用于存储数据的容器。
。。。。。。。。。。。。
PHP 变量
与代数类似,可以给 PHP 变量赋予某个值(x=5)或者表达式(z=x+y)。
变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。
PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP 语句和 PHP 变量都是区分大小写的。
。。。。。。。。。。。。
创建(声明)PHP 变量
PHP 没有声明变量的命令。
变量在您第一次赋值给它的时候被创建
注释:当您赋一个文本值给变量时,请在文本值两侧加上引号。
。。。。。。。。。。。。
PHP 是一门弱类型语言
不必向 PHP 声明该变量的数据类型。
PHP 会根据变量的值,自动把变量转换为正确的数据类型。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
。。。。。。。。。。。。
PHP 变量作用域
变量的作用域是脚本中变量可被引用/使用的部分。
PHP 有四种不同的变量作用域:
local
global(全局变量)
static
parameter
。。。。。。。。。。。。
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问
你可以在不同函数中使用相同的变量名称,因为这些函数内定义的变量名是局部变量,只作用于该函数内。
。。。。。。。。。。。
PHP global 关键字
global 关键字用于函数内访问全局变量。
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
。。。。。。。。。。。
Static 作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,请在您第一次声明变量时使用 static 关键字
然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。
注释:该变量仍然是函数的局部变量。
。。。。。。。。。。。
参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分
。。。。。。。。。。。
1, 定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。
2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
3、函数之间存在作用域互不影响。
4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组
在 php 中函数是有独立的作用域,所以局部变量会覆盖全局变量,即使局部变量中并定义没有全局变量相同的变量,也会被覆盖。
要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过 php 中自定义的 $GLOBALS 数组获取
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 5 echo 和 print 语句
在 PHP 中有两个基本的输出方式: echo 和 print。
。。。。。。。。。。。。。。
PHP echo 和 print 语句
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
。。。。。。。。。。。。
PHP echo 语句
echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。
显示字符串。字符串可以包含 HTML 标签
显示变量,用双引号
。。。。。。。。。。。。
PHP print 语句
print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。
显示字符串,字符串可以包含 HTML 标签
显示变量,用双引号
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP (文件结束符)EOF(heredoc,语法结构) 使用说明
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。
使用概述:
x 取反 x 取反 . 并置 连接两个字符串 HP7+ 版本新增整除运算符 intdiv() 。。。。。。。。。 PHP 赋值运算符 在 PHP 中,基本的赋值运算符是 "="。它意味着左操作数被设置为右侧表达式的值。也就是说,"$x = 5" 的值是 5。 运算符 等同于 描述 x = y x = y 左操作数被设置为右侧表达式的值 x += y x = x + y 加 x -= y x = x - y 减 x = y x = x y 乘 x /= y x = x / y 除 x %= y x = x % y 模(除法的余数) a .= b a = a . b 连接两个字符串 。。。。。。。。。 PHP 递增/递减运算符 运算符 名称 描述 ++ x 预递增 x 加 1,然后返回 x x ++ 后递增 返回 x,然后 x 加 1(等于本身) -- x 预递减 x 减 1,然后返回 x x -- 后递减 返回 x,然后 x 减 1(等于本身) 。。。。。。。。。 PHP 比较运算符 比较操作符可以让您比较两个值: 运算符 名称 描述 实例 x == y 等于 如果 x 等于 y,则返回 true 5==8 返回 false x === y 绝对等于 如果 x 等于 y,且它们类型相同,则返回 true 5==="5" 返回 false x != y 不等于 如果 x 不等于 y,则返回 true 5!=8 返回 true x <> y 不等于 如果 x 不等于 y,则返回 true 5<>8 返回 true x !== y 绝对不等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5" 返回 true x > y 大于 如果 x 大于 y,则返回 true 5>8 返回 false x < y 小于 如果 x 小于 y,则返回 true 5<8 返回 true x >= y 大于等于 如果 x 大于或者等于 y,则返回 true 5>=8 返回 false x <= y 小于等于 如果 x 小于或者等于 y,则返回 true 5<=8 返回 true 。。。。。。。。。。 PHP 逻辑运算符 运算符 名称 描述 实例 x and y 与 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 and y > 1) 返回 true (两边条件都成立时) x or y 或 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==6 or y==5) 返回 true (两边条件有一个成立时) x xor y 异或 如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x==6 xor y==3) 返回 false (两边条件都不成立时) x && y 与 如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 && y > 1) 返回 true (两边条件都成立时) x |
y 或 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==5 | y==5) 返回 false (两边条件有一个成立时) ! x 非 如果 x 不为 true,则返回 true x=6 y=3 !(x==y) 返回 true (取反相值) 。。。。。。。。。。 PHP 数组运算符 运算符 名称 描述 x + y 集合 x 和 y 的集合 x == y 相等 如果 x 和 y 具有相同的键/值对,则返回 true x === y 恒等 如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true x != y 不相等 如果 x 不等于 y,则返回 true x <> y 不相等 如果 x 不等于 y,则返回 true x !== y 不恒等 如果 x 不等于 y,则返回 true 。。。。。。。。。。 三元运算符 另一个条件运算符是"?:"(或三元)运算符 。 语法格式:(expr1) ? (expr2) : (expr3) 对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。 注意:PHP_EOL 是一个换行符,兼容更大平台。 在 PHP7+ 版本多了一个 NULL 合并运算符 ?? 。。。。。。。。。。 组合比较符 "<=>" 。。。。。。。。。。 运算符优先级 下面按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。 说明:左 = 从左到右,右 = 从右到左。 结合方向 运算符 附加信息 无 clone new clone 和 new 左 [ array() 右 ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减 无 instanceof 类型 右 ! 逻辑运算符 左 * / % 算术运算符 左 + – . 算术运算符和字符串运算符 左 << >> 位运算符 无 == != === !== <> 比较运算符 左 & 位运算符和引用 左 ^ 位运算符 左 |
位运算符 左 && 逻辑运算符 左 |
逻辑运算符 左 ? : 三元运算符 右 = += -= *= /= .= %= &= |
= ^= <<= >>= => 赋值运算符 左 and 逻辑运算符 左 xor 逻辑运算符 左 or 逻辑运算符 左 , 多处用到 运算符优先级中,or 和 |
,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。 。。。。。。。。。。。 括号的使用 我们通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。 。。。。。。。。。。。 组合比较运算符又名太空船运算符,组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。 语法是这样的: $c = $a <=> $b; 这句代码的意思是: 如果 $a > $b, $c 的值为 1 如果 $a == $b, $c 的值为 0 如果 $a < $b, $c 的值为-1 运算符的优先级口诀:括(号)、单(操作数)、算(术)、移(位)、关(系);位(运算符)、逻(辑)、条(件)、赋(值)、逗(号)。 |
---|
PHP If...Else 语句
条件语句用于根据不同条件执行不同动作。
。。。。。。。。。。。
PHP 条件语句
当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。
在 PHP 中,提供了下列条件语句:
if 语句 - 在条件成立时执行代码
if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块
switch 语句 - 在若干条件之一成立时执行一个代码块
。。。。。。。。。。
PHP - if 语句
if 语句用于仅当指定条件成立时执行代码。
语法:
if (条件)
{
条件成立时要执行的代码;
}
。。。。。。。。。。
PHP - if...else 语句
在条件成立时执行一块代码,条件不成立时执行另一块代码,请使用 if....else 语句。
语法:
if (条件)
{
条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
。。。。。。。。。。
PHP - if...elseif....else 语句
在若干条件之一成立时执行一个代码块,请使用 if....elseif...else 语句。.
语法:
if (条件)
{
if 条件成立时执行的代码;
}
else if (条件)
{
else if 条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
。。。。。。。。。
elseif 和 else if 完全同效果,elseif 是 PHP 为 else if 专门做到容错版。更准确更严格到写法为后者: else if
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP Switch 语句
switch 语句用于根据多个不同条件执行不同动作。
如果您希望有选择地执行若干代码块之一,请使用 switch 语句。
语法:
<?php
switch (n)
{
case label1:
如果 n=label1,此处代码将执行;
break;
case label2:
如果 n=label2,此处代码将执行;
break;
default:
如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
}
?>
工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。
在 switch 语句中漏写 break, 可能会使你的输出在你意料之外。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 数组
数组能够在单个变量中存储多个值
。。。。。。。。。。。。
数组是什么?
数组是一个能在单个变量中存储多个值的特殊变量。
如果您有一个项目清单(例如:车名字的清单),将其存储到单个变量中,如下所示:
$cars1="Volvo";
$cars2="BMW";
$cars3="Toyota";
然而,如果您想要遍历数组并找出特定的一个呢?如果数组的项不只 3 个而是 300 个呢?
解决办法是创建一个数组!
数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。
。。。。。。。。。。。。
在 PHP 中创建数组
在 PHP 中,array() 函数用于创建数组:
array();
在 PHP 中,有三种类型的数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
。。。。。。。。。。。。
PHP 数值数组
这里有两种创建数值数组的方法:
自动分配 ID 键(ID 键总是从 0 开始):
$cars=array("Volvo","BMW","Toyota");
人工分配 ID 键:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
。。。。。。。。。。。。
获取数组的长度 - count() 函数
count() 函数用于返回数组的长度(元素的数量)
。。。。。。。。。。。。
遍历数值数组
遍历并打印数值数组中的所有值,您可以使用 for 循环
。。。。。。。。。。。。
PHP 关联数组(键和值)
关联数组是使用您分配给数组的指定的键的数组。
这里有两种创建关联数组的方法:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
或:
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
。。。。。。。。。。。。。
遍历关联数组
遍历并打印关联数组中的所有值,您可以使用 foreach 循环
声明两个变量,一个装属性,一个装值
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 数组排序
数组中的元素可以按字母或数字顺序进行降序或升序排列。
。。。。。。。。。。
PHP - 数组排序函数
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
。。。。。。。。。。
sort() - 对数组进行升序排列,按数组中的元素字母升序排列。数字数组就按数字的大小升序排列。
。。。。。。。。。。
rsort() - 对数组进行降序排列,按数组中的元素字母降序排列。数字数组就按数字的大小降序排列。
。。。。。。。。。。
asort() - 根据数组的值,对数组进行升序排列
ksort() - 根据数组的键,对数组进行升序排列
。。。。。。。。。。
arsort() - 根据数组的值,对数组进行降序排列
krsort() - 根据数组的键,对数组进行降序排列
。。。。。。。。。。
以上排序都用print_r输出。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 超级全局变量
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
。。。。。。。。。。
PHP 超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
。。。。。。。。。
PHP $GLOBALS
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
。。。。。。。。
PHP $_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
下表列出了所有 $_SERVER 变量中的重要元素:
$_SERVER['PHP_SELF']
当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。FILE 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。
$_SERVER['GATEWAY_INTERFACE']:服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。
$_SERVER['SERVER_ADDR']:当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME']:当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)
$_SERVER['SERVER_SOFTWARE']:服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
$_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。
$_SERVER['REQUEST_METHOD']:访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。
$_SERVER['REQUEST_TIME']:请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER['QUERY_STRING']:query string(查询字符串),如果有的话,通过它进行页面访问。
$_SERVER['HTTP_ACCEPT']:当前请求头中 Accept: 项的内容,如果存在的话。
$_SERVER['HTTP_ACCEPT_CHARSET']:当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。
$_SERVER['HTTP_HOST']:当前请求头中 Host: 项的内容,如果存在的话。
$_SERVER['HTTP_REFERER']
引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
$_SERVER['HTTPS']:如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
$_SERVER['REMOTE_ADDR']:浏览当前页面的用户的 IP 地址。
$_SERVER['REMOTE_HOST']:浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
$_SERVER['REMOTE_PORT']:用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径。
$_SERVER['SERVER_ADMIN']:该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com)
$_SERVER['SERVER_PORT']:Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER['SERVER_SIGNATURE']:包含了服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED']:当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
$_SERVER['SCRIPT_NAME']:包含当前脚本的路径。这在页面需要指向自己时非常有用。FILE 常量包含当前脚本(例如包含文件)的完整路径和文件名。
$_SERVER['SCRIPT_URI']:URI 用来指定要访问的页面。例如 "/index.html"。
。。。。。。。。
PHP $_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。
。。。。。。。。
PHP $_POST
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
。。。。。。。。
PHP $_GET
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 循环 - While 循环
循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。
。。。。。。。。。。
PHP 循环
在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。
在 PHP 中,提供了下列循环语句:
while - 只要指定的条件成立,则循环执行代码块
do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
for - 循环执行代码块指定的次数
foreach - 根据数组中每个元素来循环代码块
。。。。。。。。。
while 循环
while 循环将重复执行代码块,直到指定的条件不成立。
语法:
while (条件)
{
要执行的代码;
}
例子:
下面的实例首先设置变量 i 的值为 1 ($i=1;)。
然后,只要 i 小于或者等于 5,while 循环将继续运行。循环每运行一次,i 就会递增 1:
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
?>
输出:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
。。。。。。。。。。。。
do...while 语句
do...while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。
语法:
do
{
要执行的代码;
}
while (条件);
例子:
下面的实例首先设置变量 i 的值为 1 ($i=1;)。
然后,开始 do...while 循环。循环将变量 i 的值递增 1,然后输出。先检查条件(i 小于或者等于 5),只要 i 小于或者等于 5,循环将继续运行:
<?php
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=5);
?>
输出:
The number is 2
The number is 3
The number is 4
The number is 5
The number is 6
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 循环 - For 循环
循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。
。。。。。。。。。。。
for 循环
for 循环用于您预先知道脚本需要运行的次数的情况。
语法
for (初始值; 条件; 增量)
{
要执行的代码;
}
参数:
初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。
条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。
注释:上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
例子:
下面的实例定义一个初始值为 i=1 的循环。只要变量 i 小于或者等于 5,循环将继续运行。循环每运行一次,变量 i 就会递增 1:
<?php
for ($i=1; $i<=5; $i++)
{
echo "The number is " . $i . "<br>";
}
?>
输出:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
。。。。。。。。。。
foreach 循环
foreach 循环用于遍历数组。
语法:
foreach ($array as $value)
{
要执行代码;
}
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 函数
PHP 的真正威力源自于它的函数。
在 PHP 中,提供了超过 1000 个内建的函数。
。。。。。。。。。
PHP 函数
我们将如何创建自己的函数。
如要在页面加载时执行脚本,您可以把它放到函数里。
函数是通过调用函数来执行的。
你可以在页面的任何位置调用函数。
。。。。。。。。。
创建 PHP 函数
函数是通过调用函数来执行的。
语法:
<?php
function functionName()
{
// 要执行的代码
}
?>
PHP 函数准则:
函数的名称应该提示出它的功能
函数名称以字母或下划线开头(不能以数字开头)
。。。。。。。。。
PHP 函数 - 添加参数
为了给函数添加更多的功能,我们可以添加参数。参数类似变量。
参数就在函数名称后面有一个括号内指定。
。。。。。。。。。
PHP 函数 - 返回值
如需让函数返回一个值,请使用 return 语句。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写
。。。。。。。。。。
LINE
文件中的当前行号。
。。。。。。。。。。
FILE
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
。。。。。。。。。。
DIR
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
。。。。。。。。。。
FUNCTION
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
。。。。。。。。。。
CLASS
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
。。。。。。。。。。
TRAIT
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
。。。。。。。。。。
METHOD
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
。。。。。。。。。。
NAMESPACE
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 命名空间(namespace)
PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
const CONNECT_OK = 1;
class Connection { / ... / }
function connect() { / ... / }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject {
const CONNECT_OK = 1;
class Connection { / ... / }
function connect() { / ... / }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
。。。。。。。。。。。。
子命名空间
与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { / ... / }
function Connect() { / ... / }
?>
上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。
。。。。。。。。。。。
命名空间使用
PHP 命名空间中的类名可以通过三种方式引用:
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
注意:访问任意全局类、函数或常量,都可以使用完全限定名称
。。。。。。。。。。。。
命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响。
必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。
。。。。。。。。。。。。
namespace关键字和NAMESPACE常量
PHP支持两种抽象的访问当前命名空间内部元素的方法,NAMESPACE 魔术常量和namespace关键字。
常量NAMESPACE的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
NAMESPACE 示例, 在命名空间中的代码
关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
namespace操作符,命名空间中的代码
。。。。。。。。。。。。
使用命名空间:别名/导入
PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。
在PHP中,别名是通过操作符 use 来实现的.
。。。。。。。。。。。
使用命名空间:后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称
1、在命名空间中访问全局类对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
2、 命名空间中后备的全局函数/常量
。。。。。。。。。。。
全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
。。。。。。。。。。。
命名空间的顺序
自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。
为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 面向对象
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:
对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
对象的表示:对象的表示就相当于×××,具体区分在相同的行为与状态下有什么不同。
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。
。。。。。。。。。。。。。
面向对象内容
类:定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象:是类的实例。
成员变量:定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
成员函数:定义在类的内部,可用于访问对象的数据。
继承: 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类:一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类:一个类继承其他类称为子类,也可称为派生类。
多态:多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载:简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性: 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装:封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数:主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数:析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
。。。。。。。。。。。。
PHP 类定义
PHP 定义类通常语法格式如下:
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
解析如下:
类使用 class 关键字后加上类名定义。
类名后的一对大括号({})内可以定义变量和方法。
类的变量使用 var 来声明, 变量也可以初始化值。
函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
。。。。。。。。。。。。。
PHP 中创建对象
类创建后,我们可以使用 new 运算符来实例化该类的对象:
$runoob = new Site;
$taobao = new Site;
$google = new Site;
以上代码我们创建了三个对象,三个对象各自都是独立的
。。。。。。。。。。。。。
调用成员方法
在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量
。。。。。。。。。。。。。
PHP 构造函数
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。
PHP 5 允许开发者在一个类中定义一个方法作为构造函数,语法格式如右所示:void construct ([ mixed $args [, $... ]] )
。。。。。。。。。。。。。
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如右所示:void destruct ( void )
。。。。。。。。。。。。。
继承
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:
class Child extends Parent {
// 代码部分
}
。。。。。。。。。。。。
方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
。。。。。。。。。。。。
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
。。。。。。。。。。。
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
。。。。。。。。。。。
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
。。。。。。。。。。。
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
。。。。。。。。。。。。
Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
。。。。。。。。。。。。
Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
。。。。。。。。。。。。
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 表单和用户输入
PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入。
。。。。。。。。。。。。
PHP 表单处理,有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 PHP 脚本使用。
。。。。。。。。。。。。
PHP 获取下拉菜单的数据
PHP 下拉菜单单选
以下实例我们设置了下拉菜单三个选项,表单使用 GET 方式获取数据,action 属性值为空表示提交到当前脚本,我们可以通过 select 的 name 属性获取下拉菜单的值:
php_form_select.php 文件代码:
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?>
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
。。。。。。。。。。。。。
PHP 下拉菜单多选
如果下拉菜单是多选的( multiple="multiple"),我们可以通过将设置 select name="q[]" 以数组的方式获取,以下使用 POST 方式提交
。。。。。。。。。。。。。
单选按钮表单
PHP 单选按钮表单中 name 属性的值是一致的,value 值是不同的
。。。。。。。。。。。。
checkbox 复选框
PHP checkbox 复选框可以选择多个值:
。。。。。。。。。。。。
$_GET、$_POST 和 $_REQUEST 的区别?
$_GET 变量接受所有以 get 方式发送的请求,及浏览器地址栏中的 ? 之后的内容。
$_POST 变量接受所有以 post 方式发送的请求,例如,一个 form 以 method=post 提交,提交后 php 会处理 post 过来的全部变量。
$_REQUEST 支持两种方式发送过来的请求,即 post 和 get 它都可以接受,显示不显示要看传递方法,get 会显示在 url 中(有字符数限制),post 不会在 url 中显示,可以传递任意多的数据(只要服务器支持)。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 表单验证
表单验证
我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的压力。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单的数据传给当前页面(异步提交的方式更好),而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。如何使用PHP验证客户端提交的表单数据。
。。。。。。。。。。。
PHP 表单验证
在处理PHP表单时我们需要考虑安全性。PHP表单数据安全处理,为了防止×××及垃圾信息我们需要对表单进行数据安全验证。
一般表单验证如下:
名字 必须。 +只能包含字母和空格
E-mail 必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')
网址 可选。如果存在,它必须包含一个有效的URL
备注 可选。多行输入字段(文本域)
性别 必须。 必须选择一个
。。。。。。。。。。。。
表单使用 method="post" 方法来提交数据。
。。。。。。。。。。。。
什么是 $_SERVER["PHP_SELF"] 变量?
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
所以, $_SERVER["PHP_SELF"] 会发送表单数据到当前页面,而不是跳转到不同的页面。
。。。。。。。。。。。。
什么是 htmlspecialchars()方法?
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
(大于) 成为 >
。。。。。。。。。。。。
PHP表单中需引起注重的地方?
$_SERVER["PHP_SELF"] 变量有可能会被×××使用!
当×××使用跨网站脚本的HTTP链接来×××时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。
XSS又叫 CSS (Cross-Site Script) ,跨站脚本×××。恶意×××者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
指定以下表单文件名为 "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,我们使用URL来指定提交地址 "test_form.php",以上代码修改为如下所示:
<form method="post" action="test_form.php">
这样做就很好了。
但是,考虑到用户会在浏览器地址栏中输入以下地址:
http://www.runoob.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
以上的 URL 中,将被解析为如下代码并执行:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)。 这仅仅只是一个简单的实例来说明PHP_SELF变量会被×××利用。
请注意, 任何JavaScript代码可以添加在<script>标签中! ×××可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。
。。。。。。。。。。。。。
如何避免 $_SERVER["PHP_SELF"] 被利用?
$_SERVER["PHP_SELF"] 可以通过 htmlspecialchars() 函数来避免被利用。
form 代码如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用 PHP_SELF 变量, 结果将输出如下所示:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
尝试该漏洞失败!
。。。。。。。。。。。。。
使用 PHP 验证表单数据
首先我们对用户所有提交的数据都通过 PHP 的 htmlspecialchars() 函数处理。
当我们使用 htmlspecialchars() 函数时,在用户尝试提交以下文本域:
<script>location.href('http://www.runoob.com')</script>
该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:
<script>location.href('http://www.runoob.com')</script>
以上代码是安全的,可以正常在页面显示或者插入邮件中。
当用户提交表单时,我们将做以下两件事情:
使用PHP stripslashes()函数去除用户输入数据中的反斜杠 () 接下来让我们将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。 将函数命名为 test_input()。 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: PHP 表单 - 必需字段 字段 验证规则 名字 必需。 + 只能包含字母和空格 E-mail 必需。 + 必需包含一个有效的电子邮件地址(包含"@"和".") 网址 可选。 如果存在,它必需包含一个有效的URL 备注 可选。多行字段(文本域)。 性别 必需。必需选择一个。 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: PHP 表单 - 验证邮件和URL 现在我们来学如何验证 names(名称), e-mails(邮件), 和 URLs。 。。。。。。。。。。。。 PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息: $name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } 。。。。。。。。。。。。 preg_match — 进行正则表达式匹配。 语法:int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] ) 在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。如果提供了 matches ,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。 。。。。。。。。。。。。 PHP - 验证邮件 以下代码将通过简单的方式来检测 e-mail 地址是否合法。如果 e-mail 地址不合法,将输出错误信息: $email = test_input($_POST["email"]); if (!preg_match("/([\w-]+\@[\w-]+.[\w-]+)/",$email)) { $emailErr = "非法邮箱格式"; } 。。。。。。。。。。。 PHP - 验证 URL 以下代码将检测URL地址是否合法 (以下正则表达式运行URL中含有破折号:"-"), 如果 URL 地址不合法,将输出错误信息: $website = test_input($_POST["website"]); if (!preg_match("/\b(?:(?:https? |
ftp):\/\/ | www.)[-a-z0-9+&@#\/%?=~_ | !:,.;]*[-a-z0-9+&@#\/%=~_ | ]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } |
---|
PHP $_GET 变量
在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
。。。。。。。。。。。
何时使用 method="get"?
在 HTML 表单中使用 method="get" 时,所有的变量名和值都会显示在 URL 中。
注释:所以在发送密码或其他敏感信息时,不应该使用这个方法!
然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。
注释:HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP $_POST 变量
在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
。。。。。。。。。。。
$_POST 变量
预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。
。。。。。。。。。。。
何时使用 method="post"?
从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
然而,由于变量不显示在 URL 中,所以无法把页面加入书签。
。。。。。。。。。。。
PHP $_REQUEST 变量
预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 多维数组
一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组
。。。。。。。。。
PHP - 多维数组
多维数组是包含一个或多个数组的数组。
在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。
。。。。。。。。。
输出方式其中的一种:
echo $#['#'][0] . '地址为:' . $#['#'][1];
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP date() 函数
PHP date() 函数用于格式化时间/日期。
。。。。。。。。。
PHP date() 函数
PHP date() 函数可把时间戳格式化为可读性更好的日期和时间。
Tip时间戳是一个字符序列,表示一定的事件发生的日期/时间。
语法:string date ( string $format [, int $timestamp ] )
参数 描述
format 必需。规定时间戳的格式。
timestamp 可选。规定时间戳。默认是当前的日期和时间。
。。。。。。。。。。
PHP Date() - 格式化日期
date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。
这里列出了一些可用的字符:
d - 代表月中的天 (01 - 31)
m - 代表月 (01 - 12)
Y - 代表年 (四位数)
。。。。。。。。。。
format 字符 说明 返回值例子
日 --- ---
d 月份中的第几天,有前导零的 2 位数字 01 到 31
D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun
j 月份中的第几天,没有前导零 1 到 31
l ("L"的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0 到 365
星期 --- ---
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
月 --- ---
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 数字表示的月份,有前导零 01 到 12
M 三个字母缩写表示的月份 Jan 到 Dec
n 数字表示的月份,没有前导零 1 到 12
t 给定月份所应有的天数 28 到 31
年 --- ---
L 是否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:1999 或 2003
y 2 位数字表示的年份 例如:99 或 03
时间 --- ---
a 小写的上午和下午值 am 或 pm
A 大写的上午和下午值 AM 或 PM
B Swatch Internet 标准时 000 到 999
g 小时,12 小时格式,没有前导零 1 到 12
G 小时,24 小时格式,没有前导零 0 到 23
h 小时,12 小时格式,有前导零 01 到 12
H 小时,24 小时格式,有前导零 00 到 23
i 有前导零的分钟数 00 到 59>
s 秒数,有前导零 00 到 59>
u 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 示例: 654321
时区 --- ---
e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否为夏令时 如果是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 例如:+0200
P 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00
T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。
Z 时差偏移量的秒数.UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200
完整的日期/时间 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time()
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 包含文件
PHP include 和 require 语句
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
。。。。。。。。。。。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法:
include 'filename';
或者
require 'filename';
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 文件处理
fopen() 函数用于在 PHP 中打开文件。
。。。。。。。。。
打开文件
fopen() 函数用于在 PHP 中打开文件。
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
<?php
$file=fopen("welcome.txt","r");
?>
文件可能通过下列模式来打开:
模式 描述
r 只读。在文件的开头开始。
r+ 读/写。在文件的开头开始。
w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+ 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+ 读/追加。通过向文件末尾写内容,来保持文件内容。
x 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+ 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
。。。。。。。。。。。
关闭文件
fclose() 函数用于关闭打开的文件:
<?php
$file = fopen("test.txt","r");
//执行一些代码
fclose($file);
?>
。。。。。。。。。。
检测文件末尾(EOF)
feof() 函数检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
注释:在 w 、a 和 x 模式下,您无法读取打开的文件!
if (feof($file)) echo "文件结尾";
。。。。。。。。。。
逐行读取文件
fgets() 函数用于从文件中逐行读取文件。
注释:在调用该函数之后,文件指针会移动到下一行。
。。。。。。。。。。
逐字符读取文件
fgetc() 函数用于从文件中逐字符地读取文件。
注释:在调用该函数之后,文件指针会移动到下一个字符。
。。。。。。。。。。
PHP对逗号分隔符文件(*.csv)的处理。
当如果你需要处理的数据比较少时可以使用csv文件(这是一类文本文件)存储数据更加便利。
注意:CSV文本编码必须和HTML的编码相同,否则用php写到HTML中,用户会看到乱码。也可以使用 iconv 转码函数进行转码。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 文件上传
通过 PHP,可以把文件上传到服务器。
。。。。。。。。。。。。
创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
。。。。。。。。。。。。
HTML创建上传文件表单
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
。。。。。。。。。。。
创建上传脚本
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
$_FILES["file"]["name"] - 上传文件的名称
$_FILES["file"]["type"] - 上传文件的类型
$_FILES["file"]["size"] - 上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。
。。。。。。。。。。。
上传限制
保存被上传的文件
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP Cookie
cookie 常用于识别用户。
。。。。。。。。。。。
Cookie 是什么?
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
。。。。。。。。。。。
如何创建 Cookie?
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法:setcookie(name, value, expire, path, domain);
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
。。。。。。。。。。。
如何取回 Cookie 的值?
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
。。。。。。。。。。。
如何删除 Cookie?
当删除 cookie 时,您应当使过期日期变更为过去的时间点。
。。。。。。。。。。。
如果浏览器不支持 Cookie 该怎么办?
如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP Session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
。。。。。。。。。。。。
PHP Session 变量
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
。。。。。。。。。。。。
开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
注释:session_start() 函数必须位于 <html> 标签之前
。。。。。。。。。。。。
存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量
。。。。。。。。。。。。
销毁 Session
如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量
您也可以通过调用 session_destroy() 函数彻底销毁 session
注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 发送电子邮件
PHP 允许您从脚本直接发送电子邮件。
。。。。。。。。。。。。。
PHP mail() 函数
PHP mail() 函数用于从脚本中发送电子邮件。
语法:mail(to,subject,message,headers,parameters)
to 必需。规定 email 接收者。
subject 必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message 必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。每行应该限制在 70 个字符内。
headers 可选。规定附加的标题,比如 From、Cc 和 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。
parameters 可选。对邮件发送程序规定额外的参数。
注释:PHP 运行邮件函数需要一个已安装且正在运行的邮件系统(如:sendmail、postfix、qmail等)。所用的程序通过在 php.ini 文件中的配置设置进行定义。
。。。。。。。。。。。。。。
PHP 简易 E-Mail,通过 PHP 发送电子邮件的最简单的方式是发送一封文本 email。
。。。。。。。。。。。。。。
PHP Mail 表单,通过 PHP,您能够在自己的站点制作一个反馈表单。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP Secure(安全) E-mails
。。。。。。。。。。
PHP 防止 E-mail 注入,防止 e-mail 注入的最好方法是对输入进行验证。
我们使用了 PHP 过滤器来对输入进行验证:
FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 错误处理
在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。
。。。。。。。。。。
PHP 错误处理
在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
线面是一些最为重要的错误检测方法。
将为您讲解不同的错误处理方法:
简单的 "die()" 语句
自定义错误和错误触发器
错误报告
。。。。。。。。。。
基本的错误处理:使用 die() 函数
。。。。。。。。。。
创建自定义错误处理器
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):
语法:
error_function(error_level,error_message,
error_file,error_line,error_context)
error_level 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
error_message 必需。为用户定义的错误规定错误消息。
error_file 可选。规定错误发生的文件名。
error_line 可选。规定错误发生的行号。
error_context 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
。。。。。。。。。。。
错误报告级别,这些错误报告级别是用户自定义的错误处理程序处理的不同类型的错误
值 常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
。。。。。。。。。。。。
设置错误处理程序
PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。
可以修改错误处理程序,使其仅应用到某些错误,这样脚本就能以不同的方式来处理不同的错误。
。。。。。。。。。。。。
触发错误
在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 PHP 中,这个任务由 trigger_error() 函数完成。
可能的错误类型:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
。。。。。。。。。。。。
错误记录
在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 异常处理,异常用于在指定的错误发生时改变脚本的正常流程。
。。。。。。。。。。。。
异常是什么
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
当前代码状态被保存
代码执行被切换到预定义(自定义)的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:
异常的基本使用
创建自定义的异常处理器
多个异常
重新抛出异常
设置顶层异常处理器
注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。
。。。。。。。。。。。。
异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
。。。。。。。。。。。。
Try、throw 和 catch
要避免上面实例中出现的错误,我们需要创建适当的代码来处理异常。
适当的处理异常代码应该包括:
Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
。。。。。。。。。。。。
创建一个自定义的 Exception 类
创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。
这个自定义的 customException 类继承了 PHP 的 exception 类的所有属性,您可向其添加自定义的函数。
。。。。。。。。。。。。
多个异常
可以为一段脚本使用多个异常,来检测多种情况。
可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息
。。。。。。。。。。。。
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常
。。。。。。。。。。。。
设置顶层异常处理器
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
。。。。。。。。。。。。
异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。
简而言之:如果抛出了异常,就必须捕获它。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 过滤器
PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。
。。。。。。。。。。。。
什么是 PHP 过滤器?
PHP 过滤器用于验证和过滤来自非安全来源的数据。
测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。
。。。。。。。。。。。。
为什么使用过滤器?
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
您应该始终对外部数据进行过滤!
输入过滤是最重要的应用程序安全课题之一。
什么是外部数据?
来自表单的输入数据
Cookies
Web services data(服务数据)
服务器变量
数据库查询结果
。。。。。。。。。。。。。。
函数和过滤器
如需过滤变量,请使用下面的过滤器函数之一:
filter_var() - 通过一个指定的过滤器来过滤单一的变量
filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
filter_input - 获取一个输入变量,并对它进行过滤
filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
。。。。。。。。。。。。。。
Validating 和 Sanitizing
有两种过滤器:
Validating 过滤器:
用于验证用户输入
严格的格式规则(比如 URL 或 E-Mail 验证)
如果成功则返回预期的类型,如果失败则返回 FALSE
Sanitizing 过滤器:
用于允许或禁止字符串中指定的字符
无数据格式规则
始终返回字符串
。。。。。。。。。。。。。
选项和标志
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志。
。。。。。。。。。。。。。
验证输入
让我们试着验证来自表单的输入。
我们需要做的第一件事情是确认是否存在我们正在查找的输入数据。
然后我们用 filter_input() 函数过滤输入的数据。
。。。。。。。。。。。。。
净化输入
让我们试着清理一下从表单传来的 URL。
首先,我们要确认是否存在我们正在查找的输入数据。
然后,我们用 filter_input() 函数来净化输入数据。
。。。。。。。。。。。。。
过滤多个输入
表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。
。。。。。。。。。。。。。
使用 Filter Callback
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。
您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。
将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 高级过滤器
。。。。。。。。。。
检测一个数字是否在一个范围内
。。。。。。。。。。
检测 IPv6 地址
。。。。。。。。。。
检测 URL - 必须包含QUERY_STRING(查询字符串)
。。。。。。。。。。
移除 ASCII 值大于 127 的字符
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP JSON
我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象。
。。。。。。。。。。
环境配置,在 php5.2.0 及以上版本已经内置 JSON 扩展。
。。。。。。。。。。
JSON 函数
函数 描述
json_encode 对变量进行 JSON 编码
json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
json_last_error 返回最后发生的错误
。。。。。。。。。。
json_encode
PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。
语法:string json_encode ( $value [, $options = 0 ] )
参数
value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
options:由以下常量组成的二进制掩码:
JSON_HEX_QUOT
JSON_HEX_TAG
JSON_HEX_AMP
JSON_HEX_APOS
JSON_NUMERIC_CHECK
JSON_PRETTY_PRINT
JSON_UNESCAPED_SLASHES
JSON_FORCE_OBJECT
。。。。。。。。。。。
json_decode
PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。
语法:mixed json_decode ($json_string [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
参数
json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
assoc : 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
depth : 整数类型的参数,它指定递归深度
options : 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PHP 7 新特性
PHP 7+ 版本极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。
PHP 7+ 版本新加特性如下表所示:
序号 内容
1 PHP 标量类型与返回值类型声明
2 PHP NULL 合并运算符
3 PHP 太空船运算符(组合比较符)
4 PHP 常量数组
5 PHP 匿名类
6 PHP Closure::call()
7 PHP 过滤 unserialize()
8 PHP IntlChar()
9 PHP CSPRNG
10 PHP 7 异常
11 PHP 7 use 语句
12 PHP 7 错误处理
13 PHP intdiv() 函数
14 PHP 7 Session 选项
15 PHP 7 废弃特性
16 PHP 7 移除的扩展
17 PHP 7 移除的 SAPI
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: PHP 数据库 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: PHP MySQL 简介 通过 PHP,您可以连接和操作数据库。 MySQL 是跟 PHP 配套使用的最流行的开源数据库系统。 。。。。。。。。。。。。。 MySQL 是什么? MySQL 是一种在 Web 上使用的数据库系统。 MySQL 是一种在服务器上运行的数据库系统。 MySQL 不管在小型还是大型应用程序中,都是理想的选择。 MySQL 是非常快速,可靠,且易于使用的。 MySQL 支持标准的 SQL。 MySQL 在一些平台上编译。 MySQL 是免费下载使用的。 MySQL 是由 Oracle 公司开发、发布和支持的。 MySQL 是以公司创始人 Monty Widenius's daughter: My 命名的。 MySQL 中的数据存储在表中。表格是一个相关数据的集合,它包含了列和行。 在分类存储信息时,数据库非常有用。一个公司的数据库可能拥有以下表: Employees Products Customers Orders 。。。。。。。。。 PHP + MySQL PHP 与 MySQL 结合是跨平台的。(您可以在 Windows 上开发,在 Unix 平台上应用。) 。。。。。。。。。 查询 查询是一种询问或请求。 通过 MySQL,我们可以向数据库查询具体的信息,并得到返回的记录集。 请看下面的查询(使用标准 SQL): mysql> set names utf8; mysql> SELECT name FROM websites; +---------------+ |
name | +---------------+ |
淘宝 | 菜鸟教程 | 微博 | stackoverflow | +---------------+ 6 rows in set (0.00 sec) 语句 set names utf8;用于设定数据库编码,让中文可以正常显示。 上面的查询选取了 "websites" 表中 "name" 列的所有数据。 。。。。。。。。。。。 下载 MySQL 数据库 如果您的 PHP 服务器没有 MySQL 数据库,可以在此免费下载 MySQL: http://www.mysql.com。 。。。。。。。。。。。 关于 MySQL 数据库的事实 关于 MySQL 的一点很棒的特性是,可以对它进行缩减,来支持嵌入的数据库应用程序。也许正因为如此,许多人认为 MySQL 仅仅能处理中小型的系统。 事实上,对于那些支持巨大数据和访问量的网站(比如 Friendster、Yahoo、Google),MySQL 是事实上的标准数据库。 |
---|
PHP 连接 MySQL
PHP 5 及以上版本建议使用以下方式连接 MySQL :
MySQLi extension ("i" 意为 improved)
PDO (PHP Data Objects)
在 PHP 早期版本中我们使用 MySQL 扩展。但该扩展在 2012 年开始不建议使用。
。。。。。。。。。。。。。。。。
我是该用 MySQLi ,还是 PDO?
如果你需要一个简短的回答,即 "你习惯哪个就用哪个"。
MySQLi 和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
两者都是面向对象, 但 MySQLi 还提供了 API 接口。
两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。
。。。。。。。。。。。。。。。。
MySQLi 和 PDO 连接 MySQL 实例
我们会使用以下三种方式来演示 PHP 操作 MySQL:
MySQLi (面向对象)
MySQLi (面向过程)
PDO
。。。。。。。。。。。。。。。
MySQLi 安装,Linux 和 Windows: 在 php5 mysql 包安装时 MySQLi 扩展多数情况下是自动安装的。可以通过 phpinfo() 查看是否安装成功
安装详细信息,请查看: http://php.net/manual/en/mysqli.installation.php
。。。。。。。。。。。。。。。
PDO 安装,可以通过 phpinfo() 查看是否安装成功
PDO 安装详细信息,请查看: http://php.net/manual/en/pdo.installation.php
。。。。。。。。。。。。。。。
连接 MySQL
在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。