[ prginfo @ 15.06.2009. 10:48 ] @
Zeleo bih da uradim sledece:

Postoji baza sa 2 tabele T1 i T2. U T1 postoje polja ID1 i NAZIV1 u tabeli T2 postoje polja ID2, NAZIV2, NAZIV1

Na formi ima 2 ListBox-a.

1. Kada se stranica ucitava, da se ListBox napuni vrednostima iz baze iz tabele T1 polje NAZIV (option i value da budu isto).
2. Da se napravi neka funkcija onChange ListBox1 tako da ce da filtrira podatke u ListBox2 sa where ListBox1.NAZIV1==T2.NAZIV1, a da mi ispisuje vrednosti NAZIV2 u ListBox2.

SQLovi da budu tipa SELECT DISTINCT(NAZIV1) from T1
pa onda WHILE.... da puni ListBox1

A OnChange za ListBox1 da bude SELECT DISTINCT(NAZIV2) from T2 where T2.NAZIV1==ListBox1.NAZIV1
pa onda WHILE... da puni ListBox2

Mislim da sam bio dovoljno jasan.

Bio bih zahvalan ako bi mi neko malo pojasnio da li ovo moze da se uradi u PHPu i ako moze da postavi neki pseudo kod kao primer o kom bi mogli diskutovati.

U Delphiju mi ovo normalno funkcionise na OnCreate Form, ali znam da je u PHPu drugaciji sistem, pa mi treba malo objasnjenje.

Hvala.
[ Nikola Poša @ 15.06.2009. 18:56 ] @
Aj' kad niko ne odgovara da probam ja da ti bar dam neku ideju...

Prvo, uvek je bolje da u toj drugoj tabeli umesto naziv1 pišeš t1_id, odnosno id one prve tabele. Onda se to povezivanje tabela (ključeva) odvija mnogo brže...

A evo recimo sad neki pseudo kod onoga što tebi treba:
Code:

<html>
    <head>
        <!-- Predlazem da ucitas i jquery radi lakseg AJAX-a -->
        <script type = "text/javascript" src = "jquery.js"></script>
        <script type = "text/javascript">
            function promena() {
                var tab1 = $('#tab1').value;
                
                 $.ajax({
                    type: 'POST',
                    url: 'neki_handler.php',
                    data: 'tab1=' + tab1,
                    success: function(msg){
                        $('#tab1').html(msg);
                    }
                });
            }
        </script>
    </head>
    <body>
        <select name = "tab1" id = "tab1" onchange = "promena();">
            <?php
            $sql = "SELECT * FROM tabela1";
            //ovde sad ide izvrsavanje tog upita i ispis <option> elemenata u petlji
            //u obliku: echo '<option value = "' . $row['id'] . '">' . $row['naziv'] . '</option>';
            ?>
        </select>
    </body>
</html>

Dobro, i nije baš pseudo...

A u tom neki_handler.php bi samo prihvatao taj $_POST['tab1'], a to je inače id izabrane stavke iz liste, pa bi na osnovu njega pravio upit koji bi dohvatao stavke iz te druge tabele: SELECT * FROM tabela2 WHERE tab1_id = $_POST['tab1'].

I onda bi rezultat tog skripta trebao da bude ispis samo <option> tag-ova (bez početnog select!), pošto sam napisao da $('#tab1').html(msg), što znači da će se "unutrašnjost" onog prvog select tag-a ispuniti sa onim što neki_handler.php bude ispisao...

[Ovu poruku je menjao Nikola Poša dana 15.06.2009. u 21:29 GMT+1]
[ prginfo @ 17.06.2009. 12:13 ] @
Nikola, prvo da ti se zahvalim na brzim i konstruktivnim odgovorima.

Deo problema sam resio na nacin da sam List/Box1 napunio fiksnim vrednostima i onda radim if($_POST), tako da mi onda u List/Box2 normalno i ispravno ucitava vrednosti.

E sada, zeleo bih da uradim sledece ali nisam siguran kako:

Imam 3 List/Box-a koje sam postavio na Type LIST. Zelim da mi se selekt i punjenje List/Box2-a radi na OnClick List/Box1, ali tako da mi zadrzi selectovanu vrednost iz List/Box1, a ne da resetuje vrednost.
Takodje, kada se izabere opcija iz List/Box2, da mi se takodje puni List/Box3.

Malo plasticno da objasnim:

Imam List/Box1 u kojima su mi opcije KONTIINENTI
Imam List/Box2 u kojima su mi opcije DRZAVE
Imam List/Box3 u kojima su mi opcie GRADOVI

Vrednosti List/Box1 su zadate u startu.

Kada se klikne na opciju EVROPA iz List/Box1, List/Box2 mi se napuni drzavama iz EVROPe, a posle toga, kada se klikne na opciju SRBIJA iz List/Box2, List/Box3 se puni gradovima iz SRBIJE.

Bitno je da se fokus zadrzi na selektovanim poljima, iz razloga sto na kraju imam dugme SUBMIT koje ce da radi select posle POSTa nad nekom tabelo.
Select ce biti tipa:

SELECT * FROM tabel4 where kontinent = '$kontinent' && drzava = '$drzava' && grad = '$grad';

Iz tog razloga mi je bitno da mi selektovane opcije ostanu selektovane, a ne da se resetuju pri svakoj promeni (POSTu) forme.

VEEELIKO HVALA
[ Nikola Poša @ 17.06.2009. 13:36 ] @
Citat:
prginfo:Iz tog razloga mi je bitno da mi selektovane opcije ostanu selektovane, a ne da se resetuju pri svakoj promeni (POSTu) forme.

Kada ideš sa kombinacijom JS/AJAX ništa se neće reset-ovati, jer ta komunikacija sa PHP-om ide u "pozadini".

Ne znam u čemu je onda problem, ista priča k'o malopre. Imaćeš opet taj neki handler za zahteve iz AJAX-a, ali koji će ovog puta da switch-uje izvršavanje u zavisnosti od combo-box-a koji se obrađuje. Ili još bolje, dinamički će da u ispisuje content u zavisnosti od combo-box-a, odnosno, dinamički će da uzima podatke iz određene tabele.

Npr. imaš ovakav front-end:
Code:

<select name = "kontinenti" id = "kontinenti" onchange = "promena(this.name, 'drzave');">
//lista kontinenata
</select>

<select name = "drzave" id = "drzave" onchange = "promena(this.name, 'gradovi');">
</select>

<select name = "gradovi" id = "gradovi">
</select>

Kao što vidiš, sada ta JS f-ja promena() prihvata i dva dodatnai parametra: koji combo-box treba da se "obradi", i na koji treba da se "utiče". Njen kod bi izgledao ovako:
Code:

function promena(akcija, sledeci) {
                
   var vrednost = $('#' + akcija).value;
                
   $.ajax({
      type: 'POST',
      url: 'neki_handler.php',
      data: 'akcija=' + akcija + '&vrednost=' + vrednost + '&sledeci=' + sledeci,
      success: function(msg){
         $('#' + sledeci).html(msg);
      }
   });
}

Naravno, opet podrazumevam da ćeš učitati i jQuery u tu tvoju stranicu.

A u onom handler-u (neki_handler.php), bi sad imao ovako nešto:
Code:

$akcija     = $_POST['akcija'];
$vrednost   = $_POST['vrednost'];
$sledeci    = $_POST['sledeci'];

$sql = "SELECT * FROM $sledeci WHERE $akcija_id = $vrednost";
//izvrsavanje upita, dohvatanje rezultata

foreach ($rezultat as $r) {
   echo '<option value = "' . $r['id'] . '">' . $r['naziv'] . '</option>';
}

Naravno, sad sve zavisi kakvi su ti nazivi tabela i ključeva (a i uopšte organizacije tih tabela), jer možda neće moći baš ovako jednostavno da se formira upit, možda će trebati i malo obrade tog stringa $akcija, kako bi se poklopio sa nazivom tog stranog ključa u tabeli.

I to je sve... Na svaku promenu neke od tih listi će se menjati ona koja je sledeća, ali bez bilo kakvih reset-ovanja.
[ prginfo @ 17.06.2009. 14:45 ] @
Probao sam, i nista mi se ne desava, ili se desava nesto u pozadini sto ja ne vidim.

U svakom slucaju, ne vidim nikakvu promenu na stranici.

Stranica mi uvek ostaje takva kakva je i kad se pokrene, bez iscitavanja podataka.

Na sta da obratim paznju i gde bi mogao da pogresim.
[ Vladica Savić @ 17.06.2009. 15:00 ] @
Vidi kakav zahtev saljes serveru, i sta dobijas kao response, to najlepse mozes da ispratis sve u firebug-u, mozda je neka glupost tipa da si omasio name ili id pa ti zato ne vraca ili sl. U svakom slucaju ako je do toga firebug ce ti javiti error, a ako nije do toga, proveri zahtev i response koji dobijas.
[ Nikola Poša @ 17.06.2009. 15:19 ] @
Citat:
prginfo: Probao sam, i nista mi se ne desava, ili se desava nesto u pozadini sto ja ne vidim.

Nadam se da nisi išao samo copy-paste onih mojih kodova. To sam pisao čisto da ti dam neku ideju i "putokaz" šta treba da radiš.

Daj da vidimo taj kod koji isprobavaš... Pošalji i izgled baze i tih tabela u njoj.
[ prginfo @ 18.06.2009. 07:38 ] @
Evo koda sa stranice:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
<!--
.lista {
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
margin: 5px;
width: 250px;
}
-->
</style>


<!-- OVDE SAM UCITAO jquery.js SKINUO SAM jquery.1.3.2
<script type = "text/javascript" src = "jquery.js"></script>
<script type = "text/javascript">
<!--


function klik(act, jump) {

var sum = $('#' + act).value;

$.ajax({
type: 'POST',
url: 'read_tip.php',
data: 'act=' + act + '&sum=' + sum + '&jump=' + jump,
success: function(msg){
$('#' + jump).html(msg);
}
});
}
-->
</script>
</head>

<body>
<form id="form1" name="form1" method="post" action="">
<table width="500" border="0" cellspacing="1" cellpadding="0">
<tr>
<td width="184">KONTINENET:</td>
<td width="313"><select name="kontinent" size="5" class="lista" id="kontinent" onchange="promena(this.name, 'drzava')">
<option value="EVROPA">EVROPA</option>
<option value="AZIJA">AZIJA</option>
<option value="AFRIKA">AFRIKA</option>
</select>
</td>
</tr>
<tr>
<td>DRZAVA:</td>
<td><select name="drzava" size="5" class="lista" id="drzava" onchange = "promena(this.name, 'grad');">
</select>
</td>
</tr>
<tr>
<td>GRAD:</td>
<td><select name="grad" size="10" class="lista" id="grad">
</select>
<input name="pbr" type="submit" id="pbr" value="pbr" /></td>
</tr>
<tr>
<td>PBR:</td>
<td><input name="posbr" type="text" class="lista" id="posbr" maxlength="7" /></td>
</tr>
</table>
</form>
</body>
</html>

read_tip.php je sledeci
<?php

$act = $_POST['act'];
$sum = $_POST['sum'];
$jump = $_POST['jump'];

$sql = "SELECT * FROM $jump WHERE $actvr = $sum";

foreach ($rezultat as $r) {
echo '<option value = "' . $r['actvr'] . '">' . $r['actvr'] . '</option>';
}

?>

I imam MySQL bazu

Tabele su sledecih formi:

tKONTINENTI
IDK | KONTINENT

tDRZAVE
IDD | KONTINENT | DRZAVA

tGRADOVI
IDG | DRZAVA | GRAD | PBR
[ prginfo @ 18.06.2009. 07:51 ] @
E sada, prethodni post sam otkucao na brzinu.

Ono sto fali naravno je konekcija na vazu, i verovatno jos nesto.

Kada iskucam kod u varijanti da mi ispisuje imena drzava vezanih za neki kontinent, to radi.
Probao sam i while pa da brojim broj ispisa, i to radi.

Problem mi je da se stranica ne osvezava i da ostane selektovano ono sto je izabrano.

Dosta sam citao da je Ajax idealan za to zato sto dozvoljava komunikaciju JS sa serverom bez refresh-ovanja stranice.

Iskren da budem, kao i vecina u pocetku, ja sam najbolje ucio na primerima.

Cesto i uradim copy/paste, pa onda taj kod menjam, posmatram promene i tako ucim. Cesto, korak po korak sa gotovim primerima.

Ne treba mi gotov kod koji cu ja copy/paste. Naprotiv, ja bih voleo da vidim gotov kod, ali sa objasnjenjima sta je i zbog cega postavljeno tako, koje su alternative...
Ja mislim da se svaka situacija u radu ponavlja, a narocito ovakav primer. Bilo bi apsurdno da svaki put postavljam temu. Ili neko drugi. Ja volim da naucim stvar, a zatim da je modifikujem, usavrsavam... Smatram da je to, izmedju ostalog funkcija ovakvog foruma.

Hvala svima na odgovorima.
[ Nikola Poša @ 18.06.2009. 10:26 ] @
I jel ti sad radi? Meni sad deluje da je sve ok...

Samo jedan mali tip, kad povezuješ tabele, uvek je bolje da to ide preko id-eva, a ne nekih tekstualnih polja, kao što su u tvom slučaju KONTINENT i DRZAVA.

Tvoj drugi post:
Citat:
prginfo: Iz tog razloga mi je bitno da mi selektovane opcije ostanu selektovane, a ne da se resetuju pri svakoj promeni (POSTu) forme.

Tvoj prethodni post:
Citat:
prginfo:Problem mi je da se stranica ne osvezava i da ostane selektovano ono sto je izabrano.

Pa ja ne razumem šta sad ti hoćeš da postigneš...
[ prginfo @ 18.06.2009. 11:03 ] @
Pa zelim da kada izaberem iz prvog List/Box/a npr Evropa, da se u List/Box2 ucitaju drzave koje imaju Evropa, ali da u prvom List/Box1 Evropa ostane selektovano, a ne da se List/Box refreshuje.

P.S. Nikola, hvala ti, ti si uvek najbrzi.

1. Konekciju ka bazi da stavljam u stranicu ili u .php na koji se pozivam?

2. Znam da je bolje raditi indeksiranje preko IDa (tako i radim). Baze podataka i SQL dobro poznajem posto mi je to posao. Ja sam ovde, kao sto sam i ranije napisao 'dao plastican primer'. Nije mi neresivo indeksiranje i dizajn baze podataka, vec sama komunikacija i nacin rada PHP, JS, AJAX. Ja 90% svog radnog vremena radim sa IBM INFORMIX, FIREBIRD i Interbase bazama podataka, ali mi je problem, sto cesto navodim, ja programiram u Delphiju, i samam logika je drugacija i kako se i gde se procesi odvijaju. Sada pokusavam da neke stvari preradim za web, zato sam se upustio u PHP i MySQL.

Jos jednom hvala. Probacu, pa cu poslati post o rezultatima
[ Nikola Poša @ 18.06.2009. 13:19 ] @
Pa ovako kako si napisao, sa onchange event-om ništa ne bi trebalo da se refresh-uje. Ali normalno, kad klikneš na ono submit dugme, posle toga će se stranica reload-ovati i vratiti na ono početno stanje...

1. Za ovaj primer možeš da je staviš samo u onom AJAX handler-u (read_tip.php).

2. E pa super, ok onda.

Nema na čemu.
[ prginfo @ 19.06.2009. 12:37 ] @
Pokusao sam, kao sto sam i naisao, ali mi ne radi. Posle klika, na stranici mi se nista ne desava.
[ Nikola Poša @ 19.06.2009. 13:32 ] @
Posle kog sad klika? Misliš nakon izbora neke stavke u padajućoj listi?

Obrati pažnju samo da si u događajima onchange napisao da se poziva f-ja koja se zove promena, a i tu tvom JS kodu imaš samo f-ju koja se zove klik. Eto, to je prva greška na koju sam naišao samo ovako gledajući tvoj kod... btw Ne znam samo zašto si tu f-ju nazvao baš "klik", kad nju trebaš da pozivaš na neku promenu u padajućoj listi, al' ajde...

A i druga stvar, ako testiraš taj kod u Firefox-u, koristi Firebug (Tools -> Error Console), kao što ti je i Vladica predložio, sve će ti se samo kas'ti... U njemu je sigurno pisala ova greška da pozivaš nepostojeću f-ju promena().

edit: I još nešto, šta ti je sad ovo $actvr u upitu? Budući da si tu promenljivu koju si dohvatio iz POST-a nazvao $act, onda bi taj upit trebao da izgleda ovako:
Code:
$sql = 'SELECT * FROM ' .  $jump . ' WHERE ' . $act . ' = ' . $sum;

A taj echo u foreach petlji bi trebao da izgleda ovako:
Code:
echo '<option value = "' . $r[$jump] . '">' . $r[$jump] . '</option>';

edit1: E sad, tu može da dođe do problema ako se ta kolona u tabeli iz koje kupiš podatke ne zove baš isto kao i ta tabela, npr. kolona se zove 'kontinent', a tabela 'kontinenti'. A pošto je u toj promenljivoj $jump ime tabele, onda bi taj echo ipak trebao da izgleda ovako:
Code:
echo '<option value = "' . $r[substr($jump, 0, -1)] . '">' . $r[substr($jump, 0, -1)] . '</option>';

edit2: A situacija se još više komplikuje sa kombinacijom država - države i grad - gradovi. Zato je mnogo pametnije da nazive tih tekstalnih kolona promeniš u npr. 'naziv', i onda nema problema, uvek će ići $r['naziv'].

edit3: I naravno, podrazumevam da negde u tom handler-u imaš onaj deo sa konekcijom na bazu, slanjem upita, itd. Nadam se da nisi stvarno testirao upravo onakav kod koji si poslao.

btw Nadam se da si uspeo da "pohvataš" sve ove edit-e...

[Ovu poruku je menjao Nikola Poša dana 19.06.2009. u 14:51 GMT+1]
[ galeon @ 05.05.2012. 10:27 ] @
Novi sam na ovom forumu, pozdravljam sve članove, i htio bih nekoga ko se dobro razumije u programiranje da zamolim, da mi pokuša objasniti kako da riješim sličan problem koji je imao moj prethodnik u ovoj temi.

Mene takođe muči ne razumijevanje primjene AJAX tehnologije u programiranju.
Najviše mi muke zadaje ajax u kombinaciji sa padajućim listama koje se popunjavaju podatcima iz baze.
Naprimjer, imam tri padajuće liste koje vuku ajaxom podatke iz baze, u prvoj listi se smještaju države, zatim u drugoj republike a u trećoj gradovi tih republika.
Uz pomoć JQUERY AJAX-a ja uspijevam povezati te tri padajuće liste i izvući
dio podataka iz baze, ali problem mi nastaje kad recimo želim napraviti novi
izbor iz druge padajuće liste gdje se nalaze republike, izaberem drugu stavku
i zatim se ništa ne mijenja - ostaje rezultat u trećoj listi sa imenima
gradova od prethodne stavke iz druge padajuće liste.
Ne znam kako se to rješava, pa bih molio da mi neko objasni.

Code:

<html>

<head>
  <title></title>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<script type="text/javascript">
$(document).ready(function(){
$("#drzava").change(function (){
        var id = $(this).val();
        var dataString = 'id=' + id;

    $.ajax({
        type: "POST",
        url: "republike.php",
        data: dataString,
        cache: false,
        success: function(msg){
                $("#republika").html(msg);
                }
            });
        });
    });
</script>

<script type="text/javascript">
$(document).ready(function(){
$("#drzava").change(function(){
        var id = $(this).val();
        var dataString = 'id=' + id;

    $.ajax({
        type: "POST",
        url: "gradovi.php",
        data: dataString,
        cache: false,
        success: function(msg){
                $("#grad").html(msg);
                }
            });
        });
    });
</script>

</head>

<body>
 <form name="forma" id="forma" action="republike.php"  method="POST" >
<div style="margin:80px">
        <label>Drzave :</label>
        <select name="drzava" id="drzava" >
            <option selected="selected">--Izaberite drzavu--</option>
            <?php
                include('conn.php');
                $sql=mysql_query("select * from drzava");
                while($row=mysql_fetch_array($sql)){
                $drzava=$row['drzavaId'];
                $drzave=$row['drzave'];
                echo '<option value="'.$drzava.'">'.$drzave.'</option>';
                }?>
        </select> <br/><br/>

        <label>Republike :</label>
        <select name="republika" id="republika">
            <option selected="selected">--Izaberite republiku--</option>
        </select>

        </select> <br/><br/>

        <label>Gradovi :</label>
        <select name="grad" id="grad">
            <option selected="selected">--Izaberite grad--</option>
        </select>
        </div></br>
       </form>

</body>

</html>


Code:

<?php
include('conn.php');
if($_POST['id']){
$drzava=$_POST['id'];
$sql=mysql_query("select * from republika where drzavaId='$drzava'");

while($row=mysql_fetch_array($sql))
{
$republika=$row['republikaId'];
$republike=$row['republike'];
echo '<option value="'.$republika.'">'.$republike.'</option>';

}
}
?>


Code:

<?php

include('conn.php');
if($_POST['id'])
{
$drzava=$_POST['id'];

$sql2=mysql_query("select * from gradovi where 
 republikaId = '$drzava' and drzavaId='$drzava'");

while($row=mysql_fetch_array($sql2)){
$gradId=$row['gradId'];
$gradovi=$row['gradovi'];
echo '<option value="'.$gradId.'">'.$gradovi.'</option>';

}
}

?>