Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] pola select z danymi z bazy zależne od siebie
neverever
post 4.09.2007, 20:19:52
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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!


--------------------
neverever
Go to the top of the page
+Quote Post
tsharek
post 5.09.2007, 07:00:33
Post #2





Grupa: Zarejestrowani
Postów: 300
Pomógł: 1
Dołączył: 22.09.2003
Skąd: Czeladź

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
uli
post 5.09.2007, 07:54:10
Post #3





Grupa: Zarejestrowani
Postów: 318
Pomógł: 6
Dołączył: 27.01.2005

Ostrzeżenie: (0%)
-----


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.


--------------------
Prawo Wylera:
Nie ma rzeczy niemożliwych dla kogoś, kto nie musi ich zrobić sam.
Go to the top of the page
+Quote Post
neverever
post 5.09.2007, 12:15:34
Post #4





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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?


--------------------
neverever
Go to the top of the page
+Quote Post
qqrq
post 5.09.2007, 12:19:22
Post #5





Grupa: Zarejestrowani
Postów: 418
Pomógł: 8
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


neverever => gugiel, Panie bracie, tam o AJAX-ie od groma informacji... dry.gif


--------------------
Go to the top of the page
+Quote Post
neverever
post 5.09.2007, 13:02:29
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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?

Ten post edytował neverever 5.09.2007, 13:32:05


--------------------
neverever
Go to the top of the page
+Quote Post
bbula
post 3.03.2009, 12:14:53
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.03.2009

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował bbula 3.03.2009, 12:15:51
Go to the top of the page
+Quote Post
erix
post 3.03.2009, 17:45:16
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
bbula
post 3.03.2009, 18:53:29
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.03.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 16:43