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>

