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