Intereting Posts
Отображение данных из массивов в динамической таблице PHP Меню эха опций показывает как «%» Не найдено ни одного результата для запроса, хотя ожидалась хотя бы одна строка для каждого цикла в javascript с данными json Как полностью отключить кнопку «Назад» браузера при онлайн-экзамене? Как преобразовать preg_replace e в preg_replace_callback? Арабские символы в декодировании JSON Игнорировать пользователя Abort, игнорируется PHP? Рекомендуемое разрешение изображения не установлено Не удалось получить доступ к контейнеру Symfony2 в контроллере, расширяющем Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller Неподдерживаемый драйвер в laravel 4 при использовании пакета laravel-oci8 Как загрузить файл с его оригинальным именем вместо уникального имени? Дизайн базы данных для хранения шаблона цвета изображения в MySQL для поиска изображения по цвету Как получить заголовок страницы HTML с помощью php? Расположение заголовка в новой вкладке

Функция, чтобы проверить, соответствует ли значение db текущей опции выбора

Я создаю страницу учетной записи клиента, которая отображает соответствующую информацию в базе данных и позволяет клиентам редактировать их информацию. Приведенный ниже код извлекает и отображает информацию учетной записи клиента из базы данных и предварительно выбирает значения, соответствующие их информации, но так как существует несколько сотен элементов выбора и / или мультиселектов, которые я хотел бы создать функцию, которая проверит, будет ли 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