【实战】PHP表单

在前面的章节中,我们已经基本入门 PHP 这门脚本语言,讲解中也仅仅用了控制台来运行 PHP 实例,这并不符合 PHP Web 编程的初衷,故此本章节将做一个简单的 PHP Web 实战:图书馆读者身份注册

我们默认您已经掌握 HTML 基础知识,如果没有,可以关注我们的HTML教程公众号或转到[HTML5 教程]()同步学习!

为了更好地实现前后端分离,接下来的示例代码中,HTML 文件不会包含 PHP 代码。

为了尽快开始,我们建议使用wamp集成环境软件进行项目开发。

1. 创建一个读者注册表单

我们建立一个 HTML 表单,其中包含了读者的昵称、密码、确认密码、年级等四项信息,示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>读者注册</title>
</head>
<body>

    <h1>注册</h1>

    <form method="POST" action="./signup.php">
        <label for="name">
            昵称:
            <input type="text" name="name" id="name">
        </label>
        <label for="pwd">
            密码:
            <input type="password" name="pwd" id="pwd">
        </label>
        <label for="confirm">
            确认密码:
            <input type="password" name="confirm" id="confirm">
        </label>
        <label for="grade">
            年级:
            <select name="grade" id="grade">
                <option value="1">大一</option>
                <option value="2">大二</option>
                <option value="3">大三</option>
                <option value="4">大四</option>
            </select>
        </label>

        <button type="submit" id="submit">确认注册</button>
    </form>

</body>
</html>

将该文件命名为register.html,复制该文件至你的服务器根目录,在浏览器中输入:localhost/register.html,你将看到下面这个界面:

注册表单界面

其中表单标签<form>中的method属性表示该表单以什么方式发送数据至服务器处理脚本,action属性则表示请求页面的地址。 发送方式有两种:GETPOSTGET在语义上表示获取内容,发送的参数直接显示在URL上,而且由于URL有长度限制,适合发送较短的数据;而POST在语义上表示上传内容,发送的参数被构建在请求的消息体中,较之GET隐私性更强。

我们这里采用POST方式发送用户注册信息至signup.php脚本处理。

2. 获取数据:$_GET$_POST

form表单在点击提交按钮后,会将数据发送至signup.php,那么 PHP 脚本是如何获取这个数据的呢?

答案是$_POST数组变量。

如果该表单的发送方式为GET,则在PHP中使用$_GET数组变量进行接收。

现在在你的服务器根目录新建一个名为signup.php的文件,内容如下:

<?php

// 处理用户注册

$name = $_POST['name'] ?? NULL;
$pwd = $_POST['pwd'] ?? NULL;
$confirm = $_POST['confirm'] ?? NULL;
$grade = $_POST['grade'] ?? 0;

if($name && $pwd && $confirm && $grade){
    echo '用户名:',$name,'<br>密码:',$pwd,'<br>确认密码:',$confirm,'<br>年级:',$grade;
} else {
    $tip = '提交的表单不完整';
    echo json_encode($tip, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}

上述代码接收了 HTML 文件上传的数据,其中$_POST数组的索引为HTML表单元素的name属性值

在浏览器中访问register.html,并填充各个输入框,点击确认注册按钮,将跳转至localhost/signup.php页面,并输出类似下面的结果:

输出结果

如果将表单中的发送方式改为GET,并将处理脚本signup.php$_POST全部改为$_GET,你将在地址栏看到类似这样的信息:http://localhost/signup.php?name=极速教程&pwd=jisu&confirm=jiaocheng&grade=1,你在表单提交的数据都直接显示在 URL 了。

2.1 另一种获取数据方式:$_REQUEST

有时候我们可能不确定网页是通过什么方式传输数据的,那么可以使用$_REQUEST数组变量。它支持POSTGET方式传送的数据,尝试将signup.php文件的内容改为下面代码:

<?php

// 处理用户注册
// 遍历 $_REQUEST 变量
foreach ($_REQUEST as $key => $value) {
    echo $key,': ',$value,'<br>';
}

刷新浏览器,查看结果。

2.2 PHP代码说明

前面的示例代码给我们展示了 PHP 是如何在后台获取数据的,现在我们详细分析代码:

<?php

// 处理用户注册

$name = $_POST['name'] ?? NULL;
$pwd = $_POST['pwd'] ?? NULL;
$confirm = $_POST['confirm'] ?? NULL;
$grade = $_POST['grade'] ?? 0;

if($name && $pwd && $confirm && $grade){
    echo '用户名:',$name,'<br>密码:',$pwd,'<br>确认密码:',$confirm,'<br>年级:',$grade;
} else {
    $tip = '提交的表单不完整';
    echo json_encode($tip, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}

第 5~8 行是通过$_POST数组接收前台给我们传输的数据,还记得NULL合并操作符??吗?在运算符一章中我们讲过它表示返回从左往右第一个不是NULL的值,如果都为NULL则返回NULL,这里我们用来判断数据提交是否完整。

而第 14 行的json_encode()函数表示将一个数组或者对象转化为JSON字符串形式,以便前台可以处理它。

2.3 一些特殊的表单值获取

除了常见的文本输入框、密码输入框,我们可能还会接触到像上例中的下拉菜单<select>标签,或者是单选标签<input type="radio" name="single_choose" value="PHP教程">、多选标签<input type="checkbox" name="multi_choose[]" value="极速教程">,获取某一个标签的值时只需定义该标签的name值,形如name='single',而获取一个标签中的多个值时,需要定义该标签的name值为数组形式,形如name='multi[]'

例如下面的代码(文件test.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
    <form action="./test.php" method="post">

        <!-- select标签:单选 -->
        <h2>年级</h2>
        <select name="grade" id="grade">
            <option value="1">大一</option>
            <option value="2">大二</option>
            <option value="3">大三</option>
            <option value="4">大四</option>
        </select>

        <!-- redio标签:单选 -->
        <h2>性别</h2>
        <label for="">
            <input type="radio" name="gender" value="男" id="gender">
            男
        </label>
        <label for="">
            <input type="radio" name="gender" value="女" id="gender">
            女
        </label>

        <!-- select标签:多选 -->
        <h2>爱好</h2>
        <select name="hobby[]" id="hobby">
            <option value="游泳">游泳</option>
            <option value="唱歌">唱歌</option>
            <option value="编程">编程</option>
        </select>

        <!-- checkbox标签:多选 -->
        <h2>社交方式</h2>
        <label for=""><input type="checkbox" name="social[]" value="QQ" id="">QQ</label>
        <label for=""><input type="checkbox" name="social[]" value="微信" id="">微信</label>
        <label for=""><input type="checkbox" name="social[]" value="微博" id="">微博</label>

        <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

因为要输出数组信息,我们新建一个 PHP 文件test.php,代码如下:

<?php

foreach ($_REQUEST as $key => $value) {
    if (is_array($value)) {
        echo $key,': ',json_encode($value, JSON_UNESCAPED_UNICODE),'<br>';
    } else {
        echo $key,': ',$value,'<br>';
    }
}

其中json_encode()函数用来处理数组为JSON字符串。

在浏览器地址栏输入localhost\test.html,并填充表单,点击提交按钮,查看输出结果:

结果

可以看到数组数据被正确输出。


经过十章的概念学习以及一些简短的示例,我们已经完全掌握了 PHP 的基础,并且通过 PHP 表单的实战,我们也学会了如何将数据发送到 PHP 后台处理,通过 JavaScript 可以将 PHP 处理过的数据反馈到 HTML 页面,如果你对 JavaScript 比较熟悉,还可以使用异步处理来减少用户等待时间。

在后续的教程里,我们也将讲解PHP与Ajax是如何相互配合的,接下来我们通过一个一个的小案例来进入我们的中级教程。