Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сохранить выбор в select (https://javascript.ru/forum/misc/54814-kak-sokhranit-vybor-v-select.html)

user_name 01.04.2015 21:23

Как сохранить выбор в select
 
Делаю профиль пользователя. есть три селекта для выбора дня рождения. день, месяц и год. После отправки на сервер дата сохраняется в БД. Как сделать что бы выборка этих селектов навсегда осталась на этой странице или пока пользователь не выберет другую дату?. То есть выборка всегда должна соответствовать дате из БД.

laimas 01.04.2015 21:36

Регистированным пользователя при выводе списка на стороне сервера это не сложно сделать, иначе или куки или локальное хранилище.

user_name 01.04.2015 21:57

Цитата:

Сообщение от laimas (Сообщение 364514)
Регистированным пользователя при выводе списка на стороне сервера это не сложно сделать, иначе или куки или локальное хранилище.

Нет куки и лх не подойдут. Профиль естественно для авторизованных пользователей. Подскажи те как сделать.

laimas 01.04.2015 22:36

А как вы делаете выборку и выводите списки?

user_name 01.04.2015 22:51

<select id="id_birthdate_month">
			<option value="01">Январь</option>
			<option value="02">Февраль</option>
                        #...
		</select>

При выборе всех списков/инпутов жму кнопку сохранить. Собираю все данные из списков и инпутов аяксом отправляю на сервер и сохраняю в БД. В инпуты в тег value подставляю переменную со значением из БД в результате всегда будет выводится нужно значение. Так же нужно сделать для списков. Что бы не сбивалось.

laimas 01.04.2015 23:01

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

Я спрашивал о том, как вы делаете выборку в базе и как сервер формирует эти списки. У вас дата рождения храниться в базе, и надо полагать в поле типа DATE. Думаю знаете и как из даты средствами SQL можно получить день, месяц, год. А получив эти составляющие даты рождения пользователя, не сложно их сравнить со значениями формируемых списков, и указать опциям равным дате рождения пользователя selected.

Ну а новый выбор, так это значит запрос к базе и обновление или лучше INSERT c ON DUPLICATE KEY UPDATE.

user_name 01.04.2015 23:11

Цитата:

Сообщение от laimas (Сообщение 364535)
А получив эти составляющие даты рождения пользователя, не сложно их сравнить со значениями формируемых списков, и указать опциям равным дате рождения пользователя selected.

Для каждой опции делать проверку? Этих опций у меня очень много. Если было бы всего пара опций то да. А так у меня их около ста получается, с годами.

laimas 01.04.2015 23:15

А что у пользователя бывает сто дат рождения? :)
А если речь о 100 опциях и трудности, значит вы не верно делаете вывод списков. Покажите код, как вы это делаете, и выборку из базы.

user_name 01.04.2015 23:21

да, я о ста опциях. Дак я их в ручную написал.

user_name 01.04.2015 23:28

а что бы вы поняли как я делаю выборку мне придется еще скинуть большой класс для работы с БД. Я просто беру выбранное значение (через js по id например #id_select option:selected) и отправляю на сервер там просто обновляю поля в БД с этим значением.

laimas 02.04.2015 00:12

В этом ваша и ошибка, если вручную. Циклом такие вещи надо выводить. Коли выборки о пользователе я так и не увидел, то абстрактный пример:
//если выборка о пользователе возвращает из поля DATE день, месяц и год, то работаем с этими данными
//если нет, и возвращает дату как YYYY-MM-DD, то получаем из даты нужные компоненты средствами РНР
$time  = strtotime($row['date']); //где $row['date'] - дата рождения из базы
$year  = date('Y', $time);
$month = date('n', $time); 
$day   = date('j', $time);
//месяц и день без ведущих нулей, так как они совсем не нужны в списках
//ибо полученную дату для нашей локалицации как d.m.YYYY можно всегда привести к формату SQL
//$date = date('Y-m-d', strtotime('3.5.2000')); //получим корректный формат даты для SQL, 
//если вернет false или дату UNIX, значит клиент прислал лажу

//но лучше сразу SQL запросом вернуть компоненты

//выводим списки
$select_year  = '<select name="year"><option value="">Выберите год...</option>';
$select_month = '<select name="month"><option value="">Выберите месяц...</option>';
$select_day   = '<select name="day"><option value="">Выберите дату...</option>';
//цикл по количеству лет
$start = $k = 1950;
$end = date('Y') - 18; //последний год с учетом минимального возраста
while($start <= $end) {
    $n = $start-$k+1; 
    if($n < 13) $select_month .= '<option value='.$n.' '.($n == $month ? 'selected' : null).'>'.$n.'</option>';
    if($n < 32) $select_day   .= '<option value='.$n.' '.($n == $day ? 'selected' : null).'>'.$n.'</option>';
    $select_year   .= '<option value='.$start.' '.($start == $year ? 'selected' : null).'>'.$start.'</option>';
    $start++;
}
$select_year  .= '</select>';
$select_month .= '</select>';
$select_day   .= '</select>';
echo $select_day, $select_month, $select_year;


>через js по id например #id_select option:selected

Во первых первый опшен должен быть пуст, так как ставить минимальную дату, месяц и год по умолчанию, это плохо, можно их по ошибке и запулить на сервер. Поэтому нужно проверять выбран ли опшен (значение не пустое). А значение списка и возвращает значение выбранной опции, так что option:selected в данном случае совсем не требуется.

user_name 02.04.2015 00:39

laimas, Спасибо большое, очень помог :)

laimas 02.04.2015 09:37

Дополнить надо:
$start = $k = $end - 60; //минус желаемый возраст пользователей, который в любом случае не должен быть менее 31, иначе могут быть только феврали


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