实例讲解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 相关文章推荐
第十二节 类的自动加载 [12]
Oct 09 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
PHP数据过滤的方法
Oct 30 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
PHP程序员的技术成长规划
Mar 25 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
php银联网页支付实现方法
2015/03/04 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
js实现Tab选项卡切换效果
2020/07/17 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
python3.x实现发送邮件功能
2018/05/22 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
在keras里实现自定义上采样层
2020/06/28 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
乔迁宴答谢词
2014/01/21 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
2014年财务科工作总结
2014/11/11 职场文书
外贸英文求职信范文
2015/03/19 职场文书
未婚证明范本
2015/06/15 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书