#php #mysql #mysqli #bootstrap-modal #datalist
#php #mysql #mysqli #bootstrap-модальный #datalist
Вопрос:
Я не хочу, чтобы меня кормили кодом с ложечки, чтобы решить мою проблему. Я нуб, как это ни смешно. Может быть, просто подталкивание в правильном направлении или критика, что угодно. Я создаю этот проект для РАЗВЛЕЧЕНИЯ. Это не для работы, учебы или чего-либо, за что мне платят. Пожалуйста, будьте осторожны, если мой вопрос кажется вам очевидным.
-Веб-страница имеет несколько модалов, которые открываются, когда пользователь нажимает на определенные части веб-страницы.
-Один из всплывающих модалов начальной загрузки показывает область для информации о «поставщике». Этот модал работает правильно. Поле состояния (состояние, как в штате Теннесси) отображается в отфильтрованном datalist, извлеченном из базы данных mysql с помощью php-кода! У-у-у!!! —-Рис. #1 (состояние поставщика) … Я буквально не могу публиковать изображения, потому что у меня недостаточно репутации.
https://i.postimg.cc/NfD2xRKy/state-field.png
Пока все отлично!!
После закрытия начальной модальности я открываю другую модальность. Проблема возникает, когда это второе / отдельное модальное всплывающее поле состояния (Теннесси и т. Д.) Не Имеет отфильтрованного списка. Первый модальный был для адреса поставщика, а этот второй модальный будет для адреса пациента.
-Я пытаюсь извлечь данные о состоянии (Теннесси и т. Д.) Из той же таблицы базы данных (буквально так же, как работает 1-й модальный). К сожалению, фильтр datalist не работает с этим вторым модальным. Я не получаю никаких ошибок, фильтр буквально просто не отображается, когда я нажимаю в поле состояния. —-Рис. #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.
ctrl k
ваш друг для форматирования кода. Просто к вашему сведению2. Может быть полезно просмотреть исходный код, сгенерированный тем, который не работает. Он вообще что-нибудь производит? Возможно, у вас нет данных для его создания, проблема с запросом и т. Д…
Ответ №1:
Если я правильно понял вопрос, это то, что я бы сделал:
Разорвите зависимость от БД, по сути, вы пытаетесь сделать слишком много с этим одним фрагментом кода.
Сначала создайте общую функцию, подобную этой, для создания вашего HTML. Эта функция должна принимать идентификатор поля и массив опций, которые содержат значение и содержимое тега option .
Что-то вроде этого:
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, но если вы не работаете с 10 тысячами строк, я сомневаюсь, что вы это заметите. К тому времени, когда вы заметите проблемы с производительностью из-за этого, вы будете больше беспокоиться о времени запросов.
Даже если у вас есть существующий массив с кучей «мусора» в нем.
$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_key . При необходимости может быть предоставлен index_key для индексации значений в возвращаемом массиве значениями из столбца index_key входного массива.
Последний совет, и это вопрос удобства использования. Возможно, стоит сделать «содержимое» таким образом:
while($row = mysqli_fetch_array($resultSeventeen)){
$options[$row['stateValue']] = $row['stateValue'].' - '.$row['stateName'];
}
//result ['MI'=> 'MI - Michigan]
Таким образом, когда пользователь вводит MI
или CA
и т. Д. он будет эффективно искать по значению, но все равно покажет им полное имя. Это то, что я использовал и с такими вещами, как месяцы. [1=>'1 - January']
и т.д… Но, конечно, эта часть полностью зависит от вас. Я просто думаю, что это немного облегчает жизнь пользователю.
Лето
Прямо сейчас у вас есть 2 части «simular» кода. Разве не было бы неплохо иметь только один, тогда вы знаете, что это работает. Он отлично справляется со своей задачей, и поэтому вы можете сосредоточить свое внимание на других частях приложения. Если это не сработает, вы будете достаточно уверены, что ошибка лежит в другом месте, поэтому отладка будет проще и т.д…
Это просто хорошая практика для создания функций, которые делают что-то одно, хорошо. Не процедурный код, который плохо выполняет многие вещи и является беспорядком для отладки. Затем, когда вы захотите создать больше Datalists, даже из несвязанных данных, вам никогда не придется снова прикасаться к этому коду. Это просто работает.
Надеюсь, это поможет вам.
Комментарии:
1. Я буквально понятия не имел, что существует функция с именем createDataList … lol, я собираюсь проверить ваш массив прямо сейчас. Большое вам спасибо за вашу помощь. Я поддержал ваш ответ, но в нем говорилось, что моя репутация слишком низкая, чтобы быть публично признанной или что-то в этом роде. Например, тикер не перешел к одному, но вы получили репутацию.
2.
I literally had no idea there was a function called createDataList
— не было сказано, что я это изобрел. Вы тоже можете создать его….3. Бум! … и вот так, ты гений. 🙂 Большое спасибо за ваше объяснение. Мне еще многому нужно научиться, но PHP, безусловно, самый забавный язык на данный момент. Лучший ответ, который был нажат!
4. Я занимаюсь PHP около 11 лет, изучил его в 2008 году, получил свою первую профессиональную работу в 2010 году (после того, как я получил своих партнеров). Раньше я занимался автомобильным производством. Но я много возился с программированием, таким как Flash Actionscript, Director Lingo (мигает забытый брат, когда он еще был macromeda), Моддинг для различных игр и т. Д… Я также художник с классическим образованием, птицу в моем профиле я сделал вручную в Photoshop. В любом случае, рад, что смог помочь. Программирование — прекрасный способ выразить креативность. Моя работа заключается в буквальном преобразовании 0 в 1.