用于检查db值是否与当前Select选项匹配的函数

时间:2013-02-13 07:49:20

标签: php function select selected

我正在创建一个客户帐户页面,该页面在数据库中显示相关信息,并允许客户编辑他们的信息。下面的代码从数据库中检索并显示客户的帐户信息,并预先选择与其信息匹配的值,但由于有几百个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> 

4 个答案:

答案 0 :(得分: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>

这应该做的工作!

编辑:使用select multiple ...

添加样本
<?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>

答案 1 :(得分: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>

答案 2 :(得分: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 '';
  }
 }

答案 3 :(得分:-1)

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

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

最终代码可能是:

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