实例讲解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 相关文章推荐
PHP n个不重复的随机数生成代码
Jun 23 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
php自定义错误处理用法实例
Mar 20 PHP
教你识别简单的免查杀PHP后门
Sep 13 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PHP设置Cookie的HTTPONLY属性方法
Feb 09 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 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函数和特点
2013/08/08 PHP
php目录操作实例代码
2014/02/21 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
js模拟点击事件实现代码
2012/11/06 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
使用Python神器对付12306变态验证码
2016/01/05 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
Python安装whl文件过程图解
2020/02/18 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
会议邀请书范文
2014/02/02 职场文书
借款协议书
2014/04/12 职场文书
推荐信格式范文
2014/05/09 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
离职证明范本
2015/06/12 职场文书
python实现高效的遗传算法
2021/04/07 Python