PHP HTML表单Form

时间:2018-11-15 15:10:31  来源:igfitidea点击:

在本教程中,我们将学习HTML表单是如何工作的,以及如何用PHP从HTML表单获取并处理数据。

HTML表单由可输入数据并将其提交给web服务器的HTML输入元素组成。
这些输入元素包括文本输入框、密码框、复选框、单选按钮、文件选择组件、提交按钮等。

HTML表单由开始标记<form>开始,以结束标记</form>结束,如下所示:

<form action="script.php" method="post">
</form>

这里,<form>标签有两个重要的属性:

  • action:action属性可以是绝对URL(例如http://localhost/phpcontact.php) )或者相对URL(/contact.php),当用户提交表单时,数据将提交到该URL。
  • method:method属性指定web浏览器如何发送表单数据。你可以使用POST或GET。POST方法允许您发送大量数据,而GET方法对于通过URL发送少量数据及保存为标签非常有用。

要在PHP中从HTML表单读取数据,需要使用以下超全局变量之一:

  • $_GET数组包含使用GET方法的表单的字段名及其值的列表。
  • $_POST数组包含使用POST方法的表单的字段名及其值的列表。
  • $_REQUEST数组包含$_GET和$_POST方法中的表单字段名和值,同时还有$_COOKIE超全局数组中的值。

下图是我们要创建的一个HTML联系人表单:

在contact表单中,我们将使用POST方法,因此需要从$_POST数组中读取表单数据。

例如,我们可以从$_POST数组中读取name字段值,如下所示:

$_POST['name']

我们应该始终不信任用户提交的数据, 每次都要验证用户提交给服务器的数据,以防止恶意用户试图入侵网站。PHP提供了一个非常方便的函数filter_var(),它不仅可以从数据中删除任何非法字符,还可以检查数据是否为有效形式。

以下示例演示如何从表单中的的“name”字段中删除任何非法字符:

<?php 
if($_POST['name'] != ''){
    $name = filter_var($_POST['name'],FILTER_SANITIZE_STRING);
}

要检查电子邮件的格式是否正确,可以使用下面的代码段:

$email = filter_var($_POST['email'],FILTER_SANITIZE_STRING);
 
if(!filter_var($email,FILTER_VALIDATE_EMAIL)){
 // 无效的电子邮件地址
}

我们使用了两次filter_var()函数:

  • 首先,我们从表单字段email的值中删除了所有非法字符。
  • 然后,我们检查了电子邮件的格式是否正确。

为了使表单更美观,我们使用了Twitter Bootstrap框架。
https://getbootstrap.com/docs/3.4/css/

<?php
define('MAIL_TO', '[email protected]');
$errors = array();

$name = '';
$email = '';
$subject = '';
$message = '';

/**
 * 验证表单数据
 * @return boolean 如果没有发生错误,则返回true,否则返回false
 */
function validate_form() {

    global $errors, $name, $email, $subject, $message;

    // 验证名字
    if ($_POST['name'] != '') {
        $name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
        if ($name == '') {
            $errors[] = '名字无效';
        }
    } else {
        $errors[] = '请输入名字';
    }

    // 验证邮箱
    if ($_POST['email'] != '') {
        $email = filter_var($_POST['email'], FILTER_SANITIZE_STRING);

        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = '电子邮箱无效';
        }
    } else {
        $errors[] = '请输入电子邮箱';
    }

    // validate subject
    if ($_POST['subject'] != '') {
        $subject = filter_var($_POST['subject'], FILTER_SANITIZE_STRING);
        if ($subject == '') {
            $errors[] = '标题无效';
        }
    } else {
        $errors[] = '请输入标题';
    }

    // validate message
    if ($_POST['message'] != '') {
        $message = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
        if ($message == '') {
            $errors[] = '输入的内容无效';
        }
    } else {
        $errors[] = '请输入内容';
    }

    if (count($errors)) {
        return false;
    } else {
        return true;
    }
}

/**
 * 显示字段值
 * @param string $fieldName
 */
function display_value($fieldName) {
    echo isset($_POST[$fieldName]) ? $_POST[$fieldName] : '';
}

/**
 * 
 * @param array $errors array of errors
 */
function display_message($errors) {
    if (!isset($_POST['submit'])) {
        return;
    }
    // 向用户显示消息
    if (count($errors) === 0) {
        ?>
        <div class="alert alert-success">
            <p>谢谢你!您的信息已经发送。</p>
        </div> 
        <?php
    } else {
        ?>
        <div class="alert alert-block alert-error fade in">
            <p>发生了下列错误:</p>
            <ul>
                <?php
                foreach ($errors as $error) {
                    echo "<li>$error</li>";
                }
                ?>
            </ul>
        </div>
        <?php
    }
}

/**
 * 开始表单处理
 */
function start_form() {
    global $errors, $name, $email, $subject, $message;

    $mail_msg = '';
    // 如果用户提交了表单
    if (isset($_POST['submit'])) {
        // 验证表单
        if (validate_form()) {
            $mail_msg .= 'From: ' . $name . "\n";
            $mail_msg .= 'Email: ' . $email . "\n";
            ;
            $mail_msg .= 'Message: ' . $message . "\n";

            // 发送电子邮件到MAIL_TO电子邮件地址
            if (!@mail(MAIL_TO, $subject, $mail_msg)) {
                $errors[] = '发送电子邮件失败';
            }
        }
    }
}

// 开始表单处理
start_form();
?>
<!DOCTYPE html>
<html>
    <head>
        <title>联系表单</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css">
    </head>
    <body>
        <div class="container">
            <form action="contact.php" method="POST" class="form-horizontal">
                <fieldset>
                    <legend>PHP联系表单演示</legend>
<?php
display_message($errors);
?>
                    <div class="control-group">
                        <label for="name" class="control-label">名字:</label> 
                        <div class="controls">
                            <input type="text" 
                                   name="name" 
                                   id="name"
                                   value="<?php display_value('name') ?>" 
                                   class="input-xlarge" 
                                   placeholder="Name"/>
                        </div>
                    </div>

                    <div class="control-group">
                        <label for="email" class="control-label">邮箱:</label>
                        <div class="controls">
                            <input type="email" 
                                   name="email"
                                   id="email" 
                                   value="<?php display_value('email') ?>"
                                   class="input-xlarge" 
                                   placeholder="Email"/>
                        </div> 
                    </div>

                    <div class="control-group">
                        <label for="subject" class="control-label">标题:</label>
                        <div class="controls">
                            <input type="text" 
                                   name="subject"
                                   id="subject" 
                                   value="<?php display_value('subject') ?>" 
                                   class="input-xlarge" 
                                   placeholder="Subject" />
                        </div> 
                    </div>

                    <div class="control-group">
                        <label for="message" class="control-label">内容:</label>
                        <div class="controls">
                            <textarea rows="7" 
                                      cols="25" 
                                      name="message" 
                                      id="message"
                                      class="input-xlarge"><?php display_value('message') ?></textarea>
                        </div>
                    </div>

                    <div class="control-group"> 
                        <div class="controls">
                            <input type="submit" name="submit" value="发送" class="btn"> 
                            <input type="reset" name="reset" value="重置" class="btn">
                        </div>
                    </div>
                </fieldset>
            </form>
        </div> 
    </body>
</html>

首先,我们定义了一个全局变量列表,我们可以在整个函数中使用:

<?php
 
define('MAIL_TO','[email protected]');
$errors = array();
 
$name = '';
$email = '';
$subject = '';
$message = '';

其次,在validate_form()函数中,我们检查所有的表单字段。如果发生任何错误,我们将在$errors全局数组中记录错误。

第三,如果字段值存在于$_POST数组中,则display_value()函数将显示字段值。我们使用display_value()函数来保留后续请求之间的字段值,以防发生错误。这有助于用户再次填写表单字段时能节省时间,。

第四,display_message()函数将根据$errors全局数组来决定是显示错误还是成功的消息。

第五,start_form()函数检查用户是否提交了表单。如果是,它将通过调用validate_form()函数来验证表单。如果一切正常,它将使用mail()函数发送电子邮件。