在本教程中,我们将学习如何在PHP中处理多值表单字段,包括复选框和多选列表框。
在前一篇教程中,我们学习了如何创建一个简单的联系人表单,该表单只包含单个值的字段。但是,有些表单字段包含多个值,如多选列表框:
<
select
multiple
=
"multiple"
name
"formats"
>
option
value
"image"
>image</
"flash"
>flash</
"video"
>video</
"HTML5"
>HTML5</
</
以及具有相同名称但不同值的复选框:
input
type
"checkbox"
"sizes"
"1"
> 640x480
"2"
> 1280x720
"3"
> 1280x960
"4"
> 1920x1080
当您将这些字段提交到web服务器时,这些表单字段将发送多个值,而不是单个值。那么如何在PHP中处理这些多值字段呢?有点棘手。您需要在多值输入框字段名后面添加方括号([])。当PHP看到这个符号([])时,它会根据表单中使用的方法在$GET或者$POST数组中创建一个嵌套的值数组。例如多选列表框的名称应为formats[],复选框的名称应为size[]。
当您将包含多值表单字段的表单提交到web服务器时,如果没有从“多选”列表框中选择任何项或者没有选中任何复选框,则不会向web服务器发送任何内容。
因此,不能按如下方式处理字段的多值:
if
(
count
$_POST
[
'formats'
] > 0)){
// ...
}
因为formats不存在于$POST数组中,所以将会报错。若要检查多值字段是否已提交,可使用isset()函数:
<?php
// 验证formats输入框数据
(isset(
])){
$formats
];
//
此外,多值表单字段的值是固定的,因此您可以根据预定义的值检查提交的值。
假设允许的formats 存储在$allowed_formats数组中,则可以使用in_array()函数将提交的值与此数组中的值进行比较:
$allowed_formats
array
'image'
,
'flash'
'video'
'HTML5'
);
// 验证formats 字段
foreach
as
$format
) {
(!in_array(
)){
// 无效的格式
//...
为了方便,可以使用PHP根据预定义值生成多值表单字段,如下所示:
<select multiple=
name=
"formats[]"
id=
"adsformat"
): ?>
<option value=
"<?php echo $format; ?>"
<?php set_selected(
); ?>>
echo
; ?>
</option>
endforeach
;?>
</select>
把所有代码整合到一起,我们将设计一个请求表单:
请求表单的逻辑与联系人表单相似。
</td>
define(
'MAIL_TO'
'webmaster@example.com'
$errors
();
$name
''
;
$email
$info
$sizes
$allowed_sizes
'160x600'
'300x250'
'336x280'
'728x90'
/**
* 验证表单数据
* @return boolean 如果没有发现错误,则返回true,否则返回false
*/
function
validate_form() {
global
// 验证名字
'name'
] !=
= filter_var(
], FILTER_SANITIZE_STRING);
==
[] =
'名字值无效'
else
{
'请输入名字'
// 验证电子邮箱
'email'
(!filter_var(
, FILTER_VALIDATE_EMAIL)) {
'电子邮箱无效'
'请输入电子邮箱'
// 验证广告尺寸
'sizes'
])) {
$size
)) {
'尺寸无效'
.
'请选择尺寸'
// 验证广告格式
'格式无效'
'请选择广告格式'
// 验证产品/服务信息
'info'
'产品/服务信息内容无效'
'请填写产品/服务信息'
return
false;
true;
* 显示字段值
* @param string $fieldName
display_value(
$fieldName
isset(
]) ?
] :
* 设置尺寸大小
* @param string $value
set_checked(
$value
(in_array(
'checked = "checked"'
* 设置选定的广告格式
set_selected(
'selected = "selected"'
* 向用户显示消息
* @param array $errors array of errors
display_message(
(!isset(
'submit'
) === 0) {
?>
<div
class
"alert alert-success"
<p>谢谢!您的申请已经发送。</p>
</div>
"alert alert-block alert-error fade in"
<p>发生了下列错误:</p>
<ul>
$error
"<li>$error</li>"
</ul>
* 开始表单处理
start_form() {
$subject
'横幅广告申请'
$mail_msg
// 如果用户提交了表单
// 验证表单
(validate_form()) {
.=
'来自: '
"\n"
'邮箱地址: '
'产品/服务: '
"广告尺寸:\n"
.= implode(
','
) .
"广告格式:\n"
// 发送邮件到 MAIL_TO 邮箱地址
(!mail(MAIL_TO,
'发送电子邮件出错.'
// 开始表单处理
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>
"container"
<form action=
"<?php $_SERVER['PHP_SELF'] ?>"
method=
"POST"
"form-horizontal"
<fieldset>
<legend>横幅广告设计申请表单</legend>
"control-group"
<label
for
"name"
"control-label"
>名字:</label>
"controls"
<input type=
"text"
value=
"<?php display_value('name') ?>"
"input-xlarge"
placeholder=
"Name"
/>
"email"
>Email:</label>
"<?php display_value('email') ?>"
"ex: myemail@example.com"
>广告尺寸:</label>
) : ?>
"checkbox inline"
"sizes[]"
"<?php echo $size; ?>"
<?php set_checked(
) ?>>
</label>
>广告格式:</label>
"info"
>产品/服务信息:</label>
<textarea rows=
"7"
cols=
"25"
><?php display_value(
) ?></textarea>
"submit"
"发送"
"btn btn-primary"
"reset"
"重置"
"btn"
</fieldset>
</form>
</body>
</html>
原文链接:https://codingdict.com/