Datalist извлекает данные из одной конкретной таблицы базы данных [mysql] с кодом [php], но только первые <option></option> фактически извлекают данные - PullRequest
1 голос
/ 11 апреля 2019

Я не , и мне кажется, что мне нужно кормить код ложкой, чтобы решить мою проблему.Я нуб, как смешно.Может быть, просто толчок в правильном направлении или критика, что угодно.Я создаю этот проект для удовольствия.Это не для работы, школы или чего-либо другого, за что мне платят.Пожалуйста, будьте осторожны, если мой вопрос кажется вам очевидным.

-Веб-страница имеет несколько модалов, которые открываются, когда пользователь нажимает на определенные части веб-страницы.

-Одним из всплывающих модов начальной загрузки-up показывает область для информации о "провайдере".Этот модал работает правильно.Поле состояния (штат, как в штате Теннесси) отображается в отфильтрованном списке данных, извлеченном из базы данных mysql через php-код!Woo Hoo!---- Рис # 1 (состояние провайдера) ... Я буквально не могу публиковать изображения, потому что мне не хватает повторений.

https://i.postimg.cc/NfD2xRKy/state-field.png

Пока все отлично!

После того, как начальный модал закрыт, я открываю другой модал.Проблема возникает, когда у этого второго / отдельного модального всплывающего поля состояния (Теннесси и т. Д.) Нет фильтрованного списка.Первый модал был для адреса поставщика, а второй модал - для адреса пациента.

-Я пытаюсь получить данные о состоянии (Теннесси и т. Д.) Из одной и той же таблицы базы данных (буквально так же, как работает 1-й модал).К сожалению, фильтр списка данных не работает на этом втором модале.Я не получаю никаких ошибок, фильтр буквально никогда не появляется, когда я нажимаю в поле состояния.---- Рис # 2 (состояние пациента)

https://i.postimg.cc/mD4Tq6qT/state-field-two.png

Мне удалось обойтись путем дублирования таблицы в моей базе данных и простоназвал новую таблицу "17_state_Pay_To".Второй модал буквально работает таким образом, но зачем мне дублировать таблицу базы данных, чтобы она работала правильно?---- Рис. 3 (обход базы данных)

https://i.postimg.cc/P5f36bK0/database-pic.png

Нужно ли создавать / дублировать таблицу каждый раз, когда я хочу извлечь из одной и той же таблицы ту же таблицу?страница интернета?Я собираюсь использовать государство еще раз на этой же веб-странице.Это кажется утомительным, и то, как я это делаю, возможно, неправильно.

Это код для 1-го (рабочего) модала:
<datalist id="box2c2"> <?php while($row = mysqli_fetch_array($resultEleven)){ ?> <option value="<?php echo $row['stateValue']; ?>"><?php echo $row['stateName']; ?></option> <?php } ?> </datalist>

Это код для 2-го без рабочегоок. Это означает, что этот модал не тянет из дублированного стола, он тянет из того же стола, что и 1-й (рабочий) стол.Единственная строка, которая отличается от описанной выше, это первая строка:
<datalist id="box5c2"> <?php while($row = mysqli_fetch_array($resultEleven)){ ?> <option value="<?php echo $row['stateValue']; ?>"><?php echo $row['stateName']; ?></option> <?php } ?> </datalist>

Для обхода второго модального режима я изменил только эту строку кода, чтобы извлечь ее из дублированной таблицы:
<?php while($row = mysqli_fetch_array($resultSeventeen)){ ?>

Опишите ожидаемые и фактические результаты: Я хотел бы получить данные о состоянии из той же таблицы базы данных без необходимости дублирования таблицы.

Я не знаю, что еще здесь поместить ... Надеюсь, этого достаточно.

1 Ответ

0 голосов
/ 11 апреля 2019

Если я правильно понял вопрос, я бы поступил так:

Прервите зависимость от БД, в основном вы пытаетесь сделать слишком много с этим одним фрагментом кода.

Сначала создайте обобщенную функцию, подобную этой, для создания своего HTML. Эта функция должна принимать идентификатор поля и массив опций, которые содержат значение и содержимое тега опции.

Примерно так:

function createDataList($id, array $options){
   $html = ['<datalist id="'.$id.'">'];

   foreach($options as $value=>$content){ ?>
        $html[] = '<option value="'.$value.'">'.$content.'</option>';
   } 

   $html[] = '</datalist>';

   return implode("\n", $options);
}

Тогда, когда вам нужно его использовать, вы можете передать массив следующим образом:

 //the "value" should be unique so we can use that for the key,
 //then the other is what I like to call the "content"
 // [value=>content, value=>content]

 $options= ['foo'=>'This is foo', ...];
 echo createDataList('test', $options);

Ожидаемый результат:

 <datalist id="test">
 <option value="foo">This is foo</option>
 ...
 </datalist>

Приятно то, что вы можете получить этот массив из любого места. Вы можете сделать это вручную, вы можете сделать это из БД. Например:

$options= [];
while($row = mysqli_fetch_array($resultEleven)){ 
     $options[$row['stateValue']] = $row['stateName'];
}

echo createDataList('box2c2', $options);

А для второго:

$options= [];
while($row = mysqli_fetch_array($resultSeventeen)){ 
     $options[$row['stateValue']] = $row['stateName'];
}

echo createDataList('box5c2', $options);

Итак, вы видите, что это дает вам гораздо большую гибкость и намного меньше дублирования.

Конечно, вам придется циклически перебирать данные 2x вместо 1x, но если вы не разберетесь с десятками тысяч строк, я сомневаюсь, что вы заметите это. К тому времени, когда вы заметите проблемы с производительностью, вы будете больше беспокоиться о количестве запросов.

Даже если у вас есть существующий массив с кучей «мусора» в нем.

  $array = [['stateValue'=>'MI','stateName'=>'Michigan'], [...]];

Вы можете использовать это для быстрого форматирования.

  $data = array_column($array, 'stateValue', 'stateName');
  //result: ['MI' => 'Michigan', ...]

array_column ( array $ input , mixed $ column_key [, mixed $ index_key = NULL] )

Возвращает значения из одного столбца ввода, идентифицируемого ключом column_. По желанию может быть предоставлен ключ index_key для индексации значений в возвращенном массиве по значениям из столбца index_key входного массива.

https://www.php.net/manual/en/function.array-column.php

Последний совет, и это удобство использования. Может быть, стоит сделать «контент» следующим образом:

while($row = mysqli_fetch_array($resultSeventeen)){ 
     $options[$row['stateValue']] = $row['stateValue'].' - '.$row['stateName'];
}

//result ['MI'=> 'MI - Michigan]

Таким образом, когда пользователь вводит MI или CA и т. Д., Он будет эффективно искать значение, но по-прежнему будет отображать полное имя. Это то, что я использовал с такими вещами, как месяцы тоже. [1=>'1 - January'] и т.д ... Но, конечно, эта часть полностью зависит от вас. Я просто думаю, что это немного облегчает жизнь пользователю.

Summery

Прямо сейчас у вас есть 2 фрагмента "симуляционного" кода. Разве не было бы хорошо иметь только один, тогда вы знаете, что это работает. Он отлично справляется со своей задачей, и вы можете сосредоточить свое внимание на других частях приложения. Если это не сработает, вы будете достаточно уверены, что ошибка кроется в другом месте, поэтому отладка будет проще и т. Д. *

Это просто хорошая практика, делать функции, которые делают одно, хорошо. Не процедурный код, который делает много вещей плохо и является бесполезным для отладки. Тогда, когда вы хотите создать больше Datalists, даже из несвязанных данных, вам никогда не придется снова касаться этого кода. Это просто работает.

Надеюсь, это поможет вам.

...