php教程:表单处理和表单验证

表单和用户输入

表单处理

当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 PHP 脚本使用。

# form.html 文件代码

<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
 
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
 
</body>
</html>

# welcome.php 文件代码

欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"]; ?>  岁。

获取下拉菜单的数据

下拉菜单单选

用select标签设置下拉菜单三个选项,表单使用 GET 方式获取数据,action 属性值为空表示提交到当前脚本,我们可以通过 select 的 name 属性获取下拉菜单的值:

<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
    
    
        if($q =='RUNOOB') {
    
    
                echo '菜鸟教程<br>http://www.runoob.com';
        } else if($q =='GOOGLE') {
    
    
                echo 'Google 搜索<br>http://www.google.com';
        } else if($q =='TAOBAO') {
    
    
                echo '淘宝<br>http://www.taobao.com';
        }
} else {
    
    
?>
<form action="" method="get"> 
    <select name="q">
        <option value="">选择一个站点:</option>
        <option value="RUNOOB">Runoob</option>
        <option value="GOOGLE">Google</option>
        <option value="TAOBAO">Taobao</option>
    </select>
    <input type="submit" value="提交">
    </form>
<?php
}
?>

在这里插入图片描述
在这里插入图片描述

下拉菜单多选

如果下拉菜单是多选的( multiple=“multiple”),我们可以通过将设置 select name=“q[]” 以数组的方式获取

<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
    
    
    $sites = array(
            'RUNOOB' => '菜鸟教程: http://www.runoob.com',
            'GOOGLE' => 'Google 搜索: http://www.google.com',
            'TAOBAO' => '淘宝: http://www.taobao.com',
    );
    foreach($q as $val) {
    
    
        // PHP_EOL 为常量,用于换行
        echo $sites[$val] . PHP_EOL;
    }
      
} else {
    
    
?>
<form action="" method="post"> 
    <select multiple="multiple" name="q[]">
    <option value="">选择一个站点:</option>
    <option value="RUNOOB">Runoob</option>
    <option value="GOOGLE">Google</option>
    <option value="TAOBAO">Taobao</option>
    </select>
    <input type="submit" value="提交">
    </form>
<?php
}
?>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

单选按钮表单

单选按钮表单中 name 属性的值是一致的,value 值是不同的

<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
    
    
        if($q =='RUNOOB') {
    
    
                echo '菜鸟教程<br>http://www.runoob.com';
        } else if($q =='GOOGLE') {
    
    
                echo 'Google 搜索<br>http://www.google.com';
        } else if($q =='TAOBAO') {
    
    
                echo '淘宝<br>http://www.taobao.com';
        }
} else {
    
    
?><form action="" method="get"> 
    <input type="radio" name="q" value="RUNOOB" />Runoob
    <input type="radio" name="q" value="GOOGLE" />Google
    <input type="radio" name="q" value="TAOBAO" />Taobao
    <input type="submit" value="提交">
</form>
<?php
}
?>

在这里插入图片描述

checkbox 复选框

checkbox 复选框可以选择多个值,有点类似于下拉菜单多选的情况

<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
    
    
    $sites = array(
            'RUNOOB' => '菜鸟教程: http://www.runoob.com',
            'GOOGLE' => 'Google 搜索: http://www.google.com',
            'TAOBAO' => '淘宝: http://www.taobao.com',
    );
    foreach($q as $val) {
    
    
        // PHP_EOL 为常量,用于换行
        echo $sites[$val] . PHP_EOL;
    }
      
} else {
    
    
?><form action="" method="post"> 
    <input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br> 
    <input type="checkbox" name="q[]" value="GOOGLE"> Google<br> 
    <input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
    <input type="submit" value="提交">
</form>
<?php
}
?>

在这里插入图片描述

表单验证

在处理PHP表单时我们需要考虑安全性,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

扫描二维码关注公众号,回复: 16840026 查看本文章

表单验证实例

在这里插入图片描述

字段 验证规则
名字 必须。 +只能包含字母和空格
E-mail 必须。 + 必须是一个有效的电子邮件地址(包含’@‘和’.')
网址 可选。如果存在,它必须包含一个有效的URL
备注 可选。多行输入字段(文本域)
性别 必须。 必须选择一个
  • 文本字段
名字: <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>
  • 单选按钮
性别:
<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>

预防XSS攻击:避免 $_SERVER[“PHP_SELF”] 被利用]

$_SERVER[“PHP_SELF”] 变量有可能会被黑客使用!

若表单部分代码这么写:

# test_form.php为当前php脚本名,也可以写成 action="<?php echo $_SERVER["PHP_SELF"]

<form method="post" action="test_form.php">

而用户会在浏览器地址栏中输入以下地址:

http://www.runoob.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

以上的 URL 中,将被解析为如下代码并执行:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)

如何避免 $_SERVER[“PHP_SELF”] 被利用?

$_SERVER[“PHP_SELF”] 可以通过 htmlspecialchars() 函数来避免被利用。

显示错误信息 目录

为每个字段中添加了一些脚本, 各个脚本会在信息输入错误时显示错误信息。(如果用户未填写信息就提交表单则会输出错误信息):

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 
名字: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
   .
   .
   .

正则匹配:验证邮件和URL 目录

preg_match — 进行正则表达式匹配

语法:

int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] ) 
# 1. 验证名称,检测 name 字段是否包含字母和空格

$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "只允许字母和空格"; 
}


# 2. 验证邮件,检测 e-mail 地址是否合法

$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
  $emailErr = "非法邮箱格式"; 
}


# 3. 验证 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 目录

  • $_GET 变量

从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。

  • 所以在发送密码或其他敏感信息时,不应该使用这个方法

正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。

  • HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的
  • $_POST 变量

从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

  • $_REQUEST 变量

预定义的 $_REQUEST 变量包含了 G E T 、 _GET、 GET_POST 和 $_COOKIE 的内容。

$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/133396943