实例讲解PHP表单


Posted in PHP onJune 10, 2020

表单处理

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 字符会被替换为 < 和 > ,页面效果仍是< >。这样可防止攻击者通过在表单中注入 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 相关文章推荐
php5.2时间相差8小时
Jan 15 PHP
php Memcache 中实现消息队列
Nov 24 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
php常用数学函数汇总
Nov 21 PHP
php对文件进行hash运算的方法
Apr 03 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 PHP
如何在PHP中使用数组
Jun 09 #PHP
详解PHP中curl_multi并发的实现
Jun 08 #PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 #PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 #PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 #PHP
CI框架简单分页类用法示例
Jun 06 #PHP
简单的php购物车代码
Jun 05 #PHP
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP的引用详解
2015/02/22 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
python中的计时器timeit的使用方法
2017/10/20 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
pywinauto自动化操作记事本
2019/08/26 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
主持人婚宴答谢词
2014/01/28 职场文书
网吧最新创业计划书范文
2014/03/27 职场文书
教室布置标语
2014/06/26 职场文书
科技工作者先进事迹
2014/08/16 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书