3

次のような複数フィールドがあります。

<select name="excluded_groups[]">
    <?php echo $foo->multi_group_select_options($group_ids, $excluded_id); ?>
</select>

この関数を介してデータベースから結果を取得し、<select>.

selected="selected"最初のパラメーターは、送信前にマークされてから送信されたフィールドに追加する必要があります。2 番目のパラメーターは、group_id が表示されないようにします (2 番目のパラメーターは正常に機能します)。

ここに関数があります...

/**
* 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 です。

while 内で foreach を使用しようとしましたが、while ループの外側と同じように機能しませんでした。

$default 配列は次のようになります。

Array
(
    [0] => 1
    [1] => 7
    [2] => 2
    [3] => 3
)
4

2 に答える 2

3

コードにはいくつかの問題があります。

まず、関数は$exclude_idパラメーターとして受け取りますが、引数を無視して次のように割り当てます。

$exclude_id = (isset($this->config['default_group'])) ? $this->config['default_group'] : 5;

第二に、これは複数選択である必要があると言いますが、タグには属性<SELECT>がありません。MULTIPLE

第三に、あなたは と比較$row['group_id']してい$group_idます。これは、複数ではなく単一のデフォルトのみを許可し、変数を設定することさえしていません(それを設定するコードはコメントアウトされていますが、$default配列の最後の要素にのみ設定されます.DCoderのコメントは正しいようですこれに対する解決策。

于 2012-09-19T05:53:32.470 に答える
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が彼の回答htmlspecialcharsに書いたメモを調べて、などの動的テキストをエスケープするために使用して$s_group_nameください。


このコメントはあなたの特定の問題とは関係ありませんが、それでもあなたはそれを考慮する必要があります。

古いmysql_*関数を使用した新しいコードの記述を停止してください。それらはもはや維持されておらず、コミュニティは非推奨プロセスを開始しました。代わりに、プリペアドステートメントについて学び、PDOまたはMySQLiのいずれかを使用する必要があります。あなたが学びたいのであれば、ここに非常に良いPDO関連のチュートリアルがあります。

于 2012-09-19T12:24:54.207 に答える