Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS/php] Prośba o pomoc
Forum PHP.pl > Forum > Przedszkole
kropla
Witam

Próbuje zrobić dwa pola select, w którym zawartość drugiego zmienia się w zależności od pierwszego. Skorzystałem z pomocy tego forum i przerobiłem skrypcik na moje potrzeby który działa. Chciałbym dokonać w nim jednak pewnej (pewnie niewielkiej zmiany) ale nie wiem jak. Otóż
Zawartość dla każdego pola select pobierana jest z dwóch różnych tabel (zrzut dwóch tabel poniżej). W jednej tabeli jest kategoria główna, w drugiej podkategoria dla danych kategori. Czasami jednak kategoria główna nie ma żadnej podkategorii i tu potrzebuję pomocy bo chciałbym zrobić tak żeby w takim przypadku drugi select poprostu zniknął, a jeśłi będzie jakaś podkategoria to żeby się pojawił (tylko że pojawienie spowinno byc razem z tabelką w html) bo docelowo będę chciał zrobić żeby wstawiał mi się wiersz. w tabeli. Jeśli pomoglibyście mi różnież przy optymalizacji kodu to też byłbym wdzięczny bo raczej chyba nie jest on za bardzo wydajny.
Dziękuję za jakiekolwiek próby pomocy.
Pozdrawiam

zrzut tabel

  1. CREATE TABLE `kategoria_programow` (
  2. `id` int(4) NOT NULL AUTO_INCREMENT,
  3. `Nazwa` varchar(50) NOT NULL DEFAULT '',
  4. PRIMARY KEY (`id`)
  5. ) TYPE=MyISAM AUTO_INCREMENT=18 ;
  6.  
  7. --
  8. -- Zrzut danych tabeli `kategoria_programow`
  9. --
  10.  
  11. INSERT INTO `kategoria_programow` VALUES (9, 'Internet');
  12. INSERT INTO `kategoria_programow` VALUES (8, 'Dodatki');
  13. INSERT INTO `kategoria_programow` VALUES (7, 'Bezpieczeństwo');
  14. INSERT INTO `kategoria_programow` VALUES (6, 'Antywirusy');
  15. INSERT INTO `kategoria_programow` VALUES (10, 'Kompresory plików');
  16. INSERT INTO `kategoria_programow` VALUES (11, 'Menedżery plików');
  17. INSERT INTO `kategoria_programow` VALUES (12, 'Multimedia');
  18. INSERT INTO `kategoria_programow` VALUES (13, 'Programy biurowe');
  19. INSERT INTO `kategoria_programow` VALUES (14, 'Programy CD&DVD');
  20. INSERT INTO `kategoria_programow` VALUES (15, 'Sterowniki');
  21. INSERT INTO `kategoria_programow` VALUES (16, 'System');
  22. INSERT INTO `kategoria_programow` VALUES (17, 'Webmaster');
  23.  
  24. -- --------------------------------------------------------
  25.  
  26. --
  27. -- Struktura tabeli dla `kategoria_programowii`
  28. --
  29.  
  30. CREATE TABLE `kategoria_programowii` (
  31. `id` int(4) NOT NULL AUTO_INCREMENT,
  32. `Nazwa_glowna` varchar(70) NOT NULL DEFAULT '',
  33. `Podkategoria` varchar(70) NOT NULL DEFAULT 'BRAK',
  34. PRIMARY KEY (`id`)
  35. ) TYPE=MyISAM AUTO_INCREMENT=102 ;
  36.  
  37. --
  38. -- Zrzut danych tabeli `kategoria_programowii`
  39. --
  40.  
  41. INSERT INTO `kategoria_programowii` VALUES (1, 'Bezpieczeństwo', 'Anty-spam');
  42. INSERT INTO `kategoria_programowii` VALUES (2, 'Bezpieczeństwo', 'Any-spyware');
  43. INSERT INTO `kategoria_programowii` VALUES (3, 'Bezpieczeństwo', 'Firewalle');
  44. INSERT INTO `kategoria_programowii` VALUES (4, 'Bezpieczeństwo', 'Generatory haseł');
  45. INSERT INTO `kategoria_programowii` VALUES (5, 'Bezpieczeństwo', 'Inne programy związane z bezpieczeństwem');
  46. INSERT INTO `kategoria_programowii` VALUES (6, 'Bezpieczeństwo', 'Odzyskiwanie haseł');
  47. INSERT INTO `kategoria_programowii` VALUES (7, 'Bezpieczeństwo', 'Szyfrowanie danych');
  48. INSERT INTO `kategoria_programowii` VALUES (8, 'Bezpieczeństwo', 'Zarządzanie hasłami');
  49. INSERT INTO `kategoria_programowii` VALUES (9, 'Dodatki', 'SimLock');
  50. INSERT INTO `kategoria_programowii` VALUES (10, 'Dodatki', 'Spolszczenia');
  51. INSERT INTO `kategoria_programowii` VALUES (21, 'Internet', 'Komunikatory głosowe');
  52. INSERT INTO `kategoria_programowii` VALUES (22, 'Internet', 'Komunikatory internetowe');
  53. INSERT INTO `kategoria_programowii` VALUES (26, 'Internet', 'Obsługa kamer internetowych');
  54. INSERT INTO `kategoria_programowii` VALUES (27, 'Internet', 'Odtwarzacze stacji radiowych i TV');
  55. INSERT INTO `kategoria_programowii` VALUES (33, 'Internet', 'Serwery FTP');
  56. INSERT INTO `kategoria_programowii` VALUES (34, 'Internet', 'Serwery poczty elektronicznej');
  57. INSERT INTO `kategoria_programowii` VALUES (35, 'Internet', 'Serwery WWW');
  58. INSERT INTO `kategoria_programowii` VALUES (36, 'Internet', 'Telefonia internetowa');
  59. INSERT INTO `kategoria_programowii` VALUES (37, 'Internet', 'Zdalny dostęp');
  60. INSERT INTO `kategoria_programowii` VALUES (42, 'Multimedia', 'Konwertery');
  61. INSERT INTO `kategoria_programowii` VALUES (43, 'Multimedia', 'Narzędzia DVD');
  62. INSERT INTO `kategoria_programowii` VALUES (44, 'Multimedia', 'Narzędzie do nagrywania dĽwięku');
  63. INSERT INTO `kategoria_programowii` VALUES (45, 'Multimedia', 'Obróbka audio');
  64. INSERT INTO `kategoria_programowii` VALUES (46, 'Multimedia', 'Obróbka grafiki');
  65. INSERT INTO `kategoria_programowii` VALUES (47, 'Multimedia', 'Obróbka video');
  66. INSERT INTO `kategoria_programowii` VALUES (48, 'Multimedia', 'Odtwarzacze plików audio i video');
  67. INSERT INTO `kategoria_programowii` VALUES (49, 'Multimedia', 'Odtwarzacze plików muzycznych');
  68. INSERT INTO `kategoria_programowii` VALUES (50, 'Multimedia', 'Odtwarzacze płyt DVD');
  69. INSERT INTO `kategoria_programowii` VALUES (51, 'Multimedia', 'Pokazy slajdów');
  70. INSERT INTO `kategoria_programowii` VALUES (52, 'Multimedia', 'Przeglądarki graficzne');
  71. INSERT INTO `kategoria_programowii` VALUES (53, 'Multimedia', 'Rippery');
  72. INSERT INTO `kategoria_programowii` VALUES (54, 'Multimedia', 'Rozszerzenia multimedialne');
  73. INSERT INTO `kategoria_programowii` VALUES (55, 'Multimedia', 'Zrzutery ekranów');
  74. INSERT INTO `kategoria_programowii` VALUES (56, 'Programy biurowe', 'Arkusze kalkulacyjne');
  75. INSERT INTO `kategoria_programowii` VALUES (57, 'Programy biurowe', 'Edytory tekstów');
  76. INSERT INTO `kategoria_programowii` VALUES (58, 'Programy biurowe', 'Finsanse');
  77. INSERT INTO `kategoria_programowii` VALUES (59, 'Programy biurowe', 'Inne programy biurowe');
  78. INSERT INTO `kategoria_programowii` VALUES (60, 'Programy biurowe', 'Pakiety biurowe');
  79. INSERT INTO `kategoria_programowii` VALUES (61, 'Programy biurowe', 'PDF');
  80. INSERT INTO `kategoria_programowii` VALUES (62, 'Programy CD&DVD', 'Inne programy CD&DVD');
  81. INSERT INTO `kategoria_programowii` VALUES (63, 'Programy CD&DVD', 'Narzęzia do wypalania płyt CD oraz DVD');
  82. INSERT INTO `kategoria_programowii` VALUES (64, 'Programy CD&DVD', 'Wirtualne napędy');
  83. INSERT INTO `kategoria_programowii` VALUES (65, 'Programy CD&DVD', 'Zarządanie obrazami płyt');
  84. INSERT INTO `kategoria_programowii` VALUES (66, 'Sterowniki', 'Karty graficzne');
  85. INSERT INTO `kategoria_programowii` VALUES (67, 'Sterowniki', 'Karty muzyczne');
  86. INSERT INTO `kategoria_programowii` VALUES (68, 'Sterowniki', 'Karty sieciowe');
  87. INSERT INTO `kategoria_programowii` VALUES (69, 'Sterowniki', 'Płyty główne');
  88. INSERT INTO `kategoria_programowii` VALUES (70, 'System', 'Archiwizacja (backup) danych');
  89. INSERT INTO `kategoria_programowii` VALUES (71, 'System', 'Czyszczenie rejestru');
  90. INSERT INTO `kategoria_programowii` VALUES (72, 'System', 'Diagnostyka');
  91. INSERT INTO `kategoria_programowii` VALUES (73, 'System', 'Edytory tekstu');
  92. INSERT INTO `kategoria_programowii` VALUES (74, 'System', 'Inne programy systemowe');
  93. INSERT INTO `kategoria_programowii` VALUES (75, 'System', 'Kalendarze');


mój skrypt

[php]
$url = 'localhost';
$login = '';
$pass = '';
$baza ='';
$polaczenie=mysql_connect($url,$login,$pass);
$wybor=mysql_select_db($baza);
$table_name2='kategoria_programowii';
$table_name='kategoria_programow';
?>

<form name="doublecombo">
<p><select name="example" size="1" onChange="redirect(this.options.selectedIndex)">
<?php
$sql_I = "SELECT * FROM $table_name";
$result = @mysql_query($sql_I);
echo "<option selected value=''>wybierz</option>";
while ($row3 = mysql_fetch_array($result)) {
$wartosc_1=$row3['Nazwa'];
echo "<option value='$wartosc_1'>$wartosc_1</option>";
}

?>
</select><br><br>
<select name="stage2" size="1">

</select><br>

<script>
<!--

var groups=document.doublecombo.example.options.length
var group=new Array(groups)
for (i=0; i<groups; i++)
group[i]=new Array()
group[0][0]=new Option("","BRAK")
<?php

$sql_I = "SELECT * FROM $table_name";
$result = mysql_query($sql_I);
$licznik1=1;

while ($row3 = mysql_fetch_array($result)) {
$wartosc_1=$row3['Nazwa'];
$licznik2=0;

$sql_III = "SELECT * FROM $table_name2 where Nazwa_glowna like '$wartosc_1'";
$result4 = mysql_query($sql_III);
$sql_IIV = "SELECT count(*)ilosc FROM $table_name2 where Nazwa_glowna like '$wartosc_1'";
$resultIIV = mysql_query($sql_IIV);
$row41=mysql_fetch_array($resultIIV);
if ($row41['ilosc'])
{
while ($row41 = mysql_fetch_array($result4))
{
if ($licznik2==0)
{
?>
group[<?php echo $licznik1;?>][<?php echo $licznik2;?>]=new Option("Wybierz")
<?php
$licznik2++;
}
else
{
$wartosci3=$row41['Podkategoria'];
?>
group[<?php echo $licznik1;?>][<?php echo $licznik2;?>]=new Option(" <?php echo $wartosci3;?>")
<?php
$licznik2++;
}
}
}
else
{
$wartosci3="Brak Podkategorii";
?>
group[<?php echo $licznik1;?>][<?php echo $licznik2;?>]=new Option(" <?php echo $wartosci3;?>")
<?php
$licznik2++;
}
$licznik1++;
}
?>
var temp=document.doublecombo.stage2

function redirect(x){
for (m=temp.options.length-1;m>0;m--)
temp.options[m]=null
for (i=0;i<group[x].length;i++){
temp.options[i]=new Option(group[x][i].text,group[x][i].value)
}
temp.options[0].selected=true
}

function go(){
location=temp.options[temp.selectedIndex].value
}
//-->
</script>
artur81
Cytat(kropla @ 29.09.2006, 11:35:09 ) *
Czasami jednak kategoria główna nie ma żadnej podkategorii i tu potrzebuję pomocy bo chciałbym zrobić tak żeby w takim przypadku drugi select poprostu zniknął

W pliku php do którego wysyłasz żądanie, sprawdź ile rekordów masz zwrócnych po zapytaniu w którym pobierasz podkategorie, jeśli jest zero to wyczyść pole w które wstawiasz dane wynikowe za pomocą innerHTMl.
kropla
ale szczerze powiedziawszy ja się nie znam na JS a zmiana podkategorii w select odbywa się bez przładowania strony za pomocą JS
artur81
No i to właśnie tak będzie działać. Masz dwie tabele w bazie danych, jedno co mi się rzuciło w oczy to nie podobaja mi się sposób w jaki wrzucasz tam dane. Wg mnie lepiej by było

--table_kategorie--

id_kategorii
nazwa

-- table_podkategorie --
id_podkategorii
id_kategorii (czyli kategorii nadrzędnej)
nazwa

teraz tak, do jednego selecta wrzucasz wynik zapytania
  1. SELECT * FROM kategorie;

Na tej podstawie robisz kod
  1. <select name="lista1" onchange="zmien(this.value);">
  2. tutaj w pętli php generujesz listę nazw kategorii

teraz należy napisać funkcję java script
  1. function zmien(id)
  2. {
  3. var adres = "pobierz2.php?id="+id;
  4. advAJAX.get({
  5. url: adres,
  6. onLoading:function(obj) {document.getElementById("lista2").innerHTML='<img src="loading.gif" />'; },
  7. onSuccess:function(obj) { document.getElementById("lista2").innerHTML=obj.responseText; },
  8. onError:function(obj) {alert(obj.responseText); }
  9. });
  10. }

Jej zadaniem jest wysłanie do pliku pobierz2.php numeru kategorii którą wybierzerz z listy.
Jest to fragment kody który prezentowałem w tym wątku , przejrzyj sobie może ci się nieco rozjaśni.
W pliku pobierz2 php pobierasz id które przesłałeś za pomocą funkcji JS np. tak
  1. <?php
  2. $odebrane_id= $_GET['id'];
  3. ?>

i Dajesz kolejne zapytanie:
  1. SELECT * FROM podkategorie WHERE id_kategorii='$odebrane_id';

W ten sposób otzrymujesz kolejną porcję danych, wrzucasz do drugiego selecta i to wszystko.
W wątku który podałem wyżej opisałem dokładnie co i jak. chociaż na nieco innym przyładzie.
kropla
czyli co? z tego co rozumiem zawartość drugiego selecta generowana jest przez zewnętrzny plik pobierz2.php który dołączony zpstaje w głównej stronie ?
artur81
nie do końca, pliku nie dołączasz tylko wysyłasz do niego jakby żadanie o pewne dane, w tym przypadku są to podkategorie kategorii którą wybierzesz z listy. Wynik jak i całe żądanie działa na ajaxie i dlatego nie ma przeładowania strony. W samym JS nie dobierzesz się do bazy danych bo ona działa na serwerze a js w przeglądarce.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.