实例讲解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 实例化类的一点摘记
Mar 23 PHP
php不用正则采集速度探究总结
Mar 24 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
深入apache host的配置详解
Jun 09 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
php+ajax实现无刷新分页
Nov 18 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 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中创建并处理图象
2006/10/09 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP基本语法实例总结
2016/09/09 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
javascript中 try catch用法
2015/08/16 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python实现截屏的函数
2015/07/26 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
Python3简单实现串口通信的方法
2019/06/12 Python
Python jieba库用法及实例解析
2019/11/04 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Python基于内置函数type创建新类型
2020/10/22 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
酒店开业策划方案
2014/06/02 职场文书
计算机毕业生自荐信
2014/06/12 职场文书