我有一个像这样的多个字段:
<select name="excluded_groups[]">
<?php echo $foo->multi_group_select_options($group_ids, $excluded_id); ?>
</select>
我设法通过此功能从数据库中获取结果并将它们放在<select>
中,但我无法保持选定的选定值。
第一个参数应该在提交之前标记的字段中添加selected="selected"
,然后提交,第二个参数会阻止显示group_id(第二个参数可以正常工作)。
这是函数......
/**
* group_options
* Get group names in the dropdown list
*/
public function multi_group_select_options($default = false, $exclude_id = '')
{
global $user;
$exclude_id = (isset($this->config['default_group'])) ? $this->config['default_group'] : 5;
$sql_where = ($user->data['user_type'] == USER_FOUNDER) ? '' : 'WHERE group_founder_manage = 0';
$sql_where_and = (!empty($sql_where)) ? ", AND group_id <> $exclude_id" : "WHERE group_id <> $exclude_id";
$sql = 'SELECT group_id, group_name, group_type
FROM ' . GROUPS_TABLE . "
$sql_where
$sql_where_and
ORDER BY group_name";
$result = mysql_query($sql);
$s_group_options = '';
while ($row = mysql_fetch_assoc($result))
{
/*if (is_array($default))
{
break;
$group_id = '';
foreach ($default as $key => $group_id)
{
$group_id = $group_id;
}
}
print_r($default);*/
$selected = ($row['group_id'] == $group_id) ? ' selected="selected"' : '';
$s_group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name'];
$s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . $selected . '>' . $s_group_name . '</option>';
}
$db->sql_freeresult($result);
return $s_group_options;
}
我作为第一个参数放置的数组是完全有效的。它只是一个包含键和值的普通数组,其中值是组ID。
在一段时间内尝试使用foreach - 不起作用,与while循环外部相同。
$ default数组如下所示:
Array
(
[0] => 1
[1] => 7
[2] => 2
[3] => 3
)
答案 0 :(得分:3)
您的代码存在一些问题。
首先,该函数将$exclude_id
作为参数,但忽略该参数并将其赋值:
$exclude_id = (isset($this->config['default_group'])) ? $this->config['default_group'] : 5;
其次,您说这应该是多选,但您的<SELECT>
标记没有MULTIPLE
属性。
第三,您要将$row['group_id']
与$group_id
进行比较。这只允许一个默认值,而不是多个,你甚至不设置变量(设置它的代码被注释掉,但它只会将它设置为$default
数组的最后一个元素.DCoder's评论似乎是正确的解决方案。
答案 1 :(得分:1)
您没有设置$group_id
。以下代码将使用默认值数组以及单个值:
if(is_array($default)) {
$selected = in_array($row['group_id'], $default);
} else {
$selected = !strcasecmp($row['group_id'], $default);
}
$selected = $selected ? ' selected="selected"' : '';
除此之外,请查看@Barmar在his answer中写的注释,并使用htmlspecialchars
来转义任何动态文本,例如$s_group_name
。
此评论与您的具体问题无关,但您仍应考虑它。
请停止使用古老的mysql_ *函数编写新代码。它们已不再维护,社区已经开始deprecation process。相反,您应该了解准备好的语句并使用PDO或MySQLi。如果您想学习,here is a quite good PDO-related tutorial。