实例讲解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 cli 方式 在crotab中运行解决
Feb 08 PHP
php的字符串用法小结
Jun 08 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
php微信开发接入
Aug 27 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 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
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php session安全问题分析
2011/06/24 PHP
php文件操作实例代码
2012/05/10 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
asp.net和php的区别点总结
2019/10/10 PHP
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
javascript中的面向对象
2017/03/30 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
考试没考好检讨书
2014/01/31 职场文书
公民授权委托书范本
2014/09/17 职场文书
给上级领导的感谢信
2015/01/22 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
python not运算符的实例用法
2021/06/30 Python
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android