一. 表单处理
下面通过一个简单的例子,模拟接受表单处理:
submit.php:
<html> <body> <form action="result.php" method="get"> Name: <input type="text" name="name"><br> Age : <input type="text" name="age"><br> <input type="submit" value="提交"> </form> </body> </html>
result.php
<html> <body> <?php echo "您的姓名".$_GET['name']."<br/>"; echo "您的年龄".$_GET['age']."<br/>"; ?> </body> </html>
当我们访问submit.php并在表单中输入姓名和年龄点击提交后,浏览器会跳转到result.php,并显示我们输入的姓名和年龄
上线的表单的是通过get的方式请求的数据,换成post也是可以的,两者的联系和区别如下:
-
GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, …))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
-
Get使用url进行传参,会将请求参数显示在地址栏,而POST将请求参数包装在request header(请求头) 的form data中
-
POST能提交的参数比GET 多,并且适合传递安全性较高的数据,添加和修改、文件上传等很多参数以及用户信息用POST
-
POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。
二. 表单验证
当用户通过表单来提交数据的时候,作为开发者需要对表单中输入的数据进行相应的验证来防止恶意攻击等问题。
在上面的例子中,我们的form表单的action属性值是result.php,除此之外我们还可以将action的属性值设置为php脚本来实现其他的功能:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
其中htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
而$_SERVER[“PHP_SELF”] 是一种超全局变量,它返回当前执行脚本的文件名。因此,$_SERVER[“PHP_SELF”] 将表单数据发送到页面本身,而不是和上面的例子那样跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。如果用户进入的是地址栏中正常的 URL:”http://www.example.com/test_form.php”,上面的代码会转换为:
<form method="post" action="test_form.php">
另外值得注意的是在action中单独使用$_SERVER[“PHP_SELF”] 并不安全,必须使用 htmlspecialchars() 函数避免 $_SERVER[“PHP_SELF”] 被利用。
除此之外,在用户提交该表单时,我们还要做两件事:
-
(通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
-
(通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)
<!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" value="<?php echo $name; ?>"> <span class="error">* <?php echo $nameErr; ?></span> <br><br> 电邮:<input type="text" name="email" value="<?php echo $email; ?>"> <span class="error">* <?php echo $emailErr; ?></span> <br><br> 网址:<input type="text" name="website" value="<?php echo $website; ?>"> <span class="error"><?php echo $websiteErr; ?></span> <br><br> 评论:<textarea name="comment" rows="5" cols="40">请输入您的评论</textarea> <br><br> 性别:<input type="radio" name="gender" <?php if (isset($gender) && $gender == "female") echo "checked"; ?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender == "male") echo "checked"; ?> value="male">男 <span class="error">* <?php echo $genderErr; ?></span> <br><br> <input type="submit" value="提交"> </form> <h2>您的输入</h2> 姓名:<?php echo $name,"<br/>"?> 邮箱:<?php echo $email,"<br/>"?> 网址:<?php echo $website,"<br/>"?> 评论:<?php echo $comment,"<br/>"?> 性别:<?php echo $gender,"<br/>"?> </body> </html>
其中,#$_SERVER['REQUEST_METHOD']用于返回访问页面使用的请求方法
preg_match() 函数用于检索字符串的模式,如果模式存在则返回 true,否则返回 false。
isset() 函数用于检测变量是否已设置并且非 NULL,括号内只能是变量。使用 unset() 释放变量之后,它将不再是 isset()。
而empty()函数的括号内可以是变量或者表达式,当该变量或者表达式存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE,以下的变量会被认为是空的:
-
“” (空字符串)
-
0 (作为整数的0)
-
0.0 (作为浮点数的0)
-
“0” (作为字符串的0)
-
NULL
-
FALSE
-
array() (一个空数组)
-
$var; (一个声明了,但是没有值的变量)
关于什么时候用empty什么时候用isset:
-
当要判断一个变量是否已经声明的时候 可以使用 isset 函数
-
当要判断一个变量是否已经赋予数据且不为空 可以用 empty 函数
-
当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数[1]
参考资料
以上所有内容均整理自W3school
[1] 脚本之家
请登录之后再进行评论