Я создаю страницу учетной записи клиента, которая отображает соответствующую информацию в базе данных и позволяет клиентам редактировать их информацию. Приведенный ниже код извлекает и отображает информацию учетной записи клиента из базы данных и предварительно выбирает значения, соответствующие их информации, но так как существует несколько сотен элементов выбора и / или мультиселектов, которые я хотел бы создать функцию, которая проверит, будет ли db value (т.е. $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>
Изменить – код немного отличается для элементов мультиселектора. За именами элементов следуют квадратные скобки (т. Е. implode(',', $_POST['notifications'])
name="notifications[]"
) , а значения вставляются в базу данных в виде вложенных массивов implode(',', $_POST['notifications'])
. Эти запятые затем $row1 = str_replace(',', '', $row);
значений, чтобы правильно сравнить их с значениями параметра $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>
Однажды я столкнулся с одной проблемой и решил ее, создав функцию (или статический метод класса) для обработки списков опций.
Чтобы распечатать свои параметры, вам все равно придется циклически перебирать их, поэтому во время цикла нет ничего плохого в проверке каждого из них, если он должен быть выбран в текущий момент.
Просто создайте такую функцию, как:
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>
Трюк передает выбранные значения в виде массива ключей вместо одного ключа. В образце я предоставил фиктивные массивы, но, очевидно, вам придется строить свои данные из базы данных … 🙂
EDIT: выберите multi с массивами, взятыми из вопроса …
<?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>
EDIT: взорвать несколько выбранных значений
Если у вас есть mutliple выбранные значения в виде строки, разделенной запятой, вам просто нужно взорвать ее, прежде чем перейти к предоставленной мне функции …
$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>
Вы можете использовать такую функцию, чтобы упростить ее:
<?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>
Используйте более простой метод:
<?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 ''; } }
Нет ничего плохого в том, что у вас есть, и это, или что-то очень похожее, является типичным подходом к этой проблеме.
Вы могли бы / могли бы обернуть его в фактическую функцию, например print_select( $array, $selected );
который / мог бы распечатать весь <select>
включая сам выбор.
Конечным кодом может быть:
print_select( $gifts, $selected_gift ); print_select( $colors, $selected_color ); // etc