表单是web 开发中的重要部分,此节熟悉基本的表单处理。
回顾下表单元素form的基本属性:
method:GET/POST;
action:表单将提交到的url。
特点:可通过<?php ...?>赋值,且php中页面不需配置(不像JSP 有web.xml),action更容易写。
target:新的页面将在哪打开。
entype:取值:
1、application/x-www-form-urlencoded:默认,发送表单前对所有字符进行编码;
2、text/plain:空格转换为“+”,但不对特殊值字符编码;
3、multipart/form-data:不对字符编码,但对包含文件上传控件(如type 为file的input)的表单时,必须使用该值。
说明:html5中有许多新的有意思的属性,如有的能覆盖form的method等属性。
一、$_GET 与 $_POST 超全局变量。
GET 与 POST 被视作$_GET 与 $_POST,为超全局变量。GET 与 POST 都创建数组,如array(key=>value,key2=>value2...);其中key 是form表单中表单元素的name属性。
区别:
$_GET 通过URL 参数传递到当前脚本的变量数组。即键值对出现在url中,可在地址栏改变值后提交。
$_POST 通过HTTP POST 传递。
使用场景:
$_GET 地址栏可见,且长度有限制(2000字符),所以适合提交较短的公开的信息,也适合作为书签。
$_POST 密码等,或是长篇幅的文字。
示例:表单
<form id="formForMsg" method="GET" action="resolveSubmit.php">
<fieldset>
<legend>留言板</legend>
<div><span>主题:</span><input type="text" name="msgTheme" /></div>
<div><span>内容:</span><textarea name="msgContent"></textarea></div>
<input class="submit" type="submit" value="留言" />
</fieldset>
</form>
表单所在html展示:
resolveSubmit.php及页面返回为:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>处理表单的php</title>
</head>
<body>
<?php
echo "<h3>".$_GET['msgTheme']."</h3><br/>";
echo "<p>".$_GET['msgContent']."</p>";
$fop=fopen("leaveMsgs.txt", 'a');
fwrite($fop, $_GET['msgTheme'].":".$_GET['msgContent']."\n");
fclose($fop);
?>
</body>
</html>
返回:
二、php表单验证
1、安全性问题
如果提交表单到自身页面:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
说明:
$_SERVER["PHP_SELF"] :即当前的页面的url。
htmlspecialchars()函数:用于将特殊字符转换为实体,如'<'与'>',可防止注入html或JavaScript代码。
(此处注入JavaScript的大致原理:因为地址栏会显示当前页面编码后(即特殊字符转换为相应实体)的url,如果在地址栏url后加入 /><script>...<script> 的相应编码,则未用上面函数的$_SERVER["PHP_SELF"] 会将该段JavaScript脚本添加到 <form .../>后,形成巨大安全隐患。)
2、php验证大致思路
<?php
// define variables and set to empty values
$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);<span style="white-space:pre"> </span>//去空格
$data = stripslashes($data);<span style="white-space:pre"> </span>//去除转义反斜杠,相邻两个去一个
$data = htmlspecialchars($data);<span style="white-space:pre"> </span>//特殊字符使用实体代替
return $data;
}
?>
上面的验证代码同样假设提交到自身页面。
说明:$_SERVER["REQUEST_METHOD"] 返回 表单提交状态,为GET/POST 则表明已经提交了表单。
3、php验证是否为空
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "姓名是必填的";
} else {
$name = test_input($_POST["name"]);
}
}
思路:通过在必填项的后面使用<span><?php echo $alert ?></span> 同时控制$alert 等打印错误提示信息。 (思路与JavaScript一样,不过js通过修改innerHTML 实现提示!)
新学函数:empty();
4、验证e-mail、url等
验证名字:
$name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格!"; }
验证e-mail:
$email = test_input($_POST["email"]); if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "无效的 email 格式!"; }
验证URL:
$website = test_input($_POST["website"]); if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/% =~_|]/i",$website)) { $websiteErr = "无效的 URL"; }
上面全是用正则表达式验证,可见正则表达式很重要!先留着。
小结:
$_GET、$_POST 基础使用;
$_SERVER["PHP_SELF"]返回当前页面url、$_SERVER["REQUEST_METHOD"]判断表单是否提交;
htmlspecialchars()函数转换特殊字符串(用于表单安全或转换字符串);
empty()、trim()、stripslashes()(去转义字符);
preg_match(model,variant)使用正则表达式验证匹配,返回boolean型;
表单验证的思路。
本php笔记多摘抄自W3School:http://www.w3school.com.cn/php/php_functions.asp