Ниспадающий список и MySql

Discussion in 'PHP' started by svesve, 12 Jan 2009.

  1. svesve

    svesve Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    568
    Likes Received:
    86
    Reputations:
    11
    Есть 2 ниспадающих списка
    1. список выводит список отделов организации (делается запрос к бд и выводим инфу)
    2. список ДОЛЖЕН выводить должности конкретного выбранного отдела..... как это можно релизовать?
    тобишь я кликаю в первом списке на отдел формируется запрос к базе с id отдела и выводится из бд список должностей во второй ниспадающий список
     
  2. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Красивей всего будет если сделать через AJAX
     
    1 person likes this.
  3. svesve

    svesve Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    568
    Likes Received:
    86
    Reputations:
    11
    с аяксом глухо как в танке =(
    есть примеры похожих реализаций?
     
  4. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Напишу небольшой пример, если никто не опередит :)
     
  5. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Так-с, ну вроде, работает. Будут проблемы, пиши

    PHP:
    <?

      
    $countries = array('Россия''США''Германия');
      
    $cities = array(array('Москва''Тверь''Уфа'), array('Нью-Йорк''Сан-Франциско''Бостон'), array('Берлин''Гамбург'));

      if (isset(
    $_GET['do']) && $_GET['do'] === 'getcities')
        {
          
    $cid intval($_GET['cid']);
          echo 
    '<option value="-1">Выберите город...'."\n";
          for (
    $i 0$i count($cities[$cid]); $i++)
            echo 
    '<option value="'.$i.'">'.$cities[$cid][$i]."\n";
          exit;
        }

    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    <body>

      <script>
        function GetXmlHttpObject()
        {
          var objXMLHttp=null;
          if (window.XMLHttpRequest)
            {
              objXMLHttp=new XMLHttpRequest();
            }
          else
            if (window.ActiveXObject)
              {
                objXMLHttp=new ActiveXObject('Microsoft.XMLHTTP');
              }
            return objXMLHttp;
        }
        
        function OnChangeCountry()
        {
          if (xmlHttp.readyState == 4 || xmlHttp.readyState == 'complete')
            {
              forma.city.innerHTML = xmlHttp.responseText;
              forma.city.disabled = false;
            }
        }
      
        function ChangeCountry()
        {
          cid = forma.country.value;
          if (cid == -1)
            {
              forma.city.disabled = true;
            }
          else
            {
              xmlHttp = GetXmlHttpObject();
              url = "/test.php?do=getcities&cid=" + cid;
              xmlHttp.onreadystatechange = OnChangeCountry;
              xmlHttp.open("GET", url, true);
              xmlHttp.send(null);
            }
        }
      </script>

      <form name="forma" method="post">
        <select name="country" onchange="ChangeCountry()">
          <option value="-1">Выберите страну...
          <?
            
    for ($i 0$i count($countries); $i++)
              echo 
    '<option value="'.$i.'">'.$countries[$i]."\n";
          
    ?>
        </select>
        <select name="city" disabled>
          <option value="-1">Выберите город...
        </select>
      </form>
    </body>
    </html>
     
    2 people like this.
  6. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Борода в IE. Он не хочет innerHTML в select пихать. Пришлось сделать через DOM. Не совсем красиво, но мысль ты должен уловить:

    PHP:
    <?

      
    $countries = array('Россия''США''Германия');
      
    $cities = array(array('Москва''Тверь''Уфа'), array('Нью-Йорк''Сан-Франциско''Бостон'), array('Берлин''Гамбург'));

      if (isset(
    $_GET['do']) && $_GET['do'] === 'getcities')
        {
          
    $cid intval($_GET['cid']);
          echo 
    '-1;Выберите город...'."\n";
          for (
    $i 0$i count($cities[$cid]); $i++)
            {
              echo 
    $i.';'.$cities[$cid][$i];
              if (
    $i count($cities[$cid]) - 1) echo "\n";
            }
          exit;
        }

    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    <body>

      <script>
        function GetXmlHttpObject()
        {
          var objXMLHttp=null;
          if (window.XMLHttpRequest)
            {
              objXMLHttp=new XMLHttpRequest();
            }
          else
            if (window.ActiveXObject)
              {
                objXMLHttp=new ActiveXObject('Microsoft.XMLHTTP');
              }
            return objXMLHttp;
        }
        
        function OnChangeCountry()
        {
          if (xmlHttp.readyState == 4 || xmlHttp.readyState == 'complete')
            {
              opts = xmlHttp.responseText.split("\n");
              forma.city.options.length = 0;
              for (i = 0; i < opts.length; i++)
                {
                  opt = opts[i].split(";");
                  forma.city.options[i] = new Option(opt[1], opt[0]);
                }
              //forma.city.innerHTML = xmlHttp.responseText;
              forma.city.disabled = false;
            }
        }
      
        function ChangeCountry()
        {
          cid = forma.country.value;
          if (cid == -1)
            {
              forma.city.disabled = true;
            }
          else
            {
              xmlHttp = GetXmlHttpObject();
              url = "/test.php?do=getcities&cid=" + cid;
              xmlHttp.onreadystatechange = OnChangeCountry;
              xmlHttp.open("GET", url, true);
              xmlHttp.send(null);
            }
        }
      </script>

      <form name="forma" method="post">
        <select name="country" onchange="ChangeCountry()">
          <option value="-1">Выберите страну...
          <?
            
    for ($i 0$i count($countries); $i++)
              echo 
    '<option value="'.$i.'">'.$countries[$i]."\n";
          
    ?>
        </select>
        <select name="city" disabled>
          <option value="-1">Выберите город...
        </select>
      </form>
    </body>
    </html>
     
    1 person likes this.
  7. svesve

    svesve Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    568
    Likes Received:
    86
    Reputations:
    11
    Спс все работает!
     
  8. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Еще вариант
    Две таблицы
    Таблица Отделы - поля ид отдела, название отдела.
    Таблица Должности - ид должности, ид отдела, название должности.
    PHP:
    <?php
      $connect 
    pg_connect ('host=xxx.xxx.xxx.xxx dbname=xxx user=xxx password=xxx');
      if (!
    $connect) {
        echo 
    'Fuck';
      } else {
        
    pg_query ($connect'set client_encoding=utf8');
        
    $text "<html>\n<head>\n<title>Page Title</title>\n";
        
    $text .= "</head>\n";
        
    $text .= "<body>\n";
        
    $text .= "<form name=\"frm\">\n";
        
    $text .= "<select id=\"sel1\" onClick=\"location.href = '/test_a.php?otd_id=' + this.value\">\n";
        
    $otd pg_query ($connect'select id, name from otd order by id');
        if (isset (
    $_GET['otd_id']) && !empty ($_GET['otd_id']))
          
    $otd_id intval ($_GET['otd_id']);
        else
          
    $otd_id = -1;
        while (
    $otd_res pg_fetch_array ($otd)) {
          
    $text .= "<option value=\"{$otd_res['id']}\" " . ($otd_id >= && $otd_res['id'] == $otd_id 'selected' '') . ">{$otd_res['name']}</option>\n";
        }
        
    $text .= "</select><br><br><br>\n";
        
    $text .= "<select id=\"sel2\">\n";
        if (
    $otd_id >= 0) {
          
    $dolg pg_query ($connect'select id, otd_id, name from dolg where otd_id = ' $otd_id);
          while (
    $dolg_res pg_fetch_array ($dolg)) {
            
    $text .= "<option value={$dolg_res['id']}>{$dolg_res['name']}</option>\n";
          }
        }
        
    $text .= "</select>";
        
    $text .= "</form>\n";
        
    $text .= '</body></html>';
        echo 
    $text;
        
    pg_close ($connect);
      }
    ?>
    Для постгреса, но не думаю, что возникнет проблема перевести на мускуль. Тестилось на FF & O.
     
    #8 krypt3r, 12 Jan 2009
    Last edited: 12 Jan 2009
    1 person likes this.
  9. svesve

    svesve Elder - Старейшина

    Joined:
    15 Jun 2007
    Messages:
    568
    Likes Received:
    86
    Reputations:
    11
    Во на пыхе немного понятней для меня
    спс,щас буду его под себя крутить!
    один вопрос,когда идет выбор из списка почемуто если просто кликнем на раскрытие то сразу идет выборка 0 ид,но если зажать кнопку и выбрать нужный отдел то выбирает то что надо.....мб баг?