2013-02-13 42 views
3

我正在創建一個客戶賬戶頁面,該頁面在數據庫中顯示相關信息並允許客戶編輯其信息。下面的代碼從數據庫中檢索並顯示客戶的帳戶信息,並預先選擇與其信息匹配的值,但由於有幾百個select和/或multiselect元素,我想創建一個函數來檢查db值(即$rows['gift_privacy']與當前選項相符。檢查分貝值是否與當前選擇選項相匹配的函數

<?php 
try { 
$stmt = $conn->prepare("SELECT * FROM customer_info WHERE user_id = :user_id"); 
$stmt->bindValue(':user_id', $user_id); 
$stmt->execute(); 
}catch(PDOException $e) {echo $e->getMessage();} 
$row = $stmt->fetch(); 
?> 
<form action="account_information-exec.php" method="post"> 
<select name="gift_privacy"> 
    <option value="Standard" <?php if($row['gift_privacy']=='Standard') echo "selected='selected'"; ?>>Standard</option> 
    <option value="Gift_ID_Req" <?php if($row['gift_privacy']=='Gift_ID_Req') echo "selected='selected'"; ?>>Require program ID</option> 
    <option value="Not_Enrolled" <?php if($row['gift_privacy']=='Not_Enrolled') echo "selected='selected'"; ?>>Do not enroll</option> 
</select> 
<input type="submit" value="submit"> 
</form> 

編輯 -該代碼用於多選元件略有不同。元素名稱後面跟着方括號(即name="notifications[]",並將值作爲內插陣列implode(',', $_POST['notifications'])插入到數據庫中。這些逗號,然後從讀取值,以便正確比較它們的選項的值$row1 = str_replace(',', '', $row);

現有功能

此功能適用selected="selected"到正確的選項,但它是太麻煩爲我有這麼使用剝離很多元素,我不知道如何修改代碼,以便它可以很容易地應用到所有選擇和/或多選元素。此外,由於該頁面當前使用具有硬編碼選項的標準選擇元素,我希望有一個解決方案不需要爲每個元素創建數組。

<select name="gift_privacy"> 
    <?php 
    $gifts = array("Standard" => "Standard", "Gift_ID_Req" => "Require Program ID", "Not_Enrolled" => "Do not Enroll"); 
    $gift = $row['gift_privacy']; 
    foreach($gifts as $key => $value) { 
    if($key == $gift) { 
     echo '<option selected="selected" value="'. $key .'">'. $value .'</option>'; 
    } else { 
     echo '<option value="'. $key .'">'. $value .'</option>'; 
    } 
    } 
    ?> 
</select> 
+0

這是一個問題或答案:P? – AmazingDreams 2013-02-13 07:53:16

+0

@AmazingDreams - 我認爲這是對希望得到充分研究的問題的讚揚; -D – 2013-02-13 08:31:42

+0

您是否將數據庫中的所有「選擇」選項都放在了某處或類似位置?如果沒有,我會建議它有很多選項,然後讓你的數組從數據庫中拉出來進行檢查。這將簡化您的整個項目,特別是如果選擇選項在多個頁面上。 ^^ – Jon 2013-02-13 08:46:01

回答

2

我曾經面臨過同樣的問題,並通過創建一個功能解決了這個問題(或一個類的靜態方法)來處理我的選項列表。

要打印出您的選項,您將不得不循環瀏覽它們,因此當您循環時,檢查每個選項是否爲當前選定的選項並沒有什麼不好。

只需創建像一個函數:

function printSelectOptions($dataArray, $currentSelection) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 

給予$dataArray爲您的鍵/值選項陣列,並$currentSelection爲所選擇的選項的關鍵。

因此,在你的代碼,你將有隻是調用這個函數,如:

<select id='mySelect' name='mySelect'> 
    <?php echo printSelectOptions($gifts, $gift); ?> 
</select> 

這應該做的工作!

EDIT:添加樣品與選擇多個工作...

<?php 
$options = array( 1 => "Test 1", 
        2 => "Test 2", 
        3 => "Test 3"); 

$selected = array(1, 3); 

function printSelectOptions($dataArray, $selectionArray) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (in_array($key, $selectionArray) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 
?> 

<select multiple> 
    <?php echo printSelectOptions($options, $selected); ?> 
</select> 

訣竅是通過所選擇的值作爲鍵的陣列,而不是一個單一的鍵。在樣品我提供虛擬陣列,但很明顯,你必須從數據庫建立你的... :)

編輯:選擇多從問題採取陣列...

<?php 
$gifts = array("Standard" => "Standard", "Gift_ID_Req" => "Require Program ID", "Not_Enrolled" => "Do not Enroll"); 
$gift = array($row['gift_privacy']); 

function printSelectOptions($dataArray, $selectionArray) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (in_array($key, $selectionArray) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 
?> 

<select multiple> 
    <?php echo printSelectOptions($gifts, $gift); ?> 
</select> 

編輯:爆炸多重選擇的值

如果你有選擇的值作爲逗號分隔字符串複式,你只需要傳遞給我提供的功能之前爆發,...

$selectedOptionsArray = explode(',', $selectedOptionsString); 

所以結束代碼看起來像...

<?php 
$gifts = array("Standard" => "Standard", "Gift_ID_Req" => "Require Program ID", "Not_Enrolled" => "Do not Enroll"); 
$gift = explode(',', $row['gift_privacy']); 

function printSelectOptions($dataArray, $selectionArray) { 
    foreach ($dataArray as $key => $value) { 
     echo '<option ' . (in_array($key, $selectionArray) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>'; 
    } 
} 
?> 

<select multiple> 
    <?php echo printSelectOptions($gifts, $gift); ?> 
</select> 
+0

這工作:-D雖然我目前不使用數組選擇元素。有沒有辦法使用這個功能與標準選擇元素的選項是硬編碼? – 2013-02-13 08:29:19

+2

不乾淨...我建議花費一點努力,首先製作鍵/值數組,然後通過不要強制重寫由打印機函數處理的選項標籤,以這種方式寫下更少的代碼。 .. :) – Frhay 2013-02-13 08:44:34

+0

這將需要幾個小時,但我認爲它可能會使一些其他組件更容易一旦完成:-) – 2013-02-13 17:07:58

0

使用更簡單的方法:

<?php 
echo '<option '.($key == $gift ? 'selected="selected" ' : '').'value="'. $key .'">'. $value .'</option>'; 
?> 

編輯:第二個選項

echo '<option '.selected_option($key, $gift).'value="'. $key .'">'. $value .'</option>'; 

function selected_option($val1, $val2){ 
    if($val1 == $val2){ 
    return 'selected="selected" '; 
    }else{ 
    return ''; 
    } 
} 
+0

我不確定這是否需要額外的代碼來聲明函數等等。你介意包含代碼的其餘部分嗎? – 2013-02-13 08:41:05

-1

沒有什麼錯,你所擁有的,而這一點,或非常類似的東西是典型的做法這個問題。

你可能會將它包裝在一個實際的功能中,比如print_select($array, $selected);,它可以打印出包括選擇自己在內的整個<select>

最後的代碼可能是:

print_select($gifts, $selected_gift); 
print_select($colors, $selected_color); 
// etc 
+0

我包含的函數的工作,但正如我所解釋的,這對我來說太繁瑣了,因此我試圖創建一個函數來處理頁面上的每個Select元素 – 2013-02-13 09:06:57

1

你可以使用這樣的函數簡化它:

<?php 
function renderOption($key, $value, $current) { 
    echo '<option value="' . $key . '"' . ($key == $current ? ' selected="selected"' : '') . '>' . $value. '</option>'; 
} 
?> 

<select name="gift_privacy"> 
    <?php 
    $gifts = array("Standard" => "Standard", "Gift_ID_Req" => "Require Program ID", "Not_Enrolled" => "Do not Enroll"); 
    $gift = $row['gift_privacy']; 
    foreach($gifts as $key => $value) 
     renderOption($key, $value, $gift); 
    ?> 
</select> 
+0

第二行給了我一個錯誤消息「解析錯誤:語法錯誤,意外')'」,但我能夠通過使用它的語法@Frhay來代替它。雖然我目前沒有使用Select元素的數組。有沒有辦法使用這個功能與標準選擇元素的選項是硬編碼? – 2013-02-13 08:38:09

+1

我想他錯過了三元論中的第三個陳述,如果...編輯... :) – Frhay 2013-02-13 09:17:16

+0

謝謝Frhay你是對的 - 愚蠢的錯字!現在修好。 – Manachi 2013-02-13 13:20:57

相關問題