2012-09-19 104 views
3

我有一個多場這樣的:多重選擇字段 - 選擇=「選擇」多次

<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。

嘗試在while中使用foreach - 沒有工作,與while循環外部相同。

的$默認的陣列是這樣的:

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

你沒有設置'$ group_id'。試試'$ selected =(is_array($ default)&& in_array($ row ['group_id'],$ default))? 'selected =「選擇」':'';'而是。 – DCoder

+0

您的解決方案奏效!謝謝。你能否發表你的評論作爲答案,以便我可以接受它? – Aborted

回答

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。相反,您應該瞭解準備好的聲明並使用PDOMySQLi。如果你在意學習,here is a quite good PDO-related tutorial

+0

感謝您對mysql_函數的評論。我會記下你的話。 – Aborted

3

有幾個問題與您的代碼。

首先,函數將$exclude_id作爲一個參數,但忽略了論證,並給它分配:

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

其次,你說,這應該是一個多選,但你<SELECT>標籤不具有MULTIPLE屬性。

三,你在比較$row['group_id']$group_id。這隻允許一個默認值,而不是多個,而且你甚至不設置該變量(設置它的代碼已被註釋掉,但它只會將其設置爲$default數組的最後一個元素.DCoder的註釋看起來像。正確地解決了這個