form有两个属性
action:提交地址
method:提交方式
数据传输方法
用超全局变量$_POST
和$_GET
来收集表单数据。
两种方法都是通过创建数组来收集数据。键名为表单控件的名称,值来自表单输入的数据。
这时表单中需要有php文件,传输方法,以及提交按钮。
POST
<form action ="test.php" method="post">
意思为点击提交按钮后,该表单数据将传输到test.php文件供处理,传输方式是http post。此时注意post要小写,用VScode编写时回车自动变成大写了,结果出错。在php文件中,可以直接输出变量,如echo $_POST["..."];
POST请求不会被缓存,不会保留在浏览器历史记录中,不能收藏为标签,对数据长度没有限制。通过POST方法从表单发送的信息对其他人是不可见的,可用于发送敏感数据。
GET
与POST使用方法一致<form action="test.php" method="get">
echo $_GET["..."];
GET发送的信息对所有人可见,所有变量名和值都显示在URL中,对所发信息的数量有限制,大约在2000个字符,可发送非敏感数据。
REQUEST
看到别人说还有一种$_REQUEST
方法,用于获取GET或POST传送的内容。用法一致。
GET还是POST
当提交表单时,服务器上不会有任何改变时,只应该用GET形式。因为搜索关键字在URL中,用户可以标记搜索结果页面,并且不需要再次输入搜索关键字就能返回该结果页面。但是如果在提交表单之后,删除了一个文件、更新了一个数据库,或者插入了一条记录,应该使用POST,因为如果用户标记了该页面(按下back按钮),将不会再次触发表单提交并且潜在地创建一条重复的记录。
表单验证
在表单数据提交后应对数据进行相应的验证,保证安全。如某些字段是必需填写,某些不必需,或者数据的正确性。<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
可以用这种方式来将数据传送到当前页面。
htmlspecialchars把特殊字符转换为 HTML 实体,< 和 > 之类的 HTML 字符会被替换为 <
和>
。保证安全性。$_SERVER["PHP_SELF"]
是一种超全局变量,它返回当前执行脚本的文件名。
可以在被请求字段后面加一些脚本,如果需要,会生成恰当的错误消息(如果用户未填写必填字段就试图提交表单)。
<html>
<head>
<title>registration page</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<style>
.error {
color: #ff0000;
}
</style>
</head>
<body>
<?php
$nameErr = $paswErr = $mailErr = $genderErr = "";
$hasError = false;
if ($_SERVER["REQUEST_METHOD"] == "POST") { //是判断提交的数据是否是POST方式传来的
if (empty($_POST["username"])) {
$hasError = true;
$nameErr = "请输入用户名";
}
else{
if(!(preg_match("/\w+/",$_POST["username"])))
{
$hasError=true;
$nameErr="格式错误,请重新输入";
}
}
if (empty($_POST["password"])) {
$hasError = true;
$paswErr = "请输入密码";
} else {
if (!preg_match("/^[A-Z]\w{5,}$/", $_POST["password"])) {
$hasError = true;
$paswErr = "密码格式不规范,请重新输入";
}
}
if (empty($_POST["mail"])) {
$hasError = true;
$mailErr = "请输入邮箱地址";
} else {
if (!preg_match("/^\w+\@\w+.com$/", $_POST["mail"])) {
$hasError = true;
$mailErr = "邮箱地址格式错误";
}
}
if (empty($_POST["gender"])) {
$genderErr = "请填写性别";
$hasError = true;
}
if (!$hasError){
echo "注册成功!";
var_dump($_POST);
}
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
<h1>用户注册</h1>
<span class="error">*标记部分为必填选项</span><br>
用户名:<input type="text" name="username" placeholder="请输入用户名" id="username" title="只允许数字字母下划线" />
<span class="error">* <?php echo $nameErr; ?></span><br>
密码:<input type="password" name="password" placeholder="请输入密码" title="大写字母开头,可包含数字字母下划线,至少6位" />
<span class="error">* <?php echo $paswErr; ?></span><br>
邮箱:<input type="text" name="mail" />
<span class="error">* <?php echo $mailErr; ?></span><br>
性别:<label for="male">男</label><!--label为input元素定义标注-->
<input type="radio" value="male" name="gender" id="male" />
<label for="female">女</label><!--"for" 属性把 label 绑定到另外一个元素,注意id-->
<input type="radio" value="female" name="gender" id="female" />
<span class="error">* <?php echo $genderErr; ?></span><br>
爱好:阅读<input type="checkbox" value="read" name="interest[]" />
运动<input type="checkbox" value="motion" name="interest[]" />
音乐<input type="checkbox" value="music" name="interest[]" /><br>
出生年月:<select id="year" name="year"></select>
<select id="month" name="month"></select><br>
自我介绍:<textarea name="intro" cols="80" rows="5">Hi!I'm zarm.
</textarea><br>
<input type="submit" value="提交" />
</form>
<script>
function birth() {
for (var i = 1960; i < 2020; i++) {
var year = document.createElement("option");
year.text = i + "年";
year.value = i;
document.getElementById("year").add(year);
}
for (var n = 1; n < 13; n++) {
var month = document.createElement("option");
month.text = n + "月";
month.value = n;
document.getElementById("month").add(month);
}
}
birth();
</script>
</body>
</html>