实例讲解PHP表单
表单处理
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表单的资料请关注其它相关文章!
上一篇: 详解六种减小Docker镜像大小的方法
下一篇: 不要让社区团购成为销量下滑的“背锅侠”