欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

实例讲解PHP表单

程序员文章站 2022-03-21 11:41:19
表单处理get vs. post1 get 和 post 都创建数组(例如,array( key => value, key2 => value2, key3 => value3,...

表单处理

get vs. post

1  get 和 post 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。

2  get 和 post 被视作 $_get 和 $_post。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。

3  传递方式

$_get 是通过 url 参数传递到当前脚本的变量数组。
$_post 是通过 http post 传递到当前脚本的变量数组。

(1)何时使用 get?

通过 get 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 url 中)。get 对所发送信息的数量也有限制。限制在大约 2000 个字符。

get 可用于发送非敏感的数据。

注释:绝不能使用 get 来发送密码或其他敏感信息!

(2)何时使用 post?

通过 post 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 http 请求的主体中),并且对所发送信息的数量无限制。

此外 post 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。

提示:开发者偏爱 post 来发送表单数据。

表单验证

htmlspecialchars() 函数

如果要将表单提交给页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。

表单的 html 代码是这样的:

<form method="post" action="<?php echo htmlspecialchars($_server["php_self"]);?>">

(1)什么是 $_server["php_self"] 变量?

$_server["php_self"] 是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_server["php_self"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。

(2)什么是 htmlspecialchars() 函数?

htmlspecialchars() 函数把特殊字符转换为 html 实体。这意味着 < 和 > 之类的 html 字符会被替换为 &lt; 和 &gt; ,页面效果仍是< >。这样可防止攻击者通过在表单中注入 html 或 javascript 代码(跨站点脚本攻击)对代码进行利用。
如果没有 htmlspecialchars() 函数

hacker输入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>

典型反射xss

表单检查函数:

<?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;
}
?>

必填字段 验证 e-mail 和 url

1.验证名字

以下代码展示的简单方法检查 name 字段是否包含字母和空格。如果 name 字段无效,则存储一条错误消息:

$name = test_input($_post["name"]);
if (!preg_match("/^[a-za-z ]*$/",$name)) {
 $nameerr = "只允许字母和空格!"; 
}

2.验证 e-mail

以下代码展示的简单方法检查 e-mail 地址语法是否有效。如果无效则存储一条错误消息:

$email = test_input($_post["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
 $emailerr = "无效的 email 格式!"; 
}

3.验证 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"; 
}

完成表单实例

<!doctype html> 
<html>
<head>
<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 = "无效的 email 格式"; 
 }
 }
 
 if (empty($_post["website"])) {
 $website = "";
 } else {
 $website = test_input($_post["website"]);
 // 检查 url 地址语法是否有效(正则表达式也允许 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">
 <span class="error">* <?php echo $nameerr;?></span>
 <br><br>
 电邮:<input type="text" name="email">
 <span class="error">* <?php echo $emailerr;?></span>
 <br><br>
 网址:<input type="text" name="website">
 <span class="error"><?php echo $websiteerr;?></span>
 <br><br>
 评论:<textarea name="comment" rows="5" cols="40">

以上就是php表单相关知识总结的详细内容,更多关于php表单的资料请关注其它相关文章!

相关标签: php 表单 实例