PHP 简明教程

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>