За последние 24 часа нас посетил 16231 программист и 1666 роботов. Сейчас ищут 935 программистов ...

Проблема обновления многоуровнего списка.

Тема в разделе "PHP для новичков", создана пользователем Мачу Пикчу, 12 июл 2007.

  1. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Помогите! Не обновляются списки!

    1. Выбираю регион (поле со списком1), ищутся в базе районы этого региона. Выбираю район(поле со списком 2), ищутся в базе города этого района. Выбираю город (поле со списком3) , ищутся улицы этого города. Выбираю улицу (поле со списком 4). Все работает нормально.

    2. Выбираю другой регион, поле 2 с районами автоматически обновляется, а поля 3 и 4 остаются неизменными со старыми значениями ранее выбранного региона. До тех пор, пока я не выберу значение из 2-го и из третьего полей. Как сделать так, чтобы после выбора региона, третье и четвертое поля со списком обновлялись и пополнялись значениями нового выбранного региона?

    В чем может быть ошибка? Если несложно, пришлите сови примеры многоуровневых списков.

    Спасибо!
     
  2. phil

    phil Активный пользователь

    С нами с:
    4 апр 2007
    Сообщения:
    62
    Симпатии:
    0
    Выкладывай JS
     
  3. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Это написано на PHP :)
     
  4. pel

    pel Активный пользователь

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    :)


    Или у вас после каждого выбора происходит сабмит страницы, и там уже формируются измененные select'ы?

    P.$. вообще для того, чтоб сделать выбранным изначально какой-то элемент селекта делаем:
    HTML:
    1.  
    2. <select name="qqq">
    3.     <option value=1>Опшн вэлью рас</option>
    4.     <option value=2 selected>Опшн вэлью двас</option>
    5.     <option value=3>Опшн вэлью трис</option>
    6.  
    Например, при формировании списка значениями из базы (на РНР)) делаем
    PHP:
    1. <?php
    2. ...
    3. $current_rayon = 5; // из УРЛ'а, напр., получили
    4.  
    5. $query = "SELECT * FROM `table`";
    6. $result = mysql_query($query);
    7. while ($line = mysql_fetch_assoc($result)) {
    8.     $sel = ($line['id'] == $current_rayon) ? 'selected' : '';
    9.     print '<option value='.$line['id'].' '.$sel.'>;
    10. }
    11. ...
    12. ?>
     
  5. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Да, после каждого выбора происходит сабмит страницы
     
  6. pel

    pel Активный пользователь

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    а как сделали, чтоб первое и второе обновлялись? Эти - так же ;)
    код давайте
     
  7. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Собственно, сам скрипт. Еще раз о проблеме. Если выбрать другой регион, то обновляется список районов, а список городов не обновляется до тех пор, пока район новый не выбрн. А мне нужно, чтобы при выборе другого региона список городов соответсвовал этому региону. В общем, третий день голову ломаю :)
    PHP:
    1.  
    2. <?php
    3.  
    4.  echo "<form method=post>";
    5.  
    6.   // Формируем список регионов
    7.  
    8.   $query_reg = "SELECT * FROM regions
    9.            ORDER BY name";
    10.   $reg = mysql_query($query_reg);
    11.   if(!$reg) exit(mysql_error());
    12.   // Если имеется хотя бы одна запись
    13.   // формируем выпадающий список
    14.   if(mysql_num_rows($reg) > 0)
    15.   {
    16.     echo "<select name=code_region onchange='this.form.submit()'>";
    17.     echo "<option value=0>--регион--</option>";
    18.     while($region = mysql_fetch_array($reg))
    19.     {
    20.       if($_POST['code_region'] == $region['code_region'])
    21.       {
    22.         $selected = "selected";
    23.       }
    24.       else $selected = "";
    25.       echo "<option value=$region[code_region] $selected>
    26.                    $region[name], ($region[socr])</option>";
    27.     }
    28.     echo "</select>";
    29.   }
    30.  
    31.     // Формируем список районов
    32.     $query_raioni = "SELECT * FROM raioni
    33.              WHERE code_region = $_POST[code_region]
    34.              ORDER BY name";
    35.     $rai = mysql_query($query_raioni);
    36.     if(!$rai) exit(mysql_error());
    37.  
    38.     if(mysql_num_rows($rai) > 0)
    39.     {
    40.       echo "<select name=code_raion onchange='this.form.submit()'>";
    41.       echo "<option value=0>--район--</option>";
    42.       while($raioni = mysql_fetch_array($rai))
    43.      {
    44.       if($_POST['code_raion'] == $raioni['code_raion'])
    45.       {
    46.         $selected = "selected";
    47.       }
    48.       else $selected = "";
    49.       echo "<option value=$raioni[code_raion] $selected>
    50.                    $raioni[name], ($raioni[socr])</option>";
    51.     }
    52.       echo "</select>";
    53.     }
    54.  //    Формируем список городов
    55. if  ($_POST['code_region'] > 0 and $_POST['code_raion'] > 0)
    56.           $query_goroda = "SELECT * FROM goroda
    57.           WHERE code_raion = $_POST[code_raion]
    58.           ORDER BY name";
    59. else        $query_goroda = "SELECT * FROM goroda
    60.              WHERE code_region = $_POST[code_region]
    61.              ORDER BY name";
    62.                          
    63.     $gor = mysql_query($query_goroda);
    64.     if(!$gor) exit(mysql_error());
    65.     // Если у района есть города, то формируем список городов
    66.    
    67.     if(mysql_num_rows($gor) > 0)
    68.     {
    69.       echo "<select name=code_gorod onchange='this.form.submit()'>";
    70.       echo "<option value=0>--город--</option>";
    71.       while($goroda = mysql_fetch_array($gor))
    72.      {
    73.       if($_POST['code_gorod'] == $goroda['code_gorod'])
    74.      {
    75.         $selected = "selected";
    76.       }
    77.       else $selected = "";
    78.       echo "<option value=$goroda[code_gorod] $selected>
    79.                    $goroda[name], ($goroda[socr])</option>";
    80.     }
    81.       echo "</select>";
    82.     }
    83.  echo "</form>";
    84. ?>
    85.  
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    проверяй чему равен если выбран регион. скорее всего чему-то >0, то есть уже выбран.


    - вынеси $_POST за пределы алгоритма, то есть в начале все переменные $code_region=mysql_real_escape_string($_POST['code_region']);
    - все равно закавычивай переменные в запросе.
    - сделай хотя бы
     
  9. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    1. Переменные вынес в начало и отразил это в алгоритме, но все осталось по прежднему:
    $code_region=mysql_real_escape_string($_POST['code_region']);
    $code_raion=mysql_real_escape_string($_POST['code_raion']);
    $code_gorod=mysql_real_escape_string($_POST['code_gorod']);

    2. Не до конца понял, в строке "<select name=code_region onchange='document.getElementById('raisel').options[0].selected=true;this.form.submit()'>" что такое 'raisel'?

    3.echo "<select id='raisel' name=code_raion onchange='this.form.submit()'>";
    эту строку вместо уже существующей какой-то написать, или добавить к существующим? И, не могли бы вы объяснить, где добавлять более точно это строку?
     
  10. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    истина, если оба селекта выбраны.
    при выборе региона селект районов остается выбранным, поэтому запускается именно этот вариант, и ведется поиск по тому же району.
    надо его сбрасывать (выбор района) при выборе другого региона.
    что означает
    понятно?
    надо перед этим действием предварительно сбросить выбор района.
    Чтобы найти селект с районами надо дать ему какой-то ИД по которому искать (не советую по именам).
    теперь мы можем найти селект с районами и ставим у него выбранным нулевой вариант.
     
  11. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Т. е. примерно так?
    PHP:
    1.  
    2. // Формируем список регионов
    3.  
    4.   $query_reg = "SELECT * FROM regions
    5.            ORDER BY name";
    6.   $reg = mysql_query($query_reg);
    7.   if(!$reg) exit(mysql_error());
    8.   // Если имеется хотя бы одна запись
    9.   // формируем выпадающий список
    10.   if(mysql_num_rows($reg) > 0)
    11.   {
    12.     //echo "<select name=code_region onchange='this.form.submit()'>";
    13.     echo "<select name=code_region onchange='document.getElementById('raisel').options[0].selected=true;this.form.submit()'>"
    14.     echo "<option value=0>--регион--</option>";
    15.     while($region = mysql_fetch_array($reg))
    16.     {
    17.       if($_POST['code_region'] == $region['code_region'])
    18.       {
    19.         $selected = "selected";
    20.       }
    21.       else $selected = "";
    22.       echo "<option value=$region[code_region] $selected>
    23.                    $region[name], ($region[socr])</option>";
    24.     }
    25.     echo "</select>";
    26.   }
    27.  
    28.       // Формируем список районов
    29.     $query_raioni = "SELECT * FROM raioni
    30.              WHERE code_region = $_POST[code_region]
    31.              ORDER BY name";
    32.     $rai = mysql_query($query_raioni);
    33.     if(!$rai) exit(mysql_error());
    34.  
    35.     if(mysql_num_rows($rai) > 0)
    36.     {
    37.       echo "<select id=raisel name=code_raion onchange='this.form.submit()'>";
    38.       echo "<option value=0>--район--</option>";
    39.       while($raioni = mysql_fetch_array($rai))
    40.      {
    41.       if($_POST['code_raion'] == $raioni['code_raion'])
    42.       {
    43.         $selected = "selected";
    44.       }
    45.       else $selected = "";
    46.       echo "<option value=$raioni[code_raion] $selected>
    47.                    $raioni[name], ($raioni[socr])</option>";
    48.     }
    49.       echo "</select>";
    50.     }
    51.  
     
  12. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    я в блоке выбора региона заменил строку:
    echo "<select name=code_region onchange='this.form.submit()'>";

    на строку:
    echo "<select name=code_region onchange='document.getElementById('raisel').options[0].selected=true;this.form.submit()'>";

    а в блоке выбора района заменил строку:
    echo "<select name=code_raion onchange='this.form.submit()'>";

    на строку:
    echo "<select id=raisel name=code_raion onchange='this.form.submit()'>";

    При выборе региона выбирается соотв. район и город, но если выбираю другой регион, то, список районов вообще не обновляется. В чем же теперь дело???
     
  13. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    люди, что вы делаете ?
    Передавай методом post значения и присваивай им selected в случае истины
     
  14. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    В этом то вся и проблема, что если список двухуровневый, то работает без проблем, а если уровней больше, то $_POST сохраняет значения, в результате чего, автоматически списки начиная с третьего уровня не обновляются. Мне, вроде, подсказывают что делать, но либо я не там строку подставляю, либо что-то еще нужно.
     
  15. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Просто смотри что у тебя в посте оказывается и что поэтому выполняется.
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';
     
  16. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Я это уже понял. Да, сохраняется район в $_POST, когда регионы обновляешь, только, вот, выйти из этой ситуации не получается. Я подставляю в регион echo "<select name=code_region onchange='document.getElementById('raisel').options[0].selected=true;this.form.submit()'>"; а в район, там где селект id=raisel (алгоритм выше измененный описал). Список регионов отображается, можно выбрать регион, но теперь последующий выбор района не происходит. Может еще что-то надо добавить? Кстати, echo "<select name=code_region onchange='document.getElementById('raisel').options[0].selected=true;this.form.submit()'>"; писать именно с echo или без? Просто, как дополнительная строка к существующему селекту, которая обнуляет район?
     
  17. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Лезем на танк
    php выполняется на сервере.
    там мы формируем строчки для ХТМЛ.
    и командой echo отсылаем их в выходной поток.
    клиент их принимает как обычный html файл.
    смотрим внимательно
    1) какие переменные мы получили в массив пост и их значения.
    2) какие варианты кода у нас выполняются в зависимости от них и правильно ли это работает.
    3) что и как мы выводим и правильно ли это работает.

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

    Если код тщательно проверили и ошибок не нашли, смотрим браузер -> исходный код странички, а что же мы на самом деле прислали.

    в этом примере мы пытаемся обнулить ид района при смене региона еще на клиенте с помошью JS. Это выполняется?
     
  18. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    Видимо я не указал на странице начало и окончание JS, так как с ним еще не сталкивался :) А без JS из этой ситуации можно выйти? Мне важно, чтобы когда пользователь открывал страницу не требовалось бы устанавливать доп. фичи в виде JVM...
     
  19. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    не надо искать лишних сущностей, ничего больше указывать и ставить не надо.
    ошибку я уже явно указал, исправь ее сам.
    И последовательно иди по цепочке - что происходит и правильно ли ты делаешь. Иначе за тебя и пирожки есть надо.
     
  20. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    $raisel="raisel"

    echo "<select id=$raisel name=code_raion onchange='this.form.submit()'>";

    echo "<select name=code_region onchange='document.getElementById($raisel).options[0].selected=true;this.form.submit()'>";

    так что ли? (я про кавычки) :)
     
  21. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    нет. фтыкай на тему конкатенации строк и экранирования кавычек. Смотри на результат, а не на меня.
     
  22. Мачу Пикчу

    Мачу Пикчу Активный пользователь

    С нами с:
    24 май 2007
    Сообщения:
    64
    Симпатии:
    0
    В том то и дело, что результат только вечером смогу посмотреть, так как сейчас на работе, а работа у меня совсем другая - не интернет программная :))) Поэтому и гадаю :))) Так, почитаю сейчас про конкатенацию... :)))
     
  23. udodirc

    udodirc Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    111
    Симпатии:
    0
    сделал как сдесь было сказано, но проблема когда я выбираю второй селект, появляется третий селект, а вото второй пропадает, в чем дело?