Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] pola select z danymi z bazy zależne od siebie
Forum PHP.pl > Forum > Przedszkole
neverever
Mam sobie 3 tabele A, B i C
-każda ma po dwa pola, id i nazwa + ewentualny id tabeli nadrzędnej
-każda kolejna jest zbiorem elementów poprzedniej, czyli są połaczone relacjami - chyba tak to mozna nazwać.

Mam też plik z trzema polami typu select odpowiadającymi każdej tabeli

Do pierwszego selecta ładuję wszystkie idA i odpowiadające im nazwy

I teraz chciał bym zrobić tak, żeby po wybraniu jakiegos elementu z pierwszego selecta wykonane zostało zapytanie zwracające do drugiego pola select idB i ich nazwy

Tu z kolei po wybraniu elementu kolejne zapytanie i wypełnienie trzeciego selecta otrzymanymi rekordami.

Cytat
Przykład:
idA, nazwa
0, a
1, b
2 , c

idB, idA, nazwa
0, 0, a
1, 0, b
2, 1, c

idC, idB, idA, nazwa
0, 2, 0, a
1, 2, 0, b
2, 1, 1, c


w select1 wybieram pole 0 (a), to powinno mi pobrać automatycznie z bazy rekordy z tabeli B gdzie idA=0, czyli tu idB=0 i 1 i wpisać je do pola select2.
Z drugiego selecta wybieram dalej np. pole 1 a stosowne zapytanie zwraca mi w trzecim polu select odpowiednie rekordy z tabeli C, tu był by to rekord idC=2

Jak cos takiego zrobić?

Znalazłem coś takiego http://www.kess.snug.pl/?sid=10&pid=30
ale problem w tym że te 3 selecty mam w większym formularzu z innymi polami input, textarea itp.

Jak więc to połączyć by dodać taką funkcjonalność do formulrza typu:
Cytat
<form ...>
<input type="text" ...>
<input type="text" ...>
<input type="text" ...>
<select name="A" size="1">
dane pierwszego selecta z bazy
</select>
<select name="B" size="1">
dane drugiego selecta z bazy na podstawie zawartości pierwszego
</select>
<select name="C" size="1">
dane trzeciego selecta z bazy na podstawie zawartości drugiego
</select>

<input type="text" ...>
<input type="text" ...>
...
</form>
Jak wysyłam ten formularz to ma mi dodać wszystkie wartości do bazy - więc jak tu wcisnąć obsługę tych selectów?
Zagnieżdżanie formularzy czy jak?
Pomocy!
tsharek
najleprzym sposobem byłby w Twoim przypadku AJAX. Wczytujesz dane do drugiego selecta po zdarzeniu onchange (wcześniej czyścisz tego selecta żeby nie dodawać podwójnie). Jest jeszcze jedna metoda bez używania ajaxa: wczytanie wszystkiego do tablic javascryptowych (wielowymiarowych) i odpowiednia procedurka odczytująca z tych tablic - ale rozwiązanie jest mniej wygodne i wydłuża czas ładowania strony przy dużej ilości tablic.
uli
Bez AJAXa i tablic w JS też da się zrobić.

Niestety nie będzie to ładne rozwiązanie -> na onchange selecta1 i selecta2 przeładowujesz stronę i odbierasz te wartości. Na ich podstawie wyciągasz wartości następnego selecta.
neverever
Cytat(tsharek @ 5.09.2007, 08:00:33 ) *
najleprzym sposobem byłby w Twoim przypadku AJAX. Wczytujesz dane do drugiego selecta po zdarzeniu onchange (wcześniej czyścisz tego selecta żeby nie dodawać podwójnie). Jest jeszcze jedna metoda bez używania ajaxa: wczytanie wszystkiego do tablic javascryptowych (wielowymiarowych) i odpowiednia procedurka odczytująca z tych tablic - ale rozwiązanie jest mniej wygodne i wydłuża czas ładowania strony przy dużej ilości tablic.

drugie rozwiązanie odpada bo danych będzie całkiem sporo. A co do ajaxa, to czy mogę prosić o jakiś przykład który by realizował coś takiego? -bo ja z ajaxa jestem całkiem zielony wstydnis.gif

Cytat(uli @ 5.09.2007, 08:54:10 ) *
Bez AJAXa i tablic w JS też da się zrobić.

Niestety nie będzie to ładne rozwiązanie -> na onchange selecta1 i selecta2 przeładowujesz stronę i odbierasz te wartości. Na ich podstawie wyciągasz wartości następnego selecta.
tylko jak to zrobić gdy te 3 pola select są elementem większego formularza, którego wysłanie ma spowodować określoną akcje-tu zapis wszystkich wartości do bazy?
qqrq
neverever => gugiel, Panie bracie, tam o AJAX-ie od groma informacji... dry.gif
neverever
Cytat(qqrq @ 5.09.2007, 13:19:22 ) *
neverever => gugiel, Panie bracie, tam o AJAX-ie od groma informacji... dry.gif
Może i od groma ale mówię że z ajaxem nigdy nie miałem do czynienia.
Bazując na stronie http://www.php.rk.edu.pl/w/p/powizane-pola...zystujce-ajaxa/
zrobiłęm coś takiego:
  1. <script type="text/javascript" src="ajax.js"></script>
  2. <script type="text/javascript">
  3. var ajax = new sack();
  4.  
  5. function getml(sel)
  6. {
  7. var cc = sel.options[sel.selectedIndex].value;
  8. document.getElementById('miasto').options.length = 0;
  9. if(cc.length>0){
  10. ajax.requestFile = 'getm.php?cc='+cc;
  11. ajax.onCompletion = makem;
  12. ajax.runAJAX();
  13. }
  14. }
  15.  
  16. function makem()
  17. {
  18. var obj = document.getElementById('miasto');
  19. eval(ajax.response);
  20. }
  21.  
  22. <form action="" enctype="multipart/form-data" method="post">
  23. Kraj:
  24. <select id="kraj" name="kraj" size="1" onchange="getml(this)">
  25. <option value="">--</option>
  26. <?php $conn = mysql_connect(HOST,USER,PASS);
  27. $db = mysql_select_db(DBASE,$conn);
  28. if($sql = mysql_query("SELECT * FROM kraj ORDER BY nazwa DESC",$conn))
  29. while ($rekord = mysql_fetch_array($sql)){
  30. echo '<option value="'.$rekord['id'].'">'.$rekord['nazwa'].'</option>';
  31. }
  32. mysql_close($conn);
  33. ?>
  34. </select><br />
  35. Miasto:
  36. <select id="miasto" name="miasto" size="1">
  37. <option value="">--</option>
  38.  
  39. <!-- tu dalsza część formularza -->
  40. </form>


A plik getm.php:
  1. <?php
  2. if(isset($_GET['cc'])){
  3. $k=$_GET['cc'];
  4. $conn = mysql_connect(HOST,USER,PASS);
  5. $db = mysql_select_db(DBASE,$conn);
  6. if($sql = mysql_query("SELECT * FROM miasto ORDER BY nazwa DESC WHERE kraj=$k",$conn))
  7. while ($rekord = mysql_fetch_array($sql)){
  8. echo '<option value="'.$rekord['id'].'">'.$rekord['nazwa'].'</option>';
  9. }
  10. mysql_close($conn);
  11. }
  12. ?>
A nawet tak:
  1. <?php 
  2. if(isset($_GET['cc'])) 
  3. { 
  4. include 'mysql.class.php'; 
  5. $a = new mysql_db(); 
  6. $a->connect(HOST, USER, PASS, DBASE); 
  7. $q = $a->query_select("SELECT * FROM miasto WHERE kraj = '".mysql_real_escape_string($_GET['cc'])."'"); 
  8. foreach($q as $i) 
  9. { 
  10. echo "obj.options[obj.options.length] = new Option('".$i['nazwa']."','".$i['id']."'); 
  11. "; 
  12. } 
  13. $a->destruct(); 
  14. } 
  15. ?>
Pokazuje mi się formularz, kraje ładnie wypełnione a po wybraniu jakiegoś, select miasta zostaje wyczyszczony i nic się w nim nie pojawia - dlaczego? Co jest nie tak w tym kodzie?
bbula
przepraszam że odświeżam, ale wciąż nie uzyskano odpowiedź...
Cytat

w linku powyżej jest mała instrukcja, jak stworzyć ten skypt. Tak jak w temacie "Pola select z danymi zależne od siebie". W pierwszym i drugim polu nie wyświetla się żadne miasto.... Czy Ktoś uporał się z tym problemem? Jak go rozwiązać?
erix
A może jakieś błędy wypluwa? Sprawdź najpierw skrypt JS w konsoli błędów, potem wywołaj bezpośrednio żądanie z AJAX, aby zobaczyć, czy są jakiekolwiek dane. Od ogółu do szczegółu.
bbula
moj index
Kod


<script type="text/javascript" src="ajax.js"></script>

<script type="text/javascript">
var ajax = new sack();
function getml(sel)
{
    var cc = sel.options[sel.selectedIndex].value;
    document.getElementById('miasto').options.length=0;
    if(cc.length>0){
        ajax.requestFile = 'getm.php?cc='+cc;
        ajax.onCompletion = makem;
        ajax.runAJAX();
    }
}

function makem()
{
    var obj = document.getElementById('miasto');
    eval(ajax.response);
}

function reset_obj(obj){
if(obj!= null && obj.hasChildNodes())
    {
     for(var i=0; i <obj.childNodes.length;i++)
        obj.removeChild(obj.firstChild);
    }
}
</script>
<form action="">
<select id="kraj" name="kraj" size="1" onchange="getml(this)">
<option value="">--</option>
<?php
$conn = mysql_connect('mysql2.yoyo.pl','db698643','****');
$db = mysql_select_db('db698643',$conn);
if($sql = mysql_query("SELECT * FROM kraj ORDER BY nazwa ASC",$conn))

while ($rekord = mysql_fetch_array($sql)){
if($rekord['nazwa']=='Polska')
echo '<option value="'.$rekord['id'].'" selected>'.$rekord['nazwa'].'</option>';
else echo '<option value="'.$rekord['id'].'">'.$rekord['nazwa'].'</option>';
}
mysql_close($conn);
?>
</select>

<select id="miasto" name="miasto" size="1">
<option value="">Wybierz miasto</option>
</select>

</form>

a to getm.php
Kod


<?PHP

header('Content-Type: text/html; charset=iso-8859-2');

define('HOST', 'mysql2.yoyo.pl');
define('USER', 'db698643');
define('PASS', '*****');
define('DBASE', 'db698643');

if(isset($_GET['cc'])){
$k=htmlspecialchars($_GET['cc']);
$conn = mysql_connect('mysql2.yoyo.pl','db698643','*****');
$db = mysql_select_db('db698643',$conn);

echo "obj.options[obj.options.length] = new Option('--','');";
if($sql = mysql_query("SELECT * FROM miasto WHERE kraj='$k' ORDER BY nazwa ASC",$conn))
while ($rekord = mysql_fetch_array($sql)){
echo '<option value="'.$rekord['id'].'">'.$rekord['nazwa'].'</option>';
echo "obj.options[obj.options.length] = new Option('".$rekord['nazwa']."','".$rekord['id']."');";
}

mysql_close($conn);
}
?>

i jeszcze plik ajax, ale wątpie zeby tam był błąd
a to struktura tabel
Kod


CREATE TABLE kraj (
  id int(11) unsigned NOT NULL auto_increment,
  nazwa varchar(255) NOT NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY nazwa (nazwa)
);

CREATE TABLE miasto (
  id int(11) unsigned NOT NULL auto_increment,
  nazwa varchar(255) NOT NULL,
  kraj int(11) NOT NULL,
  PRIMARY KEY (id)

W pierwszym polu select są nazwy krajów, drugie jest puste, skrypt chyba lub raczej polega na numerze miasta przyporządkowanym do id w kraju, ale nic się nie wyświetla, gdzie jest błąd? prosze o pomoc, pozdrawiam
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.