Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 15.10.2020, 14:18
Новичок на форуме
Отправить личное сообщение для Oscillococcinum Посмотреть профиль Найти все сообщения от Oscillococcinum
 
Регистрация: 24.08.2020
Сообщений: 9

Разнесли в пух и прах Я только учусь, делаю это самостоятельно и для общего развития))

Последний вопрос, как передать в БД множественный выбор select, если вас не затруднит объяснить


document.getElementById('myForm').addEventListener('change', function(e) {
    let elm = [...e.currentTarget.elements],
        prt = elm[0].selectedIndex,
        set = 'Вы выбрали: ' + elm[0].options[prt].text;

    if(e.target == elm[0]) elm.slice(1).forEach(function(e, i) {
        e.style.display = i == prt - 1 ? 'block' : 'none'
    });

    [...elm[prt].options].forEach(function(e) {
        if(e.selected) set += '; ' + e.text
    });

    document.getElementById('selection').textContent = set;
});
Ответить с цитированием
  #12 (permalink)  
Старый 15.10.2020, 20:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,860

Сообщение от Oscillococcinum
Разнесли в пух и прах
Это не разнос, это "размышления - для чего база?"
Пусть вы решили в простом блокноте записывать события. Будем считать, что дата события, это его уникальный идентификатор. Если вы будет записывать в блокнот только даты, без описания самого события, сможете ли вы спустя время сказать, что за событие скрывается за каждой датой?

Сообщение от Oscillococcinum
передать в БД множественный выбор select
Список с множественным выбором, это массив данных под одним ключом (именем списка) на сервере. Код на клиенте к этому вопросу отношения не имеет, и даже можно сказать так - ни в коем случае не должен иметь. if(e.selected) set += '; ' + e.text - это строка на клиенте, показывающая пользователю, что выбрано им, в базу же такое не записывают. А вот как ... тут просто в лоб даже и не ответить.

То что я писал по базе, вроде бы и много написано, но если говорить в целом, то это малая толика и то обобщенная. И списки мной описанные будут выполнять свою роль только в идеальном случае, стоит в базе появится второй категории верхнего уровня и будут ошибки. Но я же не могу описывая только суть вещей писать все. Там описано ради того, чтобы понять - база, это "не склад", это архитектура хранящая в себе данные различных типов, структуры, а также связи между ними. И у вас должна быть такая архитектура базы, чтобы обеспечивать оптимальную работу приложения, то есть, клиент<--->сервер.

Хотите использовать базу, значит имейте базу какой она должна быть, а не "блокнот для пометок". И обязательно найти в сети и прочесть, что такое "нормализация баз данных", так как это понятие тесно связано с вашим вопросом. Если бы ваш вопрос был в рамках практического, имеющейся структуры базы, то можно ответить просто - два способа, в цикле запрос к базе помещаются в нее данные. Но реляционная база данных, которую вы хотите использовать, это сервер, и выполнять запись в нее множеством запросов к ней, это расточительно. А просто набор данных поместить в одну таблицу в SQL можно одним запросом, это она позволяет. Синтаксис такого запроса в упрощенном виде прост:

INSET INTO table_name (field) VALUES (value), (value), (value), ..., (value)


где - field, это имя поля таблицы, в которое производится запись, а value, значения элементов массива. Подготовленное таким образом тело запроса (строка) выполняется запросом к базе, и это будет один запрос к ней. Результатом этого запроса будет N строк записей в таблице.

Массив данных можно хранить в базе и в одном поле как строку представляющую собой JSON. Хотя не так давно MySQL и работает с таким типом данных, не стоит использовать этот тип для данных, например, значения которых используются как параметры выборки и т.п. Так как этим данным требуются предварительные преобразования, а это увеличивается и нагрузку, и время на обработку запроса. Таким набором удобно хранить, например, какие либо параметры конфигурации - запросили, извлекли, преобразовали, используем.

Не зная "контекст окружения" вашего вопроса сложно на него ответить. Здесь может быть только встречный вопрос - а что такое у вас массив данных, его назначение? Например, пользователь выбирает товар на странице, и выбрал несколько, поместив их в корзину. Это множественный выбор? Да. Это массив данных? Да. А как такой массив пишется в базу? Да просто, как выше было написано. Главное тут не механизм записи, а как эти записи хранят в базе.

Товары из корзины превратятся в заказ, а заказ, это покупатель, которые описываются в базе таблицей/набором таблиц. Товары в свою очередь также описаны в своей таблице/наборе таблиц. Заказы также имеют свою таблицу/набор таблиц. Если в таблице заказов писалось бы для покупателя Иванова, купившего халат, тапочки и полотенце:

Заказ №5, покупатель Иванов, адрес ...., тапочки, цена 200, количество 2 штука, итого 400
Заказ №5, покупатель Иванов, адрес ...., халат, цена 1500, количество 1 штука, итого 1500
Заказ №5, покупатель Иванов, адрес ...., полотенце, цена 340, количество 3 штука, итого 1020

это было бы очень расточительно. Поэтому, в таблицу заказов пишется только - его номер как уникальный идентификатор, идентификатор покупателя из таблицы покупателей, дата поступления заказа, статус заказа. С этой таблицей связана таблица товаров заказа, которая содержит номер заказа, идентификатор товара из таблицы товаров, количество товара. Сделав запрос по таблице заказов с вложенными подзапросами к связанным таблицам, можно получить всю информацию о заказе. И это и есть суть "нормализации баз данных".

Что из вышесказанного есть ответ на ваш вопрос? Вот и я не знаю как на него ответить, не понимая что за ним стоит.
Ответить с цитированием
  #13 (permalink)  
Старый 17.10.2020, 08:36
Новичок на форуме
Отправить личное сообщение для Oscillococcinum Посмотреть профиль Найти все сообщения от Oscillococcinum
 
Регистрация: 24.08.2020
Сообщений: 9

Спасибо за такое подробное объяснение. НО всё же... Допустим есть таблица "оборудование". В ней есть много колонок, нас интересуют только две: "Тип" и "Описание". Тип имеет моно-выбор, Описание - мульти. Код, который вы помогли мне составить выше - работает. Но заносит в колонку "Описание" только последний выбранный элемент, хотя я выбираю несколько. Как это исправить? Не на теории, а на практике, сам я не дойду

<style>
.second {
    display: none;
}
</style>

<form id="myForm">
    <select id="Dest" class="Validate_Required " name="Dest" aria-required="true">
        <option value="" disabled="" selected="selected">-</option>
        <option value="1">Оборудование 1</option>
        <option value="2">Оборудование 2</option>
        <option value="3">Оборудование 3</option>
        <option value="4">Оборудование 4</option>
    </select>
  
    <select class="second" size="3" multiple>
        <option value="0">1.1 текст</option>
        <option value="1">1.2 текст</option>
        <option value="2">1.3 текст</option>
    </select>
  
    <select class="second" size="3" multiple>
        <option value="0">2.1 текст</option>
        <option value="1">2.2 текст</option>
        <option value="2">2.3 текст</option>
    </select>

    <select class="second" size="3" multiple>
        <option value="0">3.1 текст</option>
        <option value="1">3.2 текст</option>
        <option value="2">3.3 текст</option>
    </select>
 
    <select class="second" size="3" multiple>
        <option value="0">4.1 текст</option>
        <option value="1">4.2 текст</option>
        <option value="2">4.3 текст</option>
    </select>
</form>

<div id="selection"></div>


<script>
document.getElementById('myForm').addEventListener('change', function(e) {
    let elm = [...e.currentTarget.elements],
        prt = elm[0].selectedIndex, 
        set = 'Вы выбрали: ' + elm[0].options[prt].text;
    
    elm.slice(1).forEach(function(e, i) {
        e.style.display = i == prt - 1 ? 'block' : 'none'    
    });
    
    [...elm[prt].options].forEach(function(e) {
        if(e.selected) set += '; ' + e.text
    });
    
    document.getElementById('selection').textContent = set;
});
</script>
Ответить с цитированием
  #14 (permalink)  
Старый 17.10.2020, 09:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,860

Я не знаю как еще вам объяснить, что такое база данных, так как то что вы пытаетесь в нее записать к базе может иметь опосредованное отношение, ибо такого что у вас списках база содержать не может.

Я уже писал, что данные списков, это: value - уникальный идентификатор в таблице базы, и значения 0 этот идентификатор не может иметь, текст опций - это текст у каждого уникального значения в таблице.

У вас куча списков, у которых одни и те же значения в опциях, да еще и равные 0. Ни один из списков не имеет имени, и как это, и с чем связано в базе, кроме вас и всевышнего не знает. Поля формы не имеющие имен на сервер не отправляются, то есть, отправление вашей формы, это получение сервером только списка (его значения) name="Dest".

И я уже писал, что первичной задачей записи в базу является не сам механизм записи, он зачастую прост, а куда и по каким условиям пишутся данные.

Я не вижу в ваших списках ни связей, ни логики, и не понимаю чего вы вообще хотите, и что у вас там за база при этом, можно только догадываться. И что я вам еще могу сказать на очередной вопрос? Собственно нечего.
Ответить с цитированием
  #15 (permalink)  
Старый 17.10.2020, 12:22
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 720

Сообщение от Oscillococcinum
Допустим есть таблица "оборудование". В ней есть много колонок, нас интересуют только две: "Тип" и "Описание". Тип имеет моно-выбор, Описание - мульти.
Не понимаю, что такое моно и мульти выбор, применительно к столбцам (полям) таблицы. БД.
В таблице есть строки (записи). Каждая строка состоит из полей (столбцов). Каждое поле имеет тип (число, строка, дата...)
Ну и смысл какой то - что означает это поле (количество чего то, идентификатор чего то, название чего то...)
Вот определите - что содержится в поле "Тип". Что содержится в поле "Описание" (какого типа данные, как потом используются) Что означает строка этой таблицы - позиция заказа?
Ответить с цитированием
  #16 (permalink)  
Старый 21.10.2020, 16:12
Новичок на форуме
Отправить личное сообщение для Oscillococcinum Посмотреть профиль Найти все сообщения от Oscillococcinum
 
Регистрация: 24.08.2020
Сообщений: 9

Спасибо вам, что уделяете время на такие подробные разъяснения.

Сообщение от laimas Посмотреть сообщение
Не известно для чего это, но ранее выбранные опции в списках second не сбрасываются при изменениях в списке Dest.

А все таки интересно как сделать, чтобы ранее выбранные опции в списках second сбрасывались при изменениях в списке Dest?
Ответить с цитированием
  #17 (permalink)  
Старый 21.10.2020, 16:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,860

select.value = "", где select, список выбранные опции которого нужно сбросить.
Ответить с цитированием
  #18 (permalink)  
Старый 21.10.2020, 17:09
Новичок на форуме
Отправить личное сообщение для Oscillococcinum Посмотреть профиль Найти все сообщения от Oscillococcinum
 
Регистрация: 24.08.2020
Сообщений: 9

Сообщение от laimas Посмотреть сообщение
select.value = "", где select, список выбранные опции которого нужно сбросить.
Не совсем понял, где этот пункт прописать в JS, сможете подробней показать?
Ответить с цитированием
  #19 (permalink)  
Старый 21.10.2020, 17:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,860

Сообщение от Oscillococcinum
где этот пункт прописать в JS
Там, где выбирается список, который нужно сбросить. Что у вас выбирает список? Вот в этом событии и сбрасывайте.
Ответить с цитированием
  #20 (permalink)  
Старый 21.10.2020, 17:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,860

Oscillococcinum,
или это продолжение о списках изначально показанных и коде обработчике их изменения, что я писал? Тогда просто замените эту строку кода в нем:

e.style.display = i == prt - 1 ? 'block' : 'none';

на

if(i == prt - 1) e.style.display = 'block';
        else {
            e.value = '';
            e.style.display = 'none';
        }
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить из Select все имеющиеся option finlolo Элементы интерфейса 4 14.11.2018 10:04
Подскажите как отобразить текст. potkin Общие вопросы Javascript 17 26.10.2017 16:09
Как создать цитатник? WGN Общие вопросы Javascript 10 29.01.2017 01:39
Как отфильтровать таблицу по select? miusov jQuery 1 16.09.2016 12:50
Как отобразить данные из базы на форме? ascherbakov AJAX и COMET 2 12.03.2014 14:55