php基本语法
PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php 开始,以 ?> 结束:
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
1.变量
1.PHP 变量规则:
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP 没有声明变量的命令。
变量在您第一次赋值给它的时候被创建:
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>
2.PHP 有四种不同的变量作用域:
- local
- global
- static
- parameter
<?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";
?>
global 关键字
global 关键字用于函数内访问全局变量。
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
上面的实例可以写成这样:
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
Static
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,请在您第一次声明变量时使用 static 关键字:
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
echo PHP_EOL; // 换行符
}
myTest();
myTest();
myTest();
?>
然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。
PHP超级循环变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
$_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。
<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>
HTML部分
-
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
:<form>
标签定义了一个表单,用于收集用户输入。method="post"
属性指定表单数据通过HTTP POST方法提交。这意味着用户输入的数据会在请求体中发送,而不是URL中。action="<?php echo $_SERVER['PHP_SELF'];?>"
属性指定表单提交时的目标URL。这里使用了PHP代码$_SERVER['PHP_SELF']
,它会输出当前脚本的文件名。这意味着表单数据将提交给同一个页面进行处理。
-
Name: <input type="text" name="fname">
:Name:
是一个简单的文本标签,用于在表单中显示提示文字。<input type="text" name="fname">
定义了一个文本输入框,允许用户输入文本。type="text"
指定输入框的类型为文本,name="fname"
为输入框指定了一个名称,这样提交表单时可以通过这个名称获取用户输入的值。
-
<input type="submit">
:定义了一个提交按钮,用户点击这个按钮会提交表单。
PHP部分
-
$name = $_REQUEST['fname'];
:- 这行PHP代码尝试从
$_REQUEST
数组中获取名为fname
的值。$_REQUEST
是一个超全局变量,包含了表单数据(无论是通过GET还是POST方法提交的)。 - 这里假设用户已经填写了表单并点击了提交按钮,这样
$_REQUEST['fname']
中就包含了用户输入的姓名。
- 这行PHP代码尝试从
总结
整个代码的工作原理是:用户在表单中输入姓名,点击提交按钮后,表单数据通过POST方法提交给服务器。服务器上的PHP脚本获取提交的姓名,并将其输出在页面上。由于使用了$_SERVER['PHP_SELF']
,无论用户如何访问页面(无论是直接输入URL还是通过链接),表单都会提交给当前页面。
$_GET
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。
<html>
<body>
<a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>
</body>
</html>
test_get.php:
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
?>
</body>
</html>
这段代码是一个HTML锚点(anchor)标签的示例,它创建了一个超链接,用户点击这个链接时,浏览器会发起一个GET请求到指定的URL,并附带查询字符串。
让我们详细解释每个部分:
-
<a>
标签:这是HTML中的锚点标签,用于定义超链接,它们可以链接到另一个页面、文件、电子邮件地址、位置或任何URL。 -
href
属性:href
是anchor(锚点)的一个必需属性,它指定了链接目标的URL。用户的浏览器会将这个URL用于发起请求。 -
test_get.php?subject=PHP&web=runoob.com
:这是链接的目标URL,它指向服务器上的一个名为test_get.php
的文件。URL后面的?
符号开始了查询字符串,其中包含了一系列的参数和值,用&
符号分隔。在这个例子中,有两个参数:subject
和web
。subject
参数的值是PHP
,而web
参数的值是runoob.com
。 -
Test $GET
:这是链接的可点击文本,当用户看到这个链接时,他们会看到 "Test $GET" 文本。点击这个文本会导致浏览器发起一个GET请求到test_get.php
脚本,并附带查询字符串。
当用户点击这个链接时,服务器上的 test_get.php
脚本可以通过PHP的超全局数组 $_GET
来接收查询字符串中的参数
$_SESSION
在 PHP 中,$_SESSION
是一个超全局变量,用于存储用户会话的相关信息。会话(session)是一种在服务器端存储用户数据的方式,它可以在多个页面请求之间持久保存信息。
以下是 $_SESSION
的一些常见用途:
- 用户身份验证:存储用户登录信息,如用户名或用户ID。
- 用户偏好设置:保存用户的个性化设置,如主题选择、语言偏好等。
- 购物车内容:在电子商务网站中,存储用户添加到购物车的商品信息。
- 表单数据:在用户提交表单前,存储表单数据,以防页面刷新导致数据丢失。
- 错误消息:存储错误消息或成功消息,以便在下一个页面请求中显示。
要使用 $_SESSION
,通常需要先启动会话:
session_start();
这行代码必须位于任何输出之前,因为会话启动时可能会发送一些原始的HTML头部信息。
以下是一些使用 $_SESSION
的示例:
// 存储数据到会话
$_SESSION['username'] = 'JohnDoe';
// 从会话中检索数据
echo $_SESSION['username'];
// 检查会话变量是否存在
if (isset($_SESSION['username'])) {
echo '用户已登录:' . $_SESSION['username'];
}
// 销毁会话变量
unset($_SESSION['username']);
// 销毁所有会话数据,并结束会话
$_SESSION = array();
session_destroy();
使用 $_SESSION
时需要注意的几点:
- 会话数据存储在服务器端,可以通过配置文件设置会话数据的存储位置和方式(如文件、数据库等)。
- 会话ID通常存储在客户端的cookie中,用于标识用户的会话。
- 出于安全考虑,应避免在
$_SESSION
中存储敏感信息,或者确保通过加密等手段保护这些信息。 - 会话超时:可以通过配置文件或代码设置会话的超时时间。
- 会话安全:使用
session_regenerate_id()
函数可以重新生成会话ID,以提高会话安全性。
PHP EOF(heredoc) 使用说明
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用概述:
- 1. 必须后接分号,否则编译通不过。
- 2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
- 3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
- 5. 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
<?php
echo <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>
在 heredoc 中,变量不需要用连接符 . 或 , 来拼接
PHP 资源类型
PHP 资源 resource 是一种特殊变量,保存了到外部资源的一个引用。
常见资源数据类型有打开文件、数据库连接、图形画布区域等。
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
使用 get_resource_type() 函数可以返回资源(resource)类型:
get_resource_type(resource $handle): string
此函数返回一个字符串,用于表示传递给它的 resource 的类型。如果参数不是合法的 resource,将产生错误。
如下实例:
<?php
$c = mysql_connect();
echo get_resource_type($c)."\n";
// 打印:mysql link
$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file
$doc = new_xmldoc("1.0");
echo get_resource_type($doc->doc)."\n";
// 打印:domxml document
?>
php类型比较
常量
设置常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
-
name:必选参数,常量名称,即标志符。
-
value:必选参数,常量的值。
-
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。
常量在定义后,默认是全局变量,可以在整个运行的脚本的任何地方使用。
字符串
并置运算符
并置运算符 (.) 用于把两个字符串值连接起来。
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
strlen() 函数
strlen() 函数返回字符串的长度(字节数)。
<?php
echo strlen("Hello world!");
?>
strpos()
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
<?php
echo strpos("Hello world!","world");
?>
数组
遍历关联数组
关联数组(也称为哈希表或字典)是一种存储键值对的数组,其中每个键都是唯一的。
遍历并打印关联数组中的所有值,您可以使用 foreach 循环,如下所示
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
foreach
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
foreach ($array as $value)
{
要执行代码;
}
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value . PHP_EOL;
}
?>
它的关联数组基本语法如下:
foreach ($array as $key => $value) { // 代码块 }
在 foreach
循环中:
$array
是要遍历的数组。$key
是数组中当前遍历到的元素的键(对于关联数组来说是键,对于索引数组来说是索引)。$value
是与$key
相关联的元素的值。
foreach
循环会自动按照数组中的顺序,一个接一个地取出数组中的元素,并将当前元素的键和值分别赋给 $key
和 $value
,然后执行循环体内的代码块。
PHP - 数组排序函数
在本章中,我们将一一介绍下列 PHP 数组排序函数:
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
函数
语法:
<?php
function functionName()
{
// 要执行的代码
}
?>
使用变量作为函数名来调用函数
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // 调用 foo()
$func = 'bar';
$func('test'); // 调用 bar()
$func = 'echoit';
$func('test'); // 调用 echoit()
?>
代码创建了一个名为 $func
的变量,并将其赋值为字符串 'foo'
。然后,使用 $func()
来调用与变量 $func
名称相匹配的函数。在这种情况下,它将调用 foo()
函数。
__TRAIT__
在 PHP 中,trait
是一种代码复用机制,允许开发者定义一组可以被多个类使用的方法。Trait 提供了一种灵活的方式,使得一个类可以借用其他类的代码,而无需成为它们的子类。Trait 主要用于解决类之间的多重继承问题,因为在 PHP 中不支持类的多重继承。
表单
`action` 属性
在HTML中,`<form>` 元素的 `action` 属性指定了提交表单数据时的目标URL。当用户填写完表单并点击提交按钮时,浏览器会将表单中的数据发送到这个URL。这个属性的值可以是绝对URL,也可以是相对URL。
以下是一些关于 `action` 属性的要点:
1. **必须性**:在HTML5中,`action` 属性不是必需的,如果省略了这个属性,提交表单的操作将会由浏览器的默认行为决定,通常是提交到当前页面。
2. **数据传输方式**:`action` 属性通常与 `method` 属性一起使用,`method` 属性定义了数据提交的方式(如 `GET` 或 `POST`)。
3. **安全性**:提交到的URL应该与表单所在的页面具有相同的安全级别。如果表单页面是HTTPS加密的,那么提交的URL也应该是HTTPS,以避免中间人攻击。
4. **服务器端处理**:`action` 属性指定的URL应该指向一个服务器端的脚本或程序,该脚本或程序能够处理接收到的表单数据。
5. **默认行为**:如果表单的 `action` 属性为空或未指定,那么表单的提交URL默认为包含该表单的页面URL。
6. **JavaScript控制**:可以通过JavaScript动态修改 `action` 属性的值,以在不同的条件下将表单数据提交到不同的URL。
下面是一个简单的表单示例,演示了如何使用 `action` 属性:
<form action="submit_page.php" method="post">
<label for="name">Name:</label><br>
<input type="text" id="name" name="username">
<br>
<input type="submit" value="Submit">
</form>
在这个例子中,当用户填写了名字并点击提交按钮,表单数据将通过POST方法发送到 `submit_page.php`。
PHP 获取下拉菜单的数据
get和post
HTML表单的`method`属性指定了数据提交给服务器时所使用的HTTP方法。`method`属性可以有两个值:`get`和`post`。选择使用哪一个取决于你的具体需求和安全考虑:
### 使用GET方法的情况:
1. **数据检索**:当你需要从服务器检索数据而不是提交数据进行处理时,应该使用GET方法。例如,搜索表单或过滤表单。
2. **书签和分享**:GET请求可以作为URL的一部分,这意味着用户可以书签页面或通过URL共享他们的搜索结果。
3. **无副作用**:GET请求不应该产生副作用,即它们不会改变服务器上的状态或数据。
4. **数据量限制**:GET请求通常受到URL长度限制,因此不适合提交大量数据。
5. **可见性**:由于GET请求的数据会显示在URL中,因此不应该用于敏感信息的传输。
### 使用POST方法的情况:
1. **数据提交**:当你需要向服务器提交数据进行处理时,如表单数据、文件上传等,应该使用POST方法。
2. **安全性**:POST请求的数据不会出现在URL中,因此比GET方法更适合传输敏感信息。
3. **数据量**:POST请求没有数据量限制,适合传输大量数据,如文件上传。
4. **副作用**:POST请求可以产生副作用,比如创建用户账户、更新数据库记录或处理交易。
5. **无缓存**:GET请求可以被浏览器缓存,而POST请求则不会被缓存,这使得POST方法更适合那些需要服务器实时处理的任务。
6. **无身份验证**:GET请求可能会被缓存或保存在服务器的日志文件中,这意味着敏感信息不应通过GET请求传输。
总结:
- 使用GET方法,当操作是安全的、无状态的,并且仅用于检索数据。
- 使用POST方法,当操作不是幂等的、可能改变服务器状态,或者需要传输敏感或大量数据。
在实际应用中,选择GET还是POST也取决于你的应用程序设计和后端服务器的实现。始终考虑数据的安全性和隐私性,确保使用最合适的方法来保护用户数据。
1.下拉单选
<?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代码使用了三元运算符来设置 `$q` 变量的值。三元运算符是一种简洁的方式来选择两个值中的一个。这个运算符的一般形式是 `exp1 ? exp2 : exp3`,如果 `exp1` 为真,则表达式的结果为 `exp2`,否则结果为 `exp3`。
代码分解如下:
1. `isset($_GET['q'])`: 这个函数检查 `$_GET` 数组中是否存在一个键名为 `'q'` 的元素。`$_GET` 是一个超全局变量,用于收集表单数据或URL参数。
2. 如果 `$_GET['q']` 存在,`isset()` 将返回 `true`,然后执行 `htmlspecialchars($_GET['q'])`。`htmlspecialchars` 函数将转换 `$_GET['q']` 中的特殊字符(如 `<`, `>`, `&` 等)为HTML实体,以防止跨站脚本攻击(XSS)。
3. 如果 `$_GET['q']` 不存在,`isset()` 将返回 `false`,然后执行 `''`,即空字符串。这意味着如果用户没有通过GET参数提交 `q`,`$q` 将被设置为空字符串。
这段PHP代码是一个简单的Web表单,它允许用户选择并提交一个查询参数 q
,然后根据这个参数显示不同的网站链接。下面是代码的逐行解释:
-
header('Content-type: text/html; charset=utf-8');
设置了HTTP头,指定了页面的内容类型为HTML,字符集为UTF-8。 -
$q
变量通过检查$_GET['q']
是否存在来初始化。如果存在,它将使用htmlspecialchars
函数来避免跨站脚本攻击(XSS),确保变量$q
是安全的。如果$_GET['q']
不存在,则$q
将被设置为空字符串。 -
如果
$q
存在且非空,代码将进入一个条件判断结构,检查$q
的值,并根据其值输出不同的网站链接。例如,如果$q
的值是'RUNOOB'
,它将输出 "菜鸟教程" 以及对应的链接。 -
如果
$q
不存在或为空,代码将输出一个HTML表单,允许用户从下拉列表中选择一个站点,然后提交表单。 -
表单的
action
属性为空字符串,这意味着表单提交将刷新当前页面。 -
method="get"
指定了表单提交使用GET方法。 -
<select name="q">
创建了一个下拉选择菜单,name="q"
表示选中的值将作为q
参数发送。 -
表单中包含了三个
<option>
元素,分别对应 "Runoob"、"Google" 和 "Taobao"。 -
value=""
: 这是<option>
标签的value
属性,它指定了当该选项被选中时,将发送到服务器的值。在这个例子中,value
属性是空的,意味着如果这个选项被提交,将不会发送任何值。 -
最后,表单包含了一个提交按钮。
整个脚本的逻辑是:如果用户通过GET请求提交了一个 q
参数,脚本将输出对应的网站链接;如果用户没有提交 q
参数,脚本将提供一个表单供用户选择一个选项并提交。
isset()
在 PHP 中,isset()
函数用于检查变量是否已设置并且非 NULL
。一个变量可以被设置为 NULL
,也可以未被设置(未初始化)。isset()
函数对数组元素的检查也适用,如果数组元素未被设置,或者其值为 NULL
,isset()
会返回 false
。
2.下拉多选
创建一个多选下拉菜单(通常称为多选框或复选框组),需要使用一系列的HTML `<input>` 元素,每个元素的类型为 `checkbox`。PHP可以用于处理表单提交的数据,但创建表单本身是HTML的工作。以下是创建一个简单的多选下拉菜单并用PHP处理表单提交的示例:
<?php
// 检查是否已经接收到了表单数据
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 检查是否有选择被选中
if (isset($_POST['options'])) {
// 输出选中的选项
echo "您选择了:";
$options = $_POST['options']; // 获取所有选中的选项
foreach ($options as $option) {
echo "$option ";
}
} else {
echo "您没有选择任何选项。";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多选下拉菜单示例</title>
</head>
<body>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<p>请选择您感兴趣的主题:</p>
<input type="checkbox" name="options[]" value="RUNOOB" id="RUNOOB">
<label for="RUNOOB">Runoob</label><br>
<input type="checkbox" name="options[]" value="GOOGLE" id="GOOGLE">
<label for="GOOGLE">Google</label><br>
<input type="checkbox" name="options[]" value="TAOBAO" id="TAOBAO">
<label for="TAOBAO">Taobao</label><br>
<input type="submit" value="提交">
</form>
</body>
</html>
这段代码做了以下几件事:
-
首先,PHP代码块检查是否通过POST方法接收到了表单数据。
-
如果接收到了数据,并且
$_POST['options']
被设置(意味着至少有一个复选框被选中),则遍历所有选中的选项,并将它们输出到页面上。 -
如果没有选项被选中,输出提示用户没有选择任何选项。
-
HTML部分创建了一个表单,其中包含三个复选框供用户选择。每个复选框的
name
属性都设置为options[]
,这允许用户选择多个选项。 -
当用户点击提交按钮时,表单会通过POST方法将选中的选项数据发送到同一个页面(由
$_SERVER["PHP_SELF"]
确定)。 -
PHP代码块在页面顶部,这样当表单提交时,它会在显示表单之前执行。
3.单选按钮
<?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">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form><?php
}
?>
表单验证
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// 定义变量并默认设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (empty($_POST["name"]))
{
$nameErr = "名字是必需的";
}
else
{
$name = test_input($_POST["name"]);
// 检测名字是否只包含字母跟空格
if (!preg_match("/^[a-zA-Z ]*$/",$name))
{
$nameErr = "只允许字母和空格";
}
}
if (empty($_POST["email"]))
{
$emailErr = "邮箱是必需的";
}
else
{
$email = test_input($_POST["email"]);
// 检测邮箱是否合法
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr = "非法邮箱格式";
}
}
if (empty($_POST["website"]))
{
$website = "";
}
else
{
$website = test_input($_POST["website"]);
// 检测 URL 地址是否合法
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr = "非法的 URL 的地址";
}
}
if (empty($_POST["comment"]))
{
$comment = "";
}
else
{
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"]))
{
$genderErr = "性别是必需的";
}
else
{
$gender = test_input($_POST["gender"]);
}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
名字: <input type="text" name="name" value="<?php echo $name;?>">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email" value="<?php echo $email;?>">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址: <input type="text" name="website" value="<?php echo $website;?>">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
<br><br>
性别:
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>您输入的内容是:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
php中使用了正则表达式