【php学习笔记】表单部分

接受来自文本输入框的数据

需要两个文件,一个文件名叫index.php用于展示文本框表单(发起请求);另一个文件名叫welcome.php用于接收请求并作出响应。

  • 其中作为请求方的index.php文件内代码如下:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHP表单</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 <<<eof
    欢迎{$_POST['fname']}!您的年龄是{$_POST['age']}岁。
    <br />
eof;

测试过程:先通过浏览器访问127.0.0.1:80/index.php,在页面输入信息后点击提交即可查看表单请求的响应页面。

接收来自下拉菜单的数据(请求与响应同文件)

直接使用代码:

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

这里需要注意的是,form表单部分被放置到php的else代码块中。倘若不使用if{}else{}语句分离接收判断部分和请求表单部分的代码的话,比如如下代码:

<?php
$q = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';

if ($q == 'PHP') {
    echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
    echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
    echo '淘宝<br>http://www.taobao.com';
}

echo <<<eof
    <form action="" method="get">
        <select name="q">
            <option value="">选择一个站点:</option>
            <option value="PHP">PHP</option>
            <option value="GOOGLE">Google</option>
            <option value="TAOBAO">Taobao</option>
        </select>
        <input type="submit" value="提交">
    </form>
eof;

运行查看一下效果
再比如更改一下代码块的顺序:

<?php
echo <<<eof
    <form action="" method="get">
        <select name="q">
            <option value="">选择一个站点:</option>
            <option value="PHP">PHP</option>
            <option value="GOOGLE">Google</option>
            <option value="TAOBAO">Taobao</option>
        </select>
        <input type="submit" value="提交">
    </form>
eof;

$q = isset($_GET['q']) ? htmlspecialchars($_GET['q']) : '';

if ($q == 'PHP') {
    echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
    echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
    echo '淘宝<br>http://www.taobao.com';
}

尝试更改一下请求方式为post:

<?php
echo <<<eof
    <form action="" method="post">
        <select name="q">
            <option value="">选择一个站点:</option>
            <option value="PHP">PHP</option>
            <option value="GOOGLE">Google</option>
            <option value="TAOBAO">Taobao</option>
        </select>
        <input type="submit" value="提交">
    </form>
eof;

$q = isset($_POST['q']) ? htmlspecialchars($_POST['q']) : '';

if ($q == 'PHP') {
    echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
    echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
    echo '淘宝<br>http://www.taobao.com';
}

尝试不使用三目运算符对变量q赋值,而是直接使用$_POST[‘q’],比如这样:

<?php
echo <<<eof
    <form action="" method="post">
        <select name="q">
            <option value="">选择一个站点:</option>
            <option value="PHP">PHP</option>
            <option value="GOOGLE">Google</option>
            <option value="TAOBAO">Taobao</option>
        </select>
        <input type="submit" value="提交">
    </form>
eof;

$q =$_POST['q'];

if ($q == 'PHP') {
    echo 'php中文网教程<br>http://www.php.cn';
} else if ($q == 'GOOGLE') {
    echo 'Google 搜索<br>http://www.google.com';
} else if ($q == 'TAOBAO') {
    echo '淘宝<br>http://www.taobao.com';
}

此时就会报错:原因是第一次访问该页面时没有提交任何下拉菜单数据,或者说请求没有带任何参数,于是语句“$q =$_POST[‘q’]; 赋值号右边无法从POST数组中解析出key为q的value,于是赋值失败,导致报错。”

这一现象强调了原本的三目运算符的重要性

$q = isset($_POST['q']) ? htmlspecialchars($_POST['q']) : '';

该三目运算符解决了初次访问没有参数时的处理。同样地,通过if{}else{}来分割表单请求部分和响应部分有同样的思想在里面

接收多选下拉菜单的数据

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

第一次使用多选下拉菜单者需要注意:要实现多选,需要按住键盘Ctrl键!!!

接收单选按钮表单

<?php
$q = isset($_POST['q']) ? $_POST['q'] : '';
if ($q) {
    if ($q == 'PHP') {
        echo 'php中文网教程<br>http://www.php.cn';
    } else if ($q == 'GOOGLE') {
        echo 'Google 搜索<br>http://www.google.com';
    } else if ($q == 'TAOBAO') {
        echo '淘宝<br>http://www.taobao.com';
    }
} else {
    echo <<<eof
        <form action="" method="post"> 
        <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>
    eof;
}

接收复选框表单

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

数据验证

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>PHP中文网(php.cn)</title>
    <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 (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email))  $emailErr = "非法邮箱格式";
        }

        if (empty($_POST["website"]))  $website = "";
        else {
            $website = test_input($_POST["website"]);
            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;
    }

    $address = htmlspecialchars($_SERVER["PHP_SELF"]);//防止被恶意攻击的一种手段
    $femaleIsChecked = (isset($gender) && $gender == "female")  ? "checked" : "";
    $maleIsChecked = (isset($gender) && $gender == "male") ? "male" : "";

    echo <<<eof
        <h2>PHP 表单验证实例</h2>
        <p><span class="error">* 必需字段。</span></p>
        <form method="post" action="{$address}">
            名字: <input type="text" name="name" value="{$name}">
            <span class="error">* {$nameErr}</span>
            <br><br>
            E-mail: <input type="text" name="email" value="{$email}">
            <span class="error">* {$emailErr}</span>
            <br><br>
            网址: <input type="text" name="website" value="{$website}">
            <span class="error">{$websiteErr}</span>
            <br><br>
            备注: <textarea name="comment" rows="5" cols="40">{$comment}</textarea>
            <br><br>
            性别:
            <input type="radio" name="gender" {$femaleIsChecked} value="female"><input type="radio" name="gender" {$maleIsChecked} value="male"><span class="error">* {$genderErr}</span>
            <br><br>
            <input type="submit" name="submit" value="Submit">
        </form>
        
        <h2>您输入的内容是:</h2>
        {$name}<br>
        {$email}<br>
        {$website}<br>
        {$comment}<br>
        {$gender}
    eof;
    ?>
</body>
</html>

综合说明一下,从这段代码中看出:

  • if ($_SERVER[“REQUEST_METHOD”] == “POST”):用于判断请求类型和是否具有请求参数
  • if (empty($_POST[“name”])):判空(这个和其他语言一样)
  • if (!preg_match("/^[a-zA-Z ]*$/", $name)):正则表达式判断
    额外需要注意一个自定义功能函数
function test_input($data)
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

这个函数在每次通过了判空之后,每次进行格式判定前都进行了调用。通过查询资料知道:函数内部调用的trim()、stripslashes()、htmlspecialchars()三个函数的作用如下:

特别说明:代码中第54行: $address = htmlspecialchars($_SERVER["PHP_SELF"]); 是一种防止网站被恶意攻击的手段,详见:
在获取$_SERVER[“PHP_SELF”]时,使用函数 htmlspecialchars()进行防恶意攻击说明

发布了23 篇原创文章 · 获赞 1 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shenjie_xsj/article/details/104575310