Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Ниспадающий список и MySql (https://forum.antichat.xyz/showthread.php?t=100845)

svesve 12.01.2009 10:18

Ниспадающий список и MySql
 
Есть 2 ниспадающих списка
1. список выводит список отделов организации (делается запрос к бд и выводим инфу)
2. список ДОЛЖЕН выводить должности конкретного выбранного отдела..... как это можно релизовать?
тобишь я кликаю в первом списке на отдел формируется запрос к базе с id отдела и выводится из бд список должностей во второй ниспадающий список

Joker-jar 12.01.2009 10:31

Красивей всего будет если сделать через AJAX

svesve 12.01.2009 10:42

с аяксом глухо как в танке =(
есть примеры похожих реализаций?

Joker-jar 12.01.2009 10:51

Напишу небольшой пример, если никто не опередит :)

Joker-jar 12.01.2009 11:14

Так-с, ну вроде, работает. Будут проблемы, пиши

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>


Joker-jar 12.01.2009 11:34

Борода в 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>


svesve 12.01.2009 12:25

Спс все работает!

krypt3r 12.01.2009 13:06

Еще вариант
Две таблицы
Таблица Отделы - поля ид отдела, название отдела.
Таблица Должности - ид должности, ид отдела, название должности.
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.

svesve 12.01.2009 13:34

Во на пыхе немного понятней для меня
спс,щас буду его под себя крутить!
один вопрос,когда идет выбор из списка почемуто если просто кликнем на раскрытие то сразу идет выборка 0 ид,но если зажать кнопку и выбрать нужный отдел то выбирает то что надо.....мб баг?


Время: 23:28