PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
-
PHP在服务器上执行
-
PHP 是 "PHP Hypertext Preprocessor" 的首字母缩略词
-
PHP 文件能够包含文本、HTML、CSS 以及 PHP 代码
-
PHP 代码在服务器上执行,而结果以纯文本返回浏览器
-
PHP 文件的后缀是 ".php"
- PHP 能够生成动态页面内容
- PHP 能够创建、打开、读取、写入、删除以及关闭服务器上的文件
- PHP 能够接收表单数据
- PHP 能够发送并取回 cookies
- PHP 能够添加、删除、修改数据库中的数据
- PHP 能够限制用户访问网站中的某些页面
- PHP 能够对数据进行加密
通过 PHP,您可以不受限于只输出 HTML。您还能够输出图像、PDF 文件、甚至 Flash 影片。您也可以输出任何文本,比如 XHTML 和 XML。
- PHP 运行于各种平台(Windows, Linux, Unix, Mac OS X 等等)
- PHP 兼容几乎所有服务器(Apache, IIS 等等)
- PHP 支持多种数据库
- PHP 是免费的。请从官方 PHP 资源下载:www.php.net
- PHP 易于学习,并可高效地运行在服务器端
- 使用支持 PHP 和 MySQL 的 web 主机
- 在您的 PC 上安装 web 服务器,然后安装 PHP 和 MySQL。
使用支持 PHP 的 Web 主机
如果您的服务器支持 PHP,那么您无需做任何事情。
只要创建 .php 文件,然后上传到 web 目录中即可。服务器会自动对它们进行解析。
您无需编译或安装任何额外的工具。
因为 PHP 是免费的,大多数 web 主机都支持 PHP。
在PC上运行PHP
不过如果您的服务器不支持 PHP,那么您必须:
- 安装 web 服务器
- 安装 PHP
- 安装数据库,比如 MySQL
官方的 PHP 网站 (PHP.net) 提供了 PHP 的安装说明:http://php.net/manual/zh/install.php
**提示:**如需在 Windows 平台设置并立即运行 PHP,您还可以:
PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果。
PHP 脚本可放置于文档中的任何位置。
PHP 脚本以 结尾:
<?php
// 此处是 PHP 代码
?>
PHP 文件的默认文件扩展名是 ".php"。
PHP 文件通常包含 HTML 标签以及一些 PHP 脚本代码。
例子:
其中包含了使用内建 PHP 函数 "echo" 在网页上输出文本 "Hello World!" 的一段 PHP 脚本:
<!DOCTYPE html>
<html>
<body>
<h1>我的第一张 PHP 页面</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
**注释:**PHP 语句以分号结尾(;)。PHP 代码块的关闭标签也会自动表明分号(因此在 PHP 代码块的最后一行不必使用分号)。
PHP 代码中的注释不会被作为程序来读取和执行。它唯一的作用是供代码编辑者阅读。
注释用于:
- 使其他人理解您正在做的工作 - 注释可以让其他程序员了解您在每个步骤进行的工作(如果您供职于团队)
- 提醒自己做过什么 - 大多数程序员都曾经历过一两年后对项目进行返工,然后不得不重新考虑他们做过的事情。注释可以记录您在写代码时的思路。
PHP支持3中注释:
<!DOCTYPE html>
<html>
<body>
<?php
// 这是单行注释
# 这也是单行注释
/*
这是多行注释块
它横跨了
多行
*/
?>
</body>
</html>
在 PHP 中,所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感。
不过在 PHP 中,所有变量都对大小写敏感。
变量是存储信息的容器:
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
类似代数,在代数中我们使用字母(比如 x)来保存值(比如 5)。
在 PHP 中,起到代数作用的被称为变量。
**注释:**请把变量视为存储数据的容器。
正如代数,PHP 变量可用于保存值(x=5)和表达式(z=x+y)。
变量的名称可以很短(比如 x 和 y),也可以取更具描述性的名称(比如 carname、total_volume)。
- 变量以 $ 符号开头,其后是变量的名称
- 变量名称必须以字母或下划线开头
- 变量名称不能以数字开头
- 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
- 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
**注释:**PHP 变量名称对大小写敏感!
PHP 没有创建变量的命令。
变量会在首次为其赋值时被创建:
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>
以上语句执行后,变量 txt 会保存值 Hello world!,变量 x 会保存值 5,变量 y 会保存值 10.5。
**注释:**如果您为变量赋的值是文本,请用引号包围该值。
在上面的例子中,请注意我们不必告知 PHP 变量的数据类型。
PHP 根据它的值,自动把变量转换为正确的数据类型。
在诸如 C 和 C++ 以及 Java 之类的语言中,程序员必须在使用变量之前声明它的名称和类型。
在 PHP 中,可以在脚本的任意位置对变量进行声明。
变量的作用域指的是变量能够被引用/使用的那部分脚本。
PHP 有三种不同的变量作用域:
- local(局部)
- global(全局)
- static(静态)
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
<?php
$x=5; // 全局作用域
function myTest() {
$y=10; // 局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
}
myTest();
echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
在上例中,有两个变量 $x 和 $y,以及一个函数 myTest()。$x 是全局变量,因为它是在函数之外声明的,而 $y 是局部变量,因为它是在函数内声明的。
如果我们在 myTest() 函数内部输出两个变量的值,$y 会输出在本地声明的值,但是无法 $x 的值,因为它在函数之外创建。
然后,如果在 myTest() 函数之外输出两个变量的值,那么会输出 $x 的值,但是不会输出 $y 的值,因为它是局部变量,并且在 myTest() 内部创建。
**注释:**您可以在不同的函数中创建名称相同的局部变量,因为局部变量只能被在其中创建它的函数识别。
global 关键词用于在函数内访问全局变量。
要做到这一点,请在(函数内部)变量前面使用 global 关键词:
<?php
$x=5;
$y=10;
function myTest() {
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?
PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
上式可重写:
<?php
$x=5;
$y=10;
function myTest() {
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出 15
?>
通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。实现这一点需要更进一步的工作。
要完成这一点,请在您首次声明变量时使用 static 关键词:
<?php
function myTest() {
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
然后,每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息。
**注释:**该变量仍然是函数的局部变量。
在 PHP 中,有两种基本的输出方法:echo 和 print。
echo 和 print 之间的差异:
- echo - 能够输出一个以上的字符串
- print - 只能输出一个字符串,并始终返回 1
**提示:**echo 比 print 稍快,因为它不返回任何值。
echo 是一个语言结构,有无括号均可使用:echo 或 echo()。
下面的例子展示如何用 echo 命令来显示不同的字符串(同时请注意字符串中能包含 HTML 标记):
<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";
?>
运行结果:
<?php
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");
echo $txt1;
echo "<br>";
echo "Study PHP at $txt2";
echo "My car is a {$cars[0]}";
?>
print 也是语言结构,有无括号均可使用:print 或 print()。
下面的例子展示如何用 print 命令来显示不同的字符串(同时请注意字符串中能包含 HTML 标记):
<?php
print "<h2>PHP is fun!</h2>";
print "Hello world!<br>";
print "I'm about to learn PHP!";
?>
<?php
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");
print $txt1;
print "<br>";
print "Study PHP at $txt2";
print "My car is a {$cars[0]}";
?>
字符串、整数、浮点数、逻辑、数组、对象、NULL。
字符串是字符序列,比如 "Hello world!"。
字符串可以是引号内的任何文本。您可以使用单引号或双引号:
<?php
$x = "Hello world!";
echo $x;
echo "<br>";
$x = 'Hello world!';
echo $x;
?>
整数是没有小数的数字。
整数规则:
- 整数必须有至少一个数字(0-9)
- 整数不能包含逗号或空格
- 整数不能有小数点
- 整数正负均可
- 可以用三种格式规定整数:十进制、十六进制(前缀是 0x)或八进制(前缀是 0)
在下面的例子中,我们将测试不同的数字。PHP var_dump() 会返回变量的数据类型和值:
<?php
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
浮点数是有小数点或指数形式的数字。
在下面的例子中,我们将测试不同的数字。PHP var_dump() 会返回变量的数据类型和值:
<?php
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>
逻辑是 true 或 false。
$x=true;
$y=false;
逻辑常用于条件测试。
数组在一个变量中存储多个值。
在下面的例子中,我们将测试不同的数组。PHP var_dump() 会返回变量的数据类型和值:
<?php
$cars=array("Volvo","BMW","SAAB");
var_dump($cars);
?>
对象是存储数据和有关如何处理数据的信息的数据类型。
在 PHP 中,必须明确地声明对象。
首先我们必须声明对象的类。对此,我们使用 class 关键词。类是包含属性和方法的结构。
然后我们在对象类中定义数据类型,然后在该类的实例中使用此数据类型:
<?php
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>
特殊的 NULL 值表示变量无值。NULL 是数据类型 NULL 唯一可能的值。
NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。
可以通过把值设置为 NULL,将变量清空:
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
字符串是字符序列,比如 "Hello world!"。
返回字符串的长度,以字符记。
strlen() 常用于循环和其他函数, 在确定字符串何时结束很重要时。(例如,在循环中,我们也许需要在字符串的最后一个字符之后停止循环)。
对字符串中的单词进行计数
反转字符串
strpos() 函数用于检索字符串内指定的字符或文本。
如果找到匹配,则会返回首个匹配的字符位置。如果未找到匹配,则将返回 FALSE。(从首字符的位置0开始)
<?php
echo strpos("Hello world!","world");
?>
一些字符串替换字符串中的另一些字符
用 "Kitty" 替换文本 "world":
<?php
echo str_replace("world", "Kitty", "Hello world!"); // 输出 Hello Kitty!
?>
常量类似变量,但是常量一旦被定义就无法更改或撤销定义。
常量是单个值的标识符(名称)。在脚本中无法改变该值。
有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。
**注释:**与变量不同,常量贯穿整个脚本是自动全局的。
如需设置常量,请使用 define()
函数 - 它使用三个参数:
- 首个参数定义常量的名称
- 第二个参数定义常量的值
- 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。
下例创建了一个对大小写敏感的常量,值为 "Welcome to W3School.com.cn!":
<?php
define("GREETING", "Welcome to W3School.com.cn!");
echo GREETING;
?>
创建一个对大小写不敏感的常量,值为 "Welcome to W3School.com.cn!":
<?php
define("GREETING", "Welcome to W3School.com.cn!", true);
echo greeting;
?>
常量是自动全局的,而且可以贯穿整个脚本使用。
下面的例子在函数内使用了一个常量,即使它在函数外定义:
<?php
define("GREETING", "Welcome to W3School.com.cn!");
function myTest() {
echo GREETING;
}
myTest();
?>
运算符 | 名称 | 例子 | 结果 | 显示结果 |
---|---|---|---|---|
+ | 加法 | $x + $y | $x 与 $y 求和 | 显示结果 |
- | 减法 | $x - $y | $x 与 $y 的差数 | 显示结果 |
* | 乘法 | $x * $y | $x 与 $y 的乘积 | 显示结果 |
/ | 除法 | $x / $y | $x 与 $y 的商数 | 显示结果 |
% | 取模 | $x % $y | $x 除 $y 的余数 | 显示结果 |
<?php
$x=17;
$y=8;
echo ($x + $y); // 输出 25
echo ($x - $y); // 输出 9
echo ($x * $y); // 输出 136
echo ($x / $y); // 输出 2.125
echo ($x % $y); // 输出 1
?>
PHP 赋值运算符用于向变量写值。
PHP 中基础的赋值运算符是 "="。这意味着右侧赋值表达式会为左侧运算数设置值。
赋值 | 等同于 | 描述 | 显示结果 |
---|---|---|---|
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 | 模数 | 显示结果 |
下例展示了使用不同赋值运算符的不同结果:
<?php
$x=17;
echo $x; // 输出 17
$y=17;
$y += 8;
echo $y; // 输出 25
$z=17;
$z -= 8;
echo $z; // 输出 9
$i=17;
$i *= 8;
echo $i; // 输出 136
$j=17;
$j /= 8;
echo $j; // 输出 2.125
$k=17;
$k %= 8;
echo $k; // 输出 1
?>
运算符 | 名称 | 例子 | 结果 | 显示结果 |
---|---|---|---|---|
. | 串接 | $txt1 = "Hello" $txt2 = $txt1 . " world!" | 现在 $txt2 包含 "Hello world!" | 显示结果 |
.= | 串接赋值 | $txt1 = "Hello" $txt1 .= " world!" | 现在 $txt1 包含 "Hello world!" | 显示结果 |
下例展示了使用字符串运算符的结果:
<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出 Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出 Hello world!
?>
运算符 | 名称 | 描述 | 显示结果 |
---|---|---|---|
++$x | 前递增 | $x 加一递增,然后返回 $x | 显示结果 |
$x++ | 后递增 | 返回 $x,然后 $x 加一递增 | 显示结果 |
--$x | 前递减 | $x 减一递减,然后返回 $x | 显示结果 |
$x-- | 后递减 | 返回 $x,然后 $x 减一递减 | 显示结果 |
下例展示了使用不同递增/递减运算符的不同结果:
<?php
$x=17;
echo ++$x; // 输出 18
$y=17;
echo $y++; // 输出 17
$z=17;
echo --$z; // 输出 16
$i=17;phpphp
echo $i--; // 输出 17
?>
PHP 比较运算符用于比较两个值(数字或字符串):
运算符 | 名称 | 例子 | 结果 | 显示结果 |
---|---|---|---|---|
== | 等于 | $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。 | 显示结果 |
> | 大于 | $x > $y | 如果 $x 大于 $y,则返回 true。 | 显示结果 |
< | 小于 | $x < $y | 如果 $x 小于 $y,则返回 true。 | 显示结果 |
>= | 大于或等于 | $x >= $y | 如果 $x 大于或者等于 $y,则返回 true. | 显示结果 |
<= | 小于或等于 | $x <= $y | 如果 $x 小于或者等于 $y,则返回 true。 | 显示结果 |
下例展示了使用某些比较运算符的不同结果:
<?php
$x=17;
$y="17";
var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x !== $y);
echo "<br>";
$a=17;
$b=8;
var_dump($a > $b);
echo "<br>";
var_dump($a < $b);
?>
运算符 | 名称 | 例子 | 结果 | 显示结果 |
---|---|---|---|---|
and | 与 | $x and $y | 如果 $x 和 $y 都为 true,则返回 true。 | 显示结果 |
or | 或 | $x or $y | 如果 $x 和 $y 至少有一个为 true,则返回 true。 | 显示结果 |
xor | 异或 | $x xor $y | 如果 $x 和 $y 有且仅有一个为 true,则返回 true。 | 显示结果 |
&& | 与 | $x && $y | 如果 $x 和 $y 都为 true,则返回 true。 | 显示结果 |
|| | 或 | $x || $y | 如果 $x 和 $y 至少有一个为 true,则返回 true。 | 显示结果 |
! | 非 | !$x | 如果 $x 不为 true,则返回 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。 | 显示结果 |
下例展示了使用不同数组运算符的不同结果:
<?php
$x = array("a" => "apple", "b" => "banana");
$y = array("c" => "orange", "d" => "peach");
$z = $x + $y; // $x 与 $y 的联合
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>
条件语句用于基于不同条件执行不同的动作
在您编写代码时,经常会希望为不同的决定执行不同的动作。您可以在代码中使用条件语句来实现这一点。
在 PHP 中,我们可以使用以下条件语句:
- if 语句 - 如果指定条件为真,则执行代码
- if...else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
- if...elseif....else 语句 - 根据两个以上的条件执行不同的代码块
- switch 语句 - 选择多个代码块之一来执行
if 语句用于在指定条件为 true 时执行代码。
if (条件) {
当条件为 true 时执行的代码;
}
下例将输出 "Have a good day!",如果当前时间 (HOUR) 小于 20:
<?php
$t=date("H");
if ($t<"20") {
echo "Have a good day!";
}
?>
请使用 if....else 语句在条件为 true 时执行代码,在条件为 false 时执行另一段代码。
if (条件) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}
请使用 if....elseif...else 语句来根据两个以上的条件执行不同的代码。
if (条件) {
条件为 true 时执行的代码;
} elseif (condition) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}
switch 语句用于基于不同条件执行不同动作。
如果您希望有选择地执行若干代码块之一,请使用 Switch 语句。
使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。
switch (expression)
{
case label1:
expression = label1 时执行的代码 ;
break;
case label2:
expression = label2 时执行的代码 ;
break;
default:
表达式的值不等于 label1 及 label2 时执行的代码;
}
工作原理:
- 对表达式(通常是变量)进行一次计算
- 把表达式的值与结构中 case 的值进行比较
- 如果存在匹配,则执行与 case 关联的代码
- 代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
- 如果没有 case 为真,则使用 default 语句
PHP while 循环在指定条件为 true 时执行代码块。
在您编写代码时,经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务,而不是在脚本中添加若干几乎相等的代码行。
在 PHP 中,我们有以下循环语句:
- while - 只要指定条件为真,则循环代码块
- do...while - 先执行一次代码块,然后只要指定条件为真则重复循环
- for - 循环代码块指定次数
- foreach - 遍历数组中的每个元素并循环代码块
只要指定的条件为真,while 循环就会执行代码块。
while (条件为真) {
要执行的代码;
}
下例首先把变量 $x 设置为 1($x=1)。然后执行 while 循环,只要 $x 小于或等于 5。循环每运行一次,$x 将递增 1:
<?php
$x=1;
while($x<=5) {
echo "这个数字是:$x <br>";
$x++;
}
?>
do...while 循环首先会执行一次代码块,然后检查条件,如果指定条件为真,则重复循环。
do {
要执行的代码;
} while (条件为真);
下面的例子首先把变量 $x 设置为 1($x=1)。然后,do while 循环输出一段字符串,然后对变量 $x 递增 1。随后对条件进行检查($x 是否小于或等于 5)。只要 $x 小于或等于 5,循环将会继续运行:
<?php
$x=1;
do {
echo "这个数字是:$x <br>";
$x++;
} while ($x<=5);
?>
请注意,do while 循环只在执行循环内的语句之后才对条件进行测试。这意味着 do while 循环至少会执行一次语句,即使条件测试在第一次就失败了。
下面的例子把 $x 设置为 6,然后运行循环,随后对条件进行检查:
<?php
$x=6;
do {
echo "这个数字是:$x <br>";
$x++;
} while ($x<=5);
?>
PHP for 循环执行代码块指定的次数。
如果您已经提前确定脚本运行的次数,可以使用 for 循环。
for (init counter; test counter; increment counter) {
code to be executed;
}
参数:
- init counter:初始化循环计数器的值
- test counter:: 评估每个循环迭代。如果值为 TRUE,继续循环。如果它的值为 FALSE,循环结束。
- increment counter:增加循环计数器的值
下面的例子显示了从 0 到 10 的数字:
<?php
for ($x=0; $x<=10; $x++) {
echo "数字是:$x <br>";
}
?>
foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。
foreach ($array as $value) {
code to be executed;
}
每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
下面的例子演示的循环将输出给定数组($colors)的值:
<?php
$colors = array("red","green","blue","yellow");
foreach ($colors as $value) {
echo "$value <br>";
}
?>
PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。
除了内建的 PHP 函数,我们可以创建我们自己的函数。
函数是可以在程序中重复使用的语句块。
页面加载时函数不会立即执行。
函数只有在被调用时才会执行。
用户定义的函数声明以单词 "function" 开头:
function functionName() {
被执行的代码;
}
**注释:**函数名能够以字母或下划线开头(而非数字)。
**注释:**函数名对大小写不敏感。
**提示:**函数名应该能够反映函数所执行的任务。
可以通过参数向函数传递信息。参数类似变量。
参数被定义在函数名之后,括号内部。您可以添加任意多参数,只要用逗号隔开即可。
下面的例子中的函数有一个参数($fname)。当调用 familyName() 函数时,我们同时要传递一个名字(例如 Bill),这样会输出不同的名字,但是姓氏相同:
<?php
function familyName($fname) {
echo "$fname Zhang.<br>";
}
familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>
下面的例子展示了如何使用默认参数。如果我们调用没有参数的 setHeight() 函数,它的参数会取默认值:
<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
}
setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>
如需使函数返回值,请使用 return 语句:
<?php
function sum($x,$y) {
$z=$x+$y;
return $z;
}
echo "5 + 10 = " . sum(5,10) . "<br>"; // .用来连接字符串
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>
数组能够在单独的变量名中存储一个或多个值。
数组在单个变量中存储多个值:
<?php
$cars=array("porsche","BMW","Volvo");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
数组是特殊的变量,它可以同时保存一个以上的值。
如果您有一个项目列表(例如汽车品牌列表),在单个变量中存储这些品牌名称是这样的:
$cars1="porsche";
$cars2="BMW";
$cars3="Volvo";
不过,假如您希望对变量进行遍历并找出特定的那个值?或者如果您需要存储 300 个汽车品牌,而不是 3 个呢?
解决方法是创建数组!
数组能够在单一变量名中存储许多值,并且您能够通过引用索引号来访问某个值。
在 PHP 中, array() 函数用于创建数组:
array();
在 PHP 中,有三种数组类型:
- 索引数组 - 带有数字索引的数组
- 关联数组 - 带有指定键的数组
- 多维数组 - 包含一个或多个数组的数组
有两种创建索引数组的方法:
索引是自动分配的(索引从 0 开始):
$cars=array("porsche","BMW","Volvo");
或者也可以手动分配索引:
$cars[0]="porsche";
$cars[1]="BMW";
$cars[2]="Volvo";
下面的例子创建名为 $cars 的索引数组,为其分配三个元素,然后输出包含数组值的一段文本:
<?php
$cars=array("porsche","BMW","Volvo");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
count() 函数用于返回数组的长度(元素数):
<?php
$cars=array("porsche","BMW","Volvo");
echo count($cars);
?>
如需遍历并输出索引数组的所有值,您可以使用 for 循环,就像这样:
<?php
$cars=array("porsche","BMW","Volvo");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++) {
echo $cars[$x];
echo "<br>";
}
?>
关联数组是使用您分配给数组的指定键的数组。
有两种创建关联数组的方法:
$age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43");
或者:
$age['Bill']="63";
$age['Steve']="56";
$age['Elon']="47";
随后可以在脚本中使用指定键:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
echo "Elon is " . $age['Elon'] . " years old.";
?>
如需遍历并输出关联数组的所有值,您可以使用 foreach 循环,就像这样:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
数组中的元素能够以字母或数字顺序进行升序或降序排序。
在本节中,我们将学习如下 PHP 数组排序函数:
- sort() - 以升序对数组排序
- rsort() - 以降序对数组排序
- asort() - 根据值,以升序对关联数组进行排序
- ksort() - 根据键,以升序对关联数组进行排序
- arsort() - 根据值,以降序对关联数组进行排序
- krsort() - 根据键,以降序对关联数组进行排序
下面的例子按照字母升序对数组 $cars 中的元素进行排序:
<?php
$cars=array("porsche","BMW","Volvo");
sort($cars);
?>
下面的例子按照数字升序对数组 $numbers 中的元素进行排序:
<?php
$numbers=array(3,5,1,22,11);
sort($numbers);
?>
下面的例子按照字母降序对数组 $cars 中的元素进行排序:
<?php
$cars=array("porsche","BMW","Volvo");
rsort($cars);
?>
下面的例子按照数字降序对数组 $numbers 中的元素进行排序:
<?php
$numbers=array(3,5,1,22,11);
rsort($numbers);
?>
下面的例子根据值对关联数组进行升序排序:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
asort($age);
?>
下面的例子根据键对关联数组进行升序排序:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
ksort($age);
?>
下面的例子根据值对关联数组进行降序排序:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
arsort($age);
?>
下面的例子根据键对关联数组进行降序排序:
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
krsort($age);
?>
超全局变量在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
这些超全局变量是:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
本节会介绍一些超全局变量,并会在稍后的章节讲解其他的超全局变量。
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
下面的例子展示了如何使用超级全局变量 $GLOBALS: 由于 z 是 $GLOBALS 数组中的变量,因此在函数之外也可以访问它。
<?php
$x = 75;
$y = 25;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。
下面的例子展示了如何使用 $_SERVER 中的某些元素:
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
下表列出了您能够在 $_SERVER 中访问的最重要的元素:
元素/代码 | 描述 |
---|---|
$_SERVER['PHP_SELF'] | 返回当前执行脚本的文件名。 |
$_SERVER['GATEWAY_INTERFACE'] | 返回服务器使用的 CGI 规范的版本。 |
$_SERVER['SERVER_ADDR'] | 返回当前运行脚本所在的服务器的 IP 地址。 |
$_SERVER['SERVER_NAME'] | 返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。 |
$_SERVER['SERVER_SOFTWARE'] | 返回服务器标识字符串(比如 Apache/2.2.24)。 |
$_SERVER['SERVER_PROTOCOL'] | 返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。 |
$_SERVER['REQUEST_METHOD'] | 返回访问页面使用的请求方法(例如 POST)。 |
$_SERVER['REQUEST_TIME'] | 返回请求开始时的时间戳(例如 1577687494)。 |
$_SERVER['QUERY_STRING'] | 返回查询字符串,如果是通过查询字符串访问此页面。 |
$_SERVER['HTTP_ACCEPT'] | 返回来自当前请求的请求头。 |
$_SERVER['HTTP_ACCEPT_CHARSET'] | 返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1) |
$_SERVER['HTTP_HOST'] | 返回来自当前请求的 Host 头。 |
$_SERVER['HTTP_REFERER'] | 返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。 |
$_SERVER['HTTPS'] | 是否通过安全 HTTP 协议查询脚本。 |
$_SERVER['REMOTE_ADDR'] | 返回浏览当前页面的用户的 IP 地址。 |
$_SERVER['REMOTE_HOST'] | 返回浏览当前页面的用户的主机名。 |
$_SERVER['REMOTE_PORT'] | 返回用户机器上连接到 Web 服务器所使用的端口号。 |
$_SERVER['SCRIPT_FILENAME'] | 返回当前执行脚本的绝对路径。 |
$_SERVER['SERVER_ADMIN'] | 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。 |
$_SERVER['SERVER_PORT'] | Web 服务器使用的端口。默认值为 “80”。 |
$_SERVER['SERVER_SIGNATURE'] | 返回服务器版本和虚拟主机名。 |
$_SERVER['PATH_TRANSLATED'] | 当前脚本所在文件系统(非文档根目录)的基本路径。 |
$_SERVER['SCRIPT_NAME'] | 返回当前脚本的路径。 |
$_SERVER['SCRIPT_URI'] | 返回当前页面的 URI。 |
PHP $_REQUEST 用于收集 HTML 表单提交的数据。
下面的例子展示了一个包含输入字段及提交按钮的表单。当用户通过点击提交按钮来提交表单数据时, 表单数据将发送到
标签的 action 属性中指定的脚本文件。在这个例子中,我们指定文件本身来处理表单数据。如果您需要使用其他的 PHP 文件来处理表单数据,请修改为您选择的文件名即可。然后,我们可以使用超级全局变量 $_REQUEST 来收集 input 字段的值:<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
PHP $_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。
下面的例子展示了一个包含输入字段和提交按钮的表单。当用户点击提交按钮来提交数据后,表单数据会发送到 标签的 action 属性中指定的文件。在本例中,我们指定文件本身来处理表单数据。如果您希望使用另一个 PHP 页面来处理表单数据,请用更改为您选择的文件名。然后,我们可以使用超全局变量 $_POST 来收集输入字段的值:
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
实际被解析为html文件传送到前端解析时显示的是: action是自身文件
如果改为: 直接action='''' 也一样,实际被解析为html文件传送到前端解析时显示的是: action为空,但是仍然是自身文件处理
PHP $_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。
$_GET 也可以收集 URL 中的发送的数据。
假设我们有一张页面含有带参数的超链接:
<html>
<body>
<a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a>
</body>
</html>
当用户点击链接 "测试 $GET",参数 "subject" 和 "web" 被发送到 "test_get.php",然后您就能够通过 $_GET 在 "test_get.php" 中访问这些值了。
下面的例子是 "test_get.php" 中的代码:
<html>
<body>
<?php
echo "在 " . $_GET['web'] . " 学习 " . $_GET['subject'];
?>
</body>
</html>
**提示:**您将在 PHP 表单 这一节中学到更多有关 $_POST 和 $_GET 的知识。
PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据(form-data)。
下面的例子显示了一个简单的 HTML 表单,它包含两个输入字段和一个提交按钮:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
当用户填写此表单并点击提交按钮后,表单数据会发送到名为 "welcome.php" 的 PHP 文件供处理。表单数据是通过 HTTP POST 方法发送的。
如需显示出被提交的数据,您可以简单地输出(echo)所有变量。"welcome.php" 文件是这样的:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>
</body>
</html>
输出:
Welcome Bill
Your email address is Bill.Gates@example.com
使用 HTTP GET 方法也能得到相同的结果:
<html>
<body>
<form action="welcome_get.php" method="get">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>
welcome_get.php" 是这样的:
<html>
<body>
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>
上面的代码很简单。不过,最重要的内容被漏掉了。您需要对表单数据进行验证,以防止脚本出现漏洞。
**注意:**在处理 PHP 表单时请关注安全!
本页未包含任何表单验证程序,它只向我们展示如何发送并接收表单数据。
不过稍后的章节会为您讲解如何提高 PHP 表单的安全性!对表单进行适当的安全验证对于抵御黑客攻击和垃圾邮件非常重要!
GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
GET 和 POST 被视作 $_GET 和 $_POST。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。
$_GET 是通过 URL 参数传递到当前脚本的变量数组。
$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
通过 GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大约 2000 个字符。不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便。
GET 可用于发送非敏感的数据。
**注释:**绝不能使用 GET 来发送密码或其他敏感信息!
通过 POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制。
此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。
不过,由于变量未显示在 URL 中,也就无法将页面添加到书签。
**提示:**开发者偏爱 POST 来发送表单数据。
接下来让我们看看如何安全地处理 PHP 表单!
使用 PHP 来验证表单数据
**提示:**在处理 PHP 表单时请重视安全性!
这些页面将展示如何安全地处理 PHP 表单。对 HTML 表单数据进行适当的验证对于防范黑客和垃圾邮件很重要!
我们稍后使用的 HTML 表单包含多种输入字段:必需和可选的文本字段、单选按钮以及提交按钮:
上面的表单使用如下验证规则:
字段 | 验证规则 |
---|---|
Name | 必需。必须包含字母和空格。 |
必需。必须包含有效的电子邮件地址(包含 @ 和 .)。 | |
Website | 可选。如果选填,则必须包含有效的 URL。 |
Comment | 可选。多行输入字段(文本框)。 |
Gender | 必需。必须选择一项。 |
首先我们看一下这个表单的纯 HTML 代码:
<iframe src="https://www.w3school.com.cn/demo/demo_form_validation_complete.php" width="700" height="700" seamless="" fr-async-frames="Autoload" style="margin: 15px 0px 0px; padding: 0px; border: 1px solid rgb(221, 221, 221); font-family: "Microsoft YaHei", system-ui, -apple-system, BlinkMacSystemFont, sans-serif, iconfont, icomoon, FontAwesome, "Font Awesome 5 Pro", "Font Awesome 6 Pro", IcoFont, fontello, themify, "Material Icons", "Material Icons Extended", bootstrap-icons, "Segoe Fluent Icons", Material-Design-Iconic-Font, office365icons, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "Android Emoji", EmojiSymbols, "emojione mozilla", "twemoji mozilla"; text-shadow: rgba(164, 160, 154, 0.85) 0px 0px 0.23px, rgba(123, 123, 123, 0.8) 0px 0px 0.2px, rgba(48, 47, 45, 0.27) 0px 0px 0.15px; -webkit-text-stroke: 0.045px currentcolor; font-feature-settings: "liga" 0; font-variant: no-common-ligatures proportional-nums; font-optical-sizing: auto; font-kerning: auto; -webkit-font-smoothing: antialiased !important; text-rendering: optimizelegibility !important;"></iframe>name、email 和 website 属于文本输入元素,comment 字段是文本框。HTML 代码是这样的:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
gender 字段是单选按钮,HTML 代码是这样的:
Gender:
<input type="radio" name="gender" value="female">Female #radio单选
<input type="radio" name="gender" value="male">Male
表单的 HTML 代码是这样的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
当提交此表单时,通过 method="post" 发送表单数据。
$_SERVER["PHP_SELF"] 是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
$_SERVER["PHP_SELF"] 变量能够被黑客利用!
如果您的页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。
**提示:**跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。
假设我们的一张名为 "test_form.php" 的页面中有如下表单:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,如果用户进入的是地址栏中正常的 URL:"http://www.example.com/test_form.php",上面的代码会转换为:
<form method="post" action="test_form.php">
到目前,一切正常。
不过,如果用户在地址栏中键入了如下 URL:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
在这种情况下,上面的代码会转换为:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
这段代码加入了一段脚本和一个提示命令。并且当此页面加载后,就会执行 JavaScript 代码(用户会看到一个提示框)。这仅仅是一个关于 PHP_SELF 变量如何被利用的简单无害案例。
您应该意识到 <script> 标签内能够添加任何 JavaScript 代码!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。
通过使用 htmlspecialchars() 函数能够避免 $_SERVER["PHP_SELF"] 被利用。
表单代码是这样的:
<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 的 htmlspecialchars() 函数传递所有变量。
在我们使用 htmlspecialchars() 函数后,如果用户试图在文本字段中提交以下内容:
<script>location.href('http://www.hacked.com')</script>
- 代码不会执行,因为会被保存为转义代码,就像这样:
<script>location.href('http://www.hacked.com')</script>
现在这条代码显示在页面上或 e-mail 中是安全的。
在用户提交该表单时,我们还要做两件事:
- (通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
- (通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)反转义字符
接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。
我们把函数命名为 test_input()。
现在,我们能够通过 test_input() 函数检查每个 $_POST 变量,脚本是这样的:
<?php
// 定义变量并设置为空值
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
请注意在脚本开头,我们检查了表单是否使用 $_SERVER["REQUEST_METHOD"] 进行提交。如果 REQUEST_METHOD 是 POST,那么表单已被提交 - 并且应该对其进行验证。如果未提交,则跳过验证并显示一个空白表单。
不过,在上面的例子中,所有输入字段都是可选的。即使用户未输入任何数据,脚本也能正常工作。
下一步是制作必填输入字段,并创建需要时使用的错误消息。
本节展示如何制作必填输入字段,并创建需要时所用的错误消息。
从上一节中的验证规则中,我们看到 "Name", "E-mail" 以及 "Gender" 字段是必需的。这些字段不能为空且必须在 HTML 表单中填写。
字段 | 验证规则 |
---|---|
Name | 必需。必须包含字母和空格。 |
必需。必须包含有效的电子邮件地址(包含 @ 和 .)。 | |
Website | 可选。如果选填,则必须包含有效的 URL。 |
Comment | 可选。多行输入字段(文本框)。 |
Gender | 必需。必须选择一项。 |
在上一节中,所有输入字段都是可选的。
在下面的代码中我们增加了一些新变量:$nameErr、$emailErr、$genderErr 以及 $websiteErr。这些错误变量会保存被请求字段的错误消息。我们还为每个 $_POST 变量添加了一个 if else 语句。这条语句检查 $_POST 变量是否为空(通过 PHP empty() 函数)。如果为空,则错误消息会存储于不同的错误变量中。如果不为空,则通过 test_input() 函数发送用户输入数据:
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
}
}
?>
在 HTML 表单中,我们在每个被请求字段后面增加了一点脚本。如果需要,会生成恰当的错误消息(如果用户未填写必填字段就试图提交表单):
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail:
<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
Website:
<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
<label>Comment: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
接下来是验证输入数据,即“Name 字段是否只包含字母和空格?”,以及“E-mail 字段是否包含有效的电子邮件地址语法?”,并且如果填写了 Website 字段,“这个字段是否包含了有效的 URL?”。