PHP多值表单字段

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

在本教程中,我们将学习如何在PHP中处理多值表单字段,包括复选框和多选列表框。

命名多值表单字段

在前一篇教程中,我们学习了如何创建一个简单的联系人表单,该表单只包含单个值的字段。但是,有些表单字段包含多个值,如多选列表框:

<select multiple="multiple" name="formats">
 <option value="image">image</option>
 <option value="flash">flash</option>
 <option value="video">video</option>
 <option value="HTML5">HTML5</option>
</select>

以及具有相同名称但不同值的复选框:

<input type="checkbox" name="sizes" value="1"> 640x480
<input type="checkbox" name="sizes" value="2"> 1280x720
<input type="checkbox" name="sizes" value="3"> 1280x960
<input type="checkbox" name="sizes" value="4"> 1920x1080

当您将这些字段提交到web服务器时,这些表单字段将发送多个值,而不是单个值。那么如何在PHP中处理这些多值字段呢?有点棘手。您需要在多值输入框字段名后面添加方括号([])。当PHP看到这个符号([])时,它会根据表单中使用的方法在$GET或者$POST数组中创建一个嵌套的值数组。
例如多选列表框的名称应为formats[],复选框的名称应为size[]。

验证多值表单字段

当您将包含多值表单字段的表单提交到web服务器时,
如果没有从“多选”列表框中选择任何项或者没有选中任何复选框,则不会向web服务器发送任何内容。

因此,不能按如下方式处理字段的多值:

if(count($_POST['formats'] > 0)){
 // ...
}

因为formats不存在于$POST数组中,所以将会报错。若要检查多值字段是否已提交,可使用isset()函数:

<?php 
 
// 验证formats输入框数据
if(isset($_POST['formats'])){
    $formats = $_POST['formats'];
    //
}

此外,多值表单字段的值是固定的,因此您可以根据预定义的值检查提交的值。

假设允许的formats 存储在$allowed_formats数组中,则可以使用in_array()函数将提交的值与此数组中的值进行比较:

<?php 
 
$allowed_formats = array('image','flash','video','HTML5');
// 验证formats 字段
if(isset($_POST['formats'])){
    $formats = $_POST['formats'];
    foreach ($formats as $format) {
        if(!in_array($format, $allowed_formats)){
            // 无效的格式
            //...
        }
    }
}

为了方便,可以使用PHP根据预定义值生成多值表单字段,如下所示:

<select multiple="multiple" name="formats[]" id="adsformat">
 <?php foreach ($allowed_formats as $format): ?>
    <option value="<?php echo $format; ?>" <?php set_selected($format); ?>>
        <?php echo $format; ?>
    </option>
 <?php endforeach;?>
</select>

整合到一起

把所有代码整合到一起,我们将设计一个请求表单:

请求表单的逻辑与联系人表单相似。

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

$name = '';
$email = '';
$info = '';
$sizes = array();
$formats = array();

$allowed_sizes = array('160x600', '300x250', '336x280', '728x90');
$allowed_formats = array('image', 'flash', 'video', 'HTML5');

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

    global $errors, $name, $email, $info,
    $sizes, $allowed_sizes, $formats, $allowed_formats;

    // 验证名字
    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[] = '请输入电子邮箱';
    }

    // 验证广告尺寸
    if (isset($_POST['sizes'])) {
        $sizes = $_POST['sizes'];
        foreach ($sizes as $size) {
            if (!in_array($size, $allowed_sizes)) {
                $errors[] = '尺寸无效' . $size;
            }
        }
        $email = filter_var($_POST['email'], FILTER_SANITIZE_STRING);
    } else {
        $errors[] = '请选择尺寸';
    }

    // 验证广告格式
    if (isset($_POST['formats'])) {
        $formats = $_POST['formats'];
        foreach ($formats as $format) {
            if (!in_array($format, $allowed_formats)) {
                $errors[] = '格式无效' . $size;
            }
        }
        $email = filter_var($_POST['email'], FILTER_SANITIZE_STRING);
    } else {
        $errors[] = '请选择广告格式';
    }

    // 验证产品/服务信息
    if ($_POST['info'] != '') {
        $info = filter_var($_POST['info'], FILTER_SANITIZE_STRING);
        if ($info == '') {
            $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 string $value
 */
function set_checked($value) {
    global $sizes;
    if (in_array($value, $sizes)) {
        echo 'checked = "checked"';
    }
}

/**
 * 设置选定的广告格式
 * @param string $value
 */
function set_selected($value) {
    global $formats;
    if (in_array($value, $formats)) {
        echo 'selected = "selected"';
    }
}

/**
 * 向用户显示消息
 * @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, $info, $sizes, $formats;

    $subject = '横幅广告申请' . $name;
    $mail_msg = '';

    // 如果用户提交了表单
    if (isset($_POST['submit'])) {
        // 验证表单
        if (validate_form()) {
            $mail_msg .= '来自: ' . $name . "\n";
            $mail_msg .= '邮箱地址: ' . $email . "\n";
            ;
            $mail_msg .= '产品/服务: ' . $info . "\n";
            $mail_msg .= "广告尺寸:\n";
            $mail_msg .= implode(',', $sizes) . "\n";
            $mail_msg .= "广告格式:\n";
            $mail_msg .= implode(',', $formats) . "\n";
            ;
            $mail_msg .= $info;

            // 发送邮件到 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="<?php $_SERVER['PHP_SELF'] ?>" method="POST"
                  class="form-horizontal">
                <fieldset>
                    <legend>横幅广告设计申请表单</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">Email:</label>
                        <div class="controls">
                            <input type="email" name="email" id="email"
                                   value="<?php display_value('email') ?>" class="input-xlarge"
                                   placeholder="ex: [email protected]" />
                        </div>
                    </div>

                    <div class="control-group">
                        <label class="control-label">广告尺寸:</label>
                        <div class="controls">
<?php foreach ($allowed_sizes as $size) : ?>
                                <label class="checkbox inline">
                                    <input type="checkbox" 
                                           name="sizes[]"
                                           value="<?php echo $size; ?>" 
    <?php set_checked($size) ?>>
                                           <?php echo $size; ?>
                                </label>
                                       <?php endforeach; ?>
                        </div>
                    </div>

                    <div class="control-group">
                        <label for="adsformat" class="control-label">广告格式:</label>
                        <div class="controls">
                            <select multiple="multiple" name="formats[]" id="adsformat">
<?php foreach ($allowed_formats as $format): ?>
                                    <option value="<?php echo $format; ?>" 
                                    <?php set_selected($format); ?>>
                                            <?php echo $format; ?>
                                    </option> 
                                            <?php endforeach; ?>
                            </select>
                        </div>
                    </div>

                    <div class="control-group">
                        <label for="info" class="control-label">产品/服务信息:</label>
                        <div class="controls">
                            <textarea rows="7" cols="25" 
                                      name="info" 
                                      id="info" 
                                      class="input-xlarge"><?php display_value('info') ?></textarea>
                        </div>
                    </div>

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