ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Интерактивный select без перезагрузки страницы

Интерактивный select без перезагрузки страницы

  • SHtoRM

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz 17 июня 2009 г. 16:01, спустя 18 дней 23 часа 18 минут

    Добрый день.
    У меня оба селекта работают с БД. Я переделал скрипт. Осталось пару нюансов.
    Как из основного файла взять переменную $_SESSION['user'] (она в sql запросе) ?
    И как сделать вывод второго селекта через переменную, как в примере через $html, чтоб второй селект появлялся сразу, а не при выборе значения в первом … в echo такое выражение я не знаю как запихнуть.
    Хотел сделать оба скрипта в одном, но почитав комментарии, где подобное обсуждалось, увидел, что будет необходимо отправлять заголовки в 1 файле. У меня уже отправлены заголовки сессии, подозреваю, что будет проблема.

    Вот код файла script.php

    <?
    require("JsHttpRequest.php");
    $JsHttpRequest=new JsHttpRequest("windows-1251");

    include_once "options.php";

    global $SERVER, $USER, $PASSWD, $DB;
    if (!mysql_connect($SERVER,$USER,$PASSWD)){
    ?>
    <center><h1>Ошибка сервера MySQL. MySQL server error</h1></center>
    </div></body></html>
    <?
    exit;
    }
    mysql_select_db($DB);
    ?>
    <select name="scar" size="1">
    <option value="">Выбрать</option>
    <?
    $nc=mysql_query("SELECT DISTINCT `navto`.`id`, `navto`.`anum`, `navto`.`sern` FROM `groups`, `navto`, `users` WHERE `users`.`u_name` = '".$_SESSION['user']."' AND `users`.`u_group` = `groups`.`id_group` AND `groups`.`id_navto` = `navto`.`id` AND `groups`.`id_map` = (SELECT `id` FROM `maps` WHERE `map` = '".$_REQUEST['smap']."')");
    echo mysql_error();
    for ($i=0; $i<mysql_num_rows($nc); $i++){
    $resc=mysql_fetch_array($nc);
    echo"<option value='$resc[sern]'"; if (($_POST['scar']) == ($resc[sern]))echo " selected"; echo"> $resc[anum]</option>";
    }
    ?>
    </select>


    Спасибо.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 17 июня 2009 г. 22:35, спустя 6 часов 34 минуты 49 секунд


    У меня оба селекта работают с БД. Я переделал скрипт. Осталось пару нюансов.

    Какого селекта? Как понять "работают"? Примеры.


    Как из основного файла взять переменную $_SESSION['user'] (она в sql запросе) ?

    А что за основной файл? Название файла и его код.


    И как сделать вывод второго селекта через переменную, как в примере через $html, чтоб второй селект появлялся сразу, а не при выборе значения в первом … в echo такое выражение я не знаю как запихнуть.

    Покажи что именно не получается и как ты делал


    Хотел сделать оба скрипта в одном, но почитав комментарии, где подобное обсуждалось, увидел, что будет необходимо отправлять заголовки в 1 файле. У меня уже отправлены заголовки сессии, подозреваю, что будет проблема.

    Да, будет проблема
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • SHtoRM

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz 18 июня 2009 г. 10:19, спустя 11 часов 43 минуты 11 секунд


    Какого селекта? Как понять "работают"? Примеры.

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


    А что за основной файл? Название файла и его код.

    Файл с формой, где и будут отображаться оба селекта. Код … врядли имеет смысл его тут приводить. Я просто постараюсь лучше объяснить, что требуется. На данный момент всё работает, но в файле script.php (код в моём прошлом посте), во втором селекте, sql-запрос ничего не возвращает, т.к. в нём есть переменная из первого, основного файла.
    Чтобы запрос возвращал значения из БД, мне нужно кроме значения первого селекта (которое передаётся java-скриптом) как-то передать второму файлу (script.php) значение php-переменной, которая была создана в первом, основном файле (в данном случае это имя пользователя, переменная $_SESSION['user'] в запросе). Понимаете ?
    Я просто javascript почти не знаю…
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 10:22, спустя 3 минуты 15 секунд



    Какого селекта? Как понять "работают"? Примеры.

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


    1. Селект - это html <select>?
    2. Проблема в чем? Сначала опиши первый, а потом второй и опиши проблему. Покажи примеры код первого и второго "селектов"

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 10:24, спустя 2 минуты 27 секунд



    А что за основной файл? Название файла и его код.

    Файл с формой, где и будут отображаться оба селекта. Код … врядли имеет смысл его тут приводить. Я просто постараюсь лучше объяснить, что требуется. На данный момент всё работает, но в файле script.php (код в моём прошлом посте), во втором селекте, sql-запрос ничего не возвращает, т.к. в нём есть переменная из первого, основного файла.
    Чтобы запрос возвращал значения из БД, мне нужно кроме значения первого селекта (которое передаётся java-скриптом) как-то передать второму файлу (script.php) значение php-переменной, которая была создана в первом, основном файле (в данном случае это имя пользователя, переменная $_SESSION['user'] в запросе). Понимаете ?
    Я просто javascript почти не знаю…


    Храни $_SEESION['user'] в <input type="hidden" name="user_id" />
    и при передаче второму бекенду передавай этот парамтр
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • SHtoRM

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz 18 июня 2009 г. 10:37, спустя 12 минут 33 секунды


    1. Селект - это html <select>?

    Да


    Храни $_SEESION['user'] в <input type="hidden" name="user_id" />
    и при передаче второму бекенду передавай этот парамтр

    Я вчера так и пытался делать, но у меня не получилось =(  Надо браться за javascript …
    Если не трудно, приведите код, как при этом будет выглядеть функция

    function doload(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
    req.open(null,"select2.php",true);
    req.send({smap:value});
    }

    если мы будем передавать значение из <input type="hidden" name="user_id" />
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 10:42, спустя 5 минут 28 секунд

    Создай сначала строку в html

    <input type="hidden" name="user_id" id="user_id" />


    Потом в коде:

    function doload(value){
    var req=new JsHttpRequest();
    var userId = document.getElementById('user_id').value;
    req.onreadystatechange=function() {
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;
    }
    req.open(null,"select2.php",true);
    req.send({
    smap:value,
    user_id:userId
    });
    }
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 10:43, спустя 40 секунд

    а в select2.php принимай user_id и формируй результат
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • SHtoRM

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz 18 июня 2009 г. 11:16, спустя 33 минуты 22 секунды

    Спасибо огромное, всё работает.

    А как сделать так, чтобы были сразу видны оба селекта (<select>) ? У нас сейчас есть один, по событию onChange появляется второй. Мне нужно, чтобы сразу были видны оба, но второй, естественно, пустой, без значений, пока мы не выберем что-нить в первом. А когда мы уже выбрали значения в обоих селектах и отправили форму (форма отправляется не на другой файл, а на этот же), нужно чтобы второй селект был уже со значениями. Как на автомобильных сайтах. Мы выбираем марку машины, в следующем селекте - модель и т.д., нажимаем поиск. Нам выводят результаты поиска, а форма с селектами остаётся в прежнем состоянии.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 13:21, спустя 2 часа 5 минут 8 секунд

    так создай второй селект, пустой
    а потом заменяй его на подгруженный

    второй способ - изменять значения <option> через javascript

    Похожая тема: http://pyha.ru/forum/topic/433.0
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • SHtoRM

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz 18 июня 2009 г. 15:08, спустя 1 час 46 минут 21 секунду

    Спасибо, придумал как сделать проще.
    Сразу правда второй селект не отображается, но после отправки формы он есть и своё значение сохраняет, это главное.
    Я добавил ещё 1 скрытый инпут, в который записывается значение нашего второго селекта, которое пришло при отправке формы ($_POST['scar']), а в тег body добавил условие

    if (isset($_POST['scar']))echo"onload='doload(mform.smap.value)'";

    также добавил значение этой переменной в функию javascript, так как вы показывали, чтобы в файле select2.php можно было вставить условие

    if (($_REQUEST['h_scar']) == ($resc['sern']))echo " selected";


    Всё работает =)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 июня 2009 г. 15:27, спустя 18 минут 50 секунд

    Костыли костылями?) Когда придешь в себя, садись за js :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • GRAFLEKX

    Сообщения: 7 Репутация: N Группа: Кто попало

    Spritz 27 июля 2009 г. 12:34, спустя 38 дней 21 час 7 минут

    Интересная темка. А вот как точно такой же эфект реализовать на Prototype.js, не подскажете?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 июля 2009 г. 13:22, спустя 48 минут 8 секунд

    GRAFLEKX, а зачем?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • GRAFLEKX

    Сообщения: 7 Репутация: N Группа: Кто попало

    Spritz 27 июля 2009 г. 13:37, спустя 15 минут 7 секунд


    GRAFLEKX, а зачем?

    Да проблема в том, что при использовании этих библиотек (из примера) у меня перестал работать Prototype.
    Искал ответ на форуме Котерова, но там все об этом нюансе пишут, и так и не пофиксили.
    Этот пример идеален, нужно при выборе в селект подгрузить данные из другого файла, короче все тоже самое как в примере, но на Prototype.
    А вот как это сделать - туплю по полной. Если есть возможность, помогите пожалуйста.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!