PHP多值表单字段


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

命名多值表单字段

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

1
2
3
4
5
6
<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>

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

1
2
3
4
<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服务器发送任何内容。

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

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

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

1
2
3
4
5
6
7
<?php
 
// 验证formats输入框数据
if(isset($_POST['formats'])){
$formats = $_POST['formats'];
//
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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根据预定义值生成多值表单字段,如下所示:

1
2
3
4
5
6
7
<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>

整合到一起

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245

</td>

<?php
define('MAIL_TO', 'webmaster@example.com');
$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: myemail@example.com" />
</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>


原文链接:https://codingdict.com/