3

我正在创建一个客户帐户页面,该页面显示数据库中的相关信息并允许客户编辑他们的信息。下面的代码从数据库中检索并显示客户的帐户信息,并预先选择与他们的信息匹配的值,但是由于有几百个选择和/或多选元素,我想创建一个函数来检查数据库是否value (ie $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> 
4

4 回答 4

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>

这应该做的工作!

编辑:添加示例以使用选择多个...

<?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>
于 2013-02-13T08:06:45.860 回答
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>
于 2013-02-13T08:01:43.913 回答
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 '';
  }
 }
于 2013-02-13T07:58:07.787 回答
-1

你所拥有的没有任何问题,这个或非常相似的东西是解决这个问题的典型方法。

你会/可以将它包装在一个实际的函数中,说它print_select( $array, $selected );会/可以打印出整个函数,<select>包括选择本身。

最终代码可能是:

print_select( $gifts, $selected_gift );
print_select( $colors, $selected_color );
// etc
于 2013-02-13T07:59:13.233 回答