PHP 完整表单
1. 保持表单中的输入值
在用户点击提交按钮后,如果验证失败(例如某个必填项未填写),让用户在输入字段中看到之前输入的数据是非常友好的设计。通过这种方式,用户无需重新填写整个表单。
1.1 文本字段与文本域的持久化
要保持文本字段(如姓名、邮件、网址)中的值,我们需要在输入元素的 value 属性中添加一段简短的 PHP 脚本。对于 textarea(备注字段),我们将脚本放在标签对之间。
这些脚本会输出对应变量的值。如果用户之前输入过内容,变量中就会保存该值并重新渲染到页面上。
姓名:<input type="text" name="name" value="<?php echo $name;?>">
E-mail:<input type="text" name="email" value="<?php echo $email;?>">
网址:<input type="text" name="website" value="<?php echo $website;?>">
备注:<textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>1.2 单选按钮的持久化
对于单选按钮,处理方式略有不同。我们需要检查 gender 变量的值,并利用 checked 属性来标记被选中的选项。
性别:
<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">男性
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="other") echo "checked";?> value="other">其他2. PHP 完整表单验证实例
以下是本系列教程中讨论的所有功能的完整代码。该脚本集成了必填验证、正则表达式格式检查、防止 XSS 攻击的数据清洗以及输入值保持功能。
2.1 完整代码实现
<!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 (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "无效的邮件格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 检查 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>
E-mail:<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"><?php echo $comment;?></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">男性
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="other") echo "checked";?> value="other">其他
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo "<h2>您的输入内容:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>