Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как получить данные из селекта (https://javascript.ru/forum/dom-window/56001-kak-poluchit-dannye-iz-selekta.html)

laimas 26.05.2015 09:19

Цитата:

Сообщение от makalet
laimas, в смысле, определяться? Если на вывод данных, то по имени селекта. Если я понял правильно

Список на странице, это всего лишь элемент для выбора. Но он что пассивен для сервера или же как принадлежащий форме будет отправлен на сервер? А если будет отправлен, то сервер получит выбранное в нем значение. А у вас значения опций списка, это $Manufacture, но не ID. Так как же поймет сервер при получении формы что выбрано? Поэтому еще раз вопрос - что определят товар в вашей базе, какое поле?

makalet 26.05.2015 09:28

laimas, скорее всего ID должен определять товар. Я передавал $Manufacture и $Model для того, чтобы записать в другую таблицу. Затем сделаю распечатку чека на выбранные комплектующие. Если я передам ID, то получу в поле только ID, но как записать вместо этого айди соответствующий товар с ID, который находится в таблице с товарами(например, процессоров).
У меня сборка для комплектации находится в другой таблице. Там поля типа процессор, кулер и т.д. Вот я и хочу записать значение всех селектов в столбцы

kostyanet 26.05.2015 09:32

Цитата:

Сообщение от laimas
что определят товар

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

Профтыкать в равенство where все пары какие имеются и получишь ту самую единственную строку.

Для расширения мышления: работа через id всего лишь вариант оптимизации и повышения эффективности. Для отождествления записи в таблице никакие ID нахер не нужны. Без них все отождестволяется нормально как и предусмотрено идеей SQL.

kostyanet 26.05.2015 09:36

Цитата:

Сообщение от makalet
Если я передам ID, то получу в поле только ID, но как записать вместо этого айди соответствующий товар с ID, который находится в таблице с товарами(например, процессоров).

Еще один забрел не на тот форум. Вам на sql.ru сперва, а потом уже ява-скрипты...

makalet 26.05.2015 09:41

kostyanet, возможно. Ещё надо учиться, учиться, учиться. Да, у меня ужасный, отвратительный, гнилой и т.п. код, но для меня задача остается актуальной. Картинки, цена выбранного товара я получаю. Остается скрывать ИЗНАЧАЛЬНО цену и картинку до тех пор, пока не будет выбран товар в селекте.

kostyanet 26.05.2015 09:44

Вы не собираетесь учиться, вам надо домучить свою бредятину чтобы она завтра работала, а что будет послезавтра - о том думать нация не велит. А послезавтра у вас будет не 6 id в дата-тегах, а 66, а после-после-завтра 666 и так далее. Единственная надежда что завтра и тем более послезавтра не наступят никогда и только день сурка ваша надежда.

laimas 26.05.2015 09:46

Цитата:

Сообщение от makalet
скорее всего ID должен определять товар.

Не скорее всего, а именно ОН! А значит список должен формироваться таким:
<select class='chosen' id='chosenmak' name='maker' >
      <option value="" value='' data-price=''>-- Выбрать --</option>
<?php
foreach ($arr_get as $value)  echo '<option data-price="'.$value['Price'].'" data-image="'.PATH_IMAGE.$value['photo'].'" value="'.$value['ID'].'">'.$value['Manufacture']." ".$value['Model'].'</option>';
?>
      </select>

Откуда берется $Manufacture не понятно, если она определена ранее, еще ладно, но по уму, если это значение определяется полем другой sql-таблицы (У меня сборка для комплектации находится в другой таблице. Там поля типа процессор, кулер и т.д.), а не той что запросом вернула $arr_get, то все параметры товара $value['ID'] должны получаться вложенным запросом к этой (этим) таблице.

PATH_IMAGE - константа определяющая путь к фото товаров, а $value['photo'] должно быть только именем фото в базе, иначе при необходимости изменения структуры каталогов придется все переписывать в базе.

При получении формы выбранное значение списка будет определять ID выбранного товара, по которому уже запросами к базе можно всегда получить его параметры из таблицы и связанных таблиц. А атрибуты data опций хранящие эти параметры для клиентского скрипта.

PS. Именно так строка должна формироваться, ибо в вашем коде ошибки в конструкции echo. И пробелы лишние ни к чему.

laimas 26.05.2015 09:48

Цитата:

Сообщение от kostyanet
Узость мышления детектед. Без всяких ключей можно получить нужный кортеж имея все необходимые параметры на входе.

Кыш из под ног, а то на хвост еще наступлю, будешь на таблетки работать. Бабушку свою учи несмышленыш. Несешь понос и даже не понимаешь сам, что это бред.

kostyanet 26.05.2015 09:57

Идея SQL заключается в хранении данных без номеров строк и смещений - в отношениях, которые имеют именованные параметры типа имя-значение. То есть хранится все х знает как, а выбирается то, что нужно и в том виде и в том порядке, которые определены в сценарии запроса. Применение числовых идентификаторов не более чем, идентификатором может быть любое отношение если его значение уникально для таблицы. Достаточно сделать unique key на поле скажем prod_name и prod_name может служить идентификатором, поскольку драйвер вам не даст завести 2 одинаковых имени продукта.

Однако что такое одинаковое имя для компа и для человека? Например для человека это одно и то же

RF(GL) 6532091
RF (GL) 6532091

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

makalet 26.05.2015 10:01

laimas, отдельное спасибо за демонстрацию примера, с помощью которого не надо было создавать мне $ID = $value['ID'] и т.д.
Но как теперь скрывать ИЗНАЧАЛЬНО цену и картинку до тех пор, пока не будет выбран товар в селекте.

laimas 26.05.2015 10:04

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

laimas 26.05.2015 10:06

Цитата:

Сообщение от makalet
Но как теперь скрывать ИЗНАЧАЛЬНО цену и картинку до тех пор, пока не будет выбран товар в селекте.

Не выводить их на страницу, а помещать в ячейки таблицы при выборе в списке. Как впрочем и производить расчет суммы за выбранное.

kostyanet 26.05.2015 10:08

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

Если, допустим идентификатором служит уникальное число, то получив это число мы получим все остальные отношения какие только могут быть.

Нет никакого смысла повсюду сопровождать уникальное отношение - кучей других отношений того же кортежа, потому что по уникальному мы в любой момент получаем какие угодно кортежи.

Ну блин что там изобретать. Что сохраняется в куках когда юзер нажимает заказать? - количество. Количество дает юзер. Минимум 1 штука. Это ввод юзера, мы его сохраняем и приделываем индентификатор - количество чего. Все, больше там ничего не надо в минимуме. Еще можно сохранить дату или цену - типа сделать снимок цены, но поскольку куки легко подделать, оно не имеет значения. Для правовых вопросов заказ должен быть сделан после регистрации которая подразумевает согласие с условиями предоставления услуг и забирает персональные данные.

Тогда как мы покажем всю тряхомудию о заказанном товаре? Блин, ну а как мы ее показываем на продуктовой странице по единственному идентификатору? Все то же самое.

kostyanet 26.05.2015 10:14

Цитата:

Сообщение от laimas
если в базе определен первичный ключ,

Да потому вы конопатите читателям мозг. Ничего там не определяется в скуль таблице, никакие товары. Нет такой терминологии вообще.

Ваши фантазии работают только там, где ЗАРАНЕЕ определены ограничители. Например заведено отношение значение которого сам драйвер меняет при создании записи. Если таких ограничителе нет - ваши опредения по определению ничего не определяют.

То есть рассказывая небылицы про SQL вы низводите эту сказку до были массивов. Типа бд это такой массив, где всегда есть за что зацепиться. Х нанэ. Пока сам не сделаешь зарубки - не за что. Таков принцип.

kostyanet 26.05.2015 10:17

Цитата:

Сообщение от makalet
не надо было создавать мне $ID = $value['ID']

Можете сэкономить на букафках раскидав строку по переменным

extract($row);
/*
теперь все ваши id-шмады существуют как переменные
*/
echo $id; /* вывели то, что было в $row['id'] */

makalet 26.05.2015 10:23

Цитата:

Сообщение от laimas (Сообщение 372385)
Не выводить их на страницу, а помещать в ячейки таблицы при выборе в списке. Как впрочем и производить расчет суммы за выбранное.

Вот с этим у меня и проблемы. Для этого надо JS:(
kostyanet, спасибо. Будем знать!

kostyanet 26.05.2015 10:23

Цитата:

Сообщение от makalet
Но как теперь скрывать ИЗНАЧАЛЬНО цену и картинку до тех пор, пока не будет выбран товар в селекте.

Тогда это будет интерфейс произвольного доступа. Изначально все и так скрыто, в css. Открывается по щелчку. А чтобы закрыть что было откртыто надо либо пробежаться в цикле по всему что открыто и закрыть перед тем как открыть щелкнутое; либо завести контрольную переменную в которой будет хранится ссылка на последнюю открытую.

Геморрой, короче, бесполезный.

kostyanet 26.05.2015 10:26

Цитата:

Сообщение от makalet
Вот с этим у меня и проблемы. Для этого надо JS

Это не js, еще раз. Это - DOM. Надо знать что заселектить и куда сунуть в какой элемент модели документа, в какой конкретно div скажем или в table.

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

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

kostyanet 26.05.2015 10:30

Ладно, пусть мучается, это у нас национальное.

makalet 26.05.2015 10:33

kostyanet, я с DOM'ом уже работал. В первом посте была ссылка.
Но он большой. У меня же 6-8 селектов. Надо куча переменных создавать.
К сожалению, у меня бд не правильно скорее всего построена. Для процессоров я создал таблицу "процессоры", для кулеров - "Кулеры" и т.д.
Я в каждый селект вывожу данные из нужной мне таблицы.

laimas 26.05.2015 10:41

Цитата:

Сообщение от makalet
Вот с этим у меня и проблемы.

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>
</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> 
$(function() {
    $('#chosenmak').change(function() {
        if(!this.value) return;
        var e = $(this).children(':selected'), td = e.closest('tr').children();
        td.eq(0).html('<img src='+e.data('image')+'>');
        td.eq(1).text(e.text());
        td.eq(2).text(e.data('price'));
    })
});
</script>     
</head> 
<body>
<table id="prop" border=1 width=100%>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
            <select class="chosen" id="chosenmak" name="maker">
                <option value="">Выберите...</option>
                <option data-price="300" data-image="http://iconizer.net/files/Farm-fresh/orig/car_add.png" value="1">Модель 1</option>
                <option data-price="500" data-image="http://www.iconsearch.ru/uploads/icons/iconslandtransport/32x32/lorrygreen.png" value="2">Модель 2</option>
            </select>
        </td>
    </tr>
</table>
</body> 
</html>

makalet 26.05.2015 10:52

laimas, cпасибо! Работает. Последний вопрос:
Как обратно скрыть картинку и цену, если выбирается значение "Выбрать"
И как получить сумму, когда складывается 2+ селекта

laimas 26.05.2015 11:24

Как обратно скрыть картинку и цену, если выбирается значение "Выбрать"

Переписать строки 10, 11 примера так:
var e = $(this).children(':selected'), td = e.closest('tr').children().slice(0, 3);
        if(!this.value) {
            td.empty();
            return;   
        }

где второй параметр метода slice(0, 3) определяет число ячеек таблицы, которые надо очистить (то есть за минусом ячейки содержащей список).

И как получить сумму, когда складывается 2+ селекта

Я не знаю что означает "складывается 2+ селекта", что за селекты, что куда складываются....

makalet 26.05.2015 11:41

Цитата:

Сообщение от laimas (Сообщение 372407)
Как обратно скрыть картинку и цену, если выбирается значение "Выбрать"

Я не знаю что означает "складывается 2+ селекта", что за селекты, что куда складываются....

Ну в плане того, чтобы посчитать сумму стоимости.
http://jsfiddle.net/m9xra6pL/

laimas 26.05.2015 12:51

Ну тогда так id="chosenmak1" не стоит делать, если селекция будет по ID, то тогда лучше так "chosenmak-1", "chosenmak-2", ... так как нужно будет определить им один обработчик, и это будет так:

$('[id|=chosenmak]').change(function()...

Но если списки в одной таблице, то можно и без ID для списков:
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>
</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> 
$(function() {
    var tbl = $('#prop').find('select').change(function() {
        var e = $(this).children(':selected'), td = e.closest('tr').children().slice(0, 3), sum = 0;
        if(!this.value) td.empty();
        else {
            td.eq(0).html('<img src='+e.data('image')+'>');
            td.eq(1).text(e.text());
            td.eq(2).text(e.data('price'));
        }
        $.each(tbl.find('td:nth-child(3)'), function() {
            sum += this.innerHTML*1;
        })
        $('#total').text(sum);
    }).end();
});
</script>     
</head> 
<body>
<table id="prop" border=1 width=100%>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
            <select class="chosen" name="maker">
                <option value="">Выберите...</option>
                <option data-price="300" data-image="http://iconizer.net/files/Farm-fresh/orig/car_add.png" value="1">Модель 1</option>
                <option data-price="500" data-image="http://www.iconsearch.ru/uploads/icons/iconslandtransport/32x32/lorrygreen.png" value="2">Модель 2</option>
            </select>
        </td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
            <select class="chosen" name="maker">
                <option value="">Выберите...</option>
                <option data-price="300" data-image="http://iconizer.net/files/Farm-fresh/orig/car_add.png" value="1">Модель 1</option>
                <option data-price="500" data-image="http://www.iconsearch.ru/uploads/icons/iconslandtransport/32x32/lorrygreen.png" value="2">Модель 2</option>
            </select>
        </td>
    </tr>
</table>
<div id="total"></div>
</body> 
</html>

где значение 3 в nth-child(3) указывает на порядковый номер (не индекс в наборе!) элемента TD в своем родителе TR. В данном случае это ячейка содержащая цену.

Вот только как это понять, что у обоих списков одно и тоже имя? Ведь при отправке такой формы сервер получит значение последнего из списков. Чтобы получить значения обоих имена списков дожлны отражать массив - name="maker[]".

Но в этом случае возникает вопрос - почему один и тот же ключ (maker) имеет два набора? Ведь, если первый список, это одни товары, а второй, это другие товары, и имена списков одинаковы, то значения ID каждого списка должны быть уникальны.

Если они не уникальны, и каждый список это разные товары, то имена списков должны быть разные.

makalet 26.05.2015 12:58

laimas, да, вы верно подметили с maker, я забыл изменить на другое имя.
Вот мы получили нужные нам значение в td, а теперь как эти данные передать в таблицу?
Пишу так:
INSERT INTO Configuration SET `Processor` = ' ".$_POST['maker']."
а как передать стоимость и картинку - не понимаю.
В столбец Processor будут записываться данные вида : Тесттест, 200руб. Потом как-то надо это разделить, чтобы вывести данные для просмотра или редактирования

laimas 26.05.2015 13:06

а как передать стоимость и картинку - не понимаю.

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

Это кто клиенту отдавал:

echo '<option data-price="'.$value['Price'].'" data-image="'.PATH_IMAGE.$value['photo'].'" value="'.$value['ID'].'">'.$value['Manufacture']." ".$value['Model'].'</option>';

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

makalet 26.05.2015 13:12

laimas, подставляю ещё ".$value['Price']." или $_POST[$value['Price']] в INSERT, но пустоту записывает...
Аааа. Понял. Мы передали id, чтобы спарсить информацию( товара по айдишнику.
Но передается просто число. Это через GROUP BY или JOIN делается?

kostyanet 26.05.2015 13:19

Цитата:

Сообщение от makalet
В столбец Processor будут записываться данные вида : Тесттест, 200руб.

Я поцтулам. :-D В ява-скрипте оне не понимают.

makalet 26.05.2015 13:22

kostyanet, так я хотел запросом записать в столбец. Используя Insert, а перечислять параметры через запятую.
Иначе не знаю(

kostyanet 26.05.2015 13:27

Вот как делается

{"123":{"q":1,"p":37070},"126":{"q":1,"p":30600}," 186":{"q":4,"p":6920}}

это записывается в куку юзера. p это - price - чисто ритуальная фича, на случай если юзер заказал в пнд, а во вт ценник поменялся, а он начал оформлять, тогда ему скажут - чувак, с тех пор ценник поменялся, продолжать по новой цене или как?

q - quantity - количество. А без названия - тот самый id, который и в json - id.

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

kostyanet 26.05.2015 13:29

Цитата:

Сообщение от makalet
так я хотел запросом записать в столбец.

Блеа, это не екзель, тут не надо копипастить данные как в дебильном екзеле.

laimas 26.05.2015 13:34

Как же вы приложения пишите, если вообще не имеете представления о том, что же возвращает серверу форма?

Если опции этих списков, и пусть условно с именами maker1 и maker2, списка содержат ID товаров, и например будут выбрано у первого опция со значением 123, а у второго 200, то $_POST[] будет содержать:

Array (
[mker1] => 123,
[mker2] => 200
)

какие к черту $value['Price'] и иное, если они не являются значением свойства value опций списка? И еще раз повторить, что они серверу и нафик не нужны? Север получил главное - ID товаров, и если уж хранить этот выбор, то хранят ID и выбранное количество, все остальное зачем? Ведь получить цену и имя фото товара можно всегда запросом к таблице его описывающей:
$sql = 'SELECT price, photo FROM table_name WHERE id=' . (int)$_POST['maker1'];

Здесь $_POST['maker1'] - это для примера, ибо как уже говорил, записывать price, photo у товаров выбранных списками в какую-то таблицу нет никакого смысла. Надо получить где-то это и вывести, значит запрос к таблице, в которую вы пытаетесь "INSERT ...", получить в ней ID и количество сохраненные этим "INSERT ..." при получении формы, и в этом запросе вложенный JOIN к таблице получить table_name за получением их price, photo.

makalet 26.05.2015 13:36

kostyanet, я такое как-то сделаю, когда юзер самостоятельно будет собирать комплектующие: добавление в корзину и т.д
А это(с селектами) я делаю аля нажал на "оформить" и сразу получаешь расчетный лист (http://www.positive45.ru/print_form/list_r_k.php). Так нужно.

kostyanet 26.05.2015 13:41

Короче, харе тупить. Как пишутся телеги известно давным давно. Реализации могут быть разные, зеленые и красные, а принцип одинаков - в телеге сохраняется только выбор юзера, то есть данные которые он сам генерит своими действиями. Выбрал товар - это id товара, id может быть любым, обычно это - число. Задал количество - это количество. Получаем пару - ид-количество, для экономии места в куке сокращаем до и-к, кодируем вручную в свой колхозный протокол, или индустриально - на языке json (см выше).

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

insert into cart (user_id,prod_id,quantity) values($user_id,$post['id'],$post['q'])

И все. Теперь чтобы открыть телегу юзера запрашиваем

select * from cart where user_id = $user_id;

Но получим просто список идэх, толку мало, поэтому просто пихаем телегу как фильтр к обычному каталожному запросу, например

select prods.* from prods
left join cart
on cart.prod_id = prods.id
where cart.user_id = $user_id;

и все, у нас полный фарш с каталожной таблицы, но выбраны только те товары, которые есть в тележке зарегиного и аутентичного юзера.

kostyanet 26.05.2015 13:53

Цитата:

Сообщение от makalet
А это(с селектами) я делаю аля нажал на "оформить"

Я года два назад покупал у китаезов кое-какие вещи и с тех пор время от времени получаю мессаги типа "снижена цена на товары в вашем списке желаний". Это значит wish list сохранен с той ценой, которая была актуальна в момент добавления товара. То есть ценник можно сохранять как snapshoot, для применения в различных ситуевинах. Но не как цену товара по которой он сейчас продается. Актуальная цена всегда берется из выставленного счета, а счет выставляется или человеком в офисе, или на сайте из данных в таблице.

makalet 26.05.2015 13:55

kostyanet, cпасибо за разъяснение! Надо посмотреть на БД магазинов. Особенно с категориями (видеокарты, процессоры). Ведь у каждого товара в категории свои свойства: графическая частота у видеокарты, а у процессора нету вообще(как пример).
Потому что у меня такие таблицы: http://prntscr.com/79jgxf это для кулеров.
Не правильно же созданны?
"Актуальная цена всегда берется из выставленного счета, а счет выставляется или человеком в офисе, или на сайте из данных в таблице"
Верно. У меня админ меняет цену. Только так.

kostyanet 26.05.2015 13:57

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

kostyanet 26.05.2015 13:58

Цитата:

Сообщение от makalet
Надо посмотреть на БД магазинов.

Умора мля...

makalet 26.05.2015 14:01

Цитата:

Сообщение от kostyanet (Сообщение 372436)
Дальнейшее усложнение телеги вовлекает бухгалтерские сущности. В теории можно вести заказ по дате, но на практике делается еще одна таблица, в которую валятся сведения о самом заказе: оформили, отгрузили, сколько, чего, фактический адрес получателя, как платил, когда получил, когда отменил, когда закрыл и все такое. Это уже для магазов которые реально продают через сеть, выдают треки и в таком роде. Вашему все равно не светит.

Я делаю для локального пользования. Минимально функций!


Часовой пояс GMT +3, время: 13:23.