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>