[ milos 2 @ 27.12.2013. 21:52 ] @
pozdrav, pravim aplikaciju koja bi trebalo da simulira bibliotekarski informacioni sistem. naisao sam na problem da kada popunjavam tabelu sa knjigama i treba da popunim listu, koja je ubacena u celiju, koja sluzi za izlistavanje autora za odredjenu knjigu, ne mogu da prosledim knjigaId SQL upitu.
baza je pravljena u MySQL-u, servisni fajlovi u PHP-u.

molim nekoga ako moze u vezi sa ovim da mi pomogne

svi fajlovi vezani za projekat se nalaze na ovom linku: fajlovi za projekat
[ milos 2 @ 28.12.2013. 17:34 ] @
zar niko ne zna flex?
[ djoka_l @ 28.12.2013. 18:41 ] @
Da li misliš da će bilo ko da debaguje tvojih 6MB.

http://www.elitesecurity.org/o/pravilnik/korisnici/

Citat:
3. Pomozite da Vam pomognemo

Ukoliko tražite pomoć oko nekog problema, molimo Vas da učinite sve što je u Vašoj moći kako biste olakšali posao ljudima čiju pomoć očekujete. To ćete učiniti na sledeći način: iz poruke isključite sve što nema veze sa problemom, a detaljno objasnite sve što je direktno ili posredno povezano sa istim!
[ milos 2 @ 28.12.2013. 19:03 ] @
Kao prvo, problem sam opisao, a ako je nekome lakse da value object fajlove pisem ovde, zajedno sa php fajlom, nisam siguran koliko bi se dugo zadrzao proucavajuci kod, a onda to isto sa strane fleksa, ako je to jedini problem, nema prblema, stavicu u code tagove sve to, meni b licno bilo lakse da mi neko da sve fajlove, pa da ja nadjem gde je greska ako znam, ali ok stavkcu ti ovde tri fajla, pa se nadam da ces mi onda odgovoriti gde je greska
[ milos 2 @ 28.12.2013. 19:17 ] @
php fajlovi odgovorni za prikaz tabele sa knjigama i njihovim autorima:

Code:

knjiga.php

<?php
require_once('../vo/ep/includes/DbKonektor.php');    
require_once('../vo/ep/includes/VOGreska.php');
require_once('../vo/ep/VOKnjiga.php');
require_once('../vo/ep/VOKnjigaLista.php');

    class Knjiga{
        public function getListaKnjiga() {
        
        $greska = new VOGreska();
        $greska->uspesno = true;
        
        $ret = new VOKnjigaLista();
        $ret->greska = $greska;    
        
        try{
        
        
        $konektor = new DbKonektor();
                        
        
        $upit = "SELECT
                * FROM
                knjiga    
                ";
        $rezultat = $konektor->upit($upit);
        
        $ret->knjige = array();
        while ( $row = $konektor->fetchObject($rezultat) ) {
            $tmp = new VOKnjiga();
            
            $tmp->knjigaId = $row->knjigaId;
            $tmp->ISBN = $row->ISBN;
            $tmp->naziv= $row->naziv;
            $tmp->godIzdanja = $row->godIzdanja;
            $tmp->kolicina = $row->kolicina;
            $ret->knjige[] = $tmp;
        }
        
        $konektor->oslobodiResurse($rezultat);
        $konektor->zatvori();
        
        } catch(ConnectException $e) {
            $greska->uspesno = false;
            $greska->poruka = $e->getMessage();
            $ret->greska = $greska;
        } catch(SQLException $e) {
            $greska->uspesno = false;
            $greska->poruka = "GREŠKA PRILIKOM ČITANJA PODATAKA IZ BAZE:\n\n".$e->getMessage();
            $greska->stackTrace = $e->getTraceAsString();
            $ret->greska = $greska;
        }
        
        
        
        return $ret;
        }
//ova funkcija bi trebalo da vrati samo autore koji pripadaju odredjenoj knjizi
        public function getListaKnjigaautor( $knjigaId ) {
        
        $greska = new VOGreska();
        $greska->uspesno = true;
        
        $ret = new VOKnjigaLista();
        $ret->greska = $greska;    
        
        try{
        
        
        $konektor = new DbKonektor();
                        
        
        $upit = "SELECT autor.ime, autor.Prezime, autor.autorId, knjiga.knjigaId
                    FROM autor
                    INNER JOIN knjigaautor ON autor.autorId = knjigaautor.IdAutor
                    INNER JOIN knjiga ON knjiga.knjigaId = knjigaautor.IdKnjiga
                    where knjiga.knjigaId ='". $knjiga->knjigaId ."'
                    ";
        $rezultat = $konektor->upit($upit);
        
        $ret->knjigautori = array();
        while ( $row = $konektor->fetchObject($rezultat) ) {
            $tmp = new VOKnjiga();
            
            $tmp->ime = $row->ime;
            $tmp->Prezime = $row->Prezime;
            $tmp->knjigaId = $row->knjigaId;
            $tmp->autorId = $row->autorId;
            $ret->knjigautori[] = $tmp;
        }
        
        $konektor->oslobodiResurse($rezultat);
        $konektor->zatvori();
        
        } catch(ConnectException $e) {
            $greska->uspesno = false;
            $greska->poruka = $e->getMessage();
            $ret->greska = $greska;
        } catch(SQLException $e) {
            $greska->uspesno = false;
            $greska->poruka = "GREŠKA PRILIKOM ČITANJA PODATAKA IZ BAZE:\n\n".$e->getMessage();
            $greska->stackTrace = $e->getTraceAsString();
            $ret->greska = $greska;
        }
        
        
        return $ret;

}
}
?>

VOKnjiga.php

<?php
    class VOKnjiga{
        public $ime;
        public $Prezime;
        public $naziv;
        public $ISBN;
        public $knjigaId;
        public $godIzdanja;
        public $kolicina;
        public $autorId;
        
        var $_explicitType = "ep.VOKnjiga";
    }
?>

VOKnjigaLista.php

<?php
    class VOKnjigaLista {
    public $knjige;
    public $knjigautori;
    public $greska;
    
    //explicit actionscript klasa
    var $_explicitType = "ep.VOKnjigaLista";
}
?>



sa strane flex-a
Code:

stranica na kojoj se nalazi tabela:
//........
<s:RemoteObject id="knjige"
                        destination="ep.Knjiga" 
                        source="ep.Knjiga"
                        endpoint="amfphp/gateway.php"
                        showBusyCursor="true">
            <s:method name="getListaKnjiga" result="getListaKnjigaResult(event)" fault="faultHandler(event)"/>
            <!--<s:method name="deleteKorisnik" result="deleteKorisnikResult(event)" fault="faultHandler(event)"/>-->
        </s:RemoteObject>
        
        <s:RemoteObject id="knjigautori"
                        destination="ep.Knjiga" 
                        source="ep.Knjiga"
                        endpoint="amfphp/gateway.php"
                        showBusyCursor="true">
            <!--<s:method name="getListaKnjiga" result="getListaKnjigaResult(event)" fault="faultHandler(event)"/>-->
            <s:method name="getListaKnjigaautor" result="getListaKnjigaautorResult(event)" fault="faultHandler(event)"/>
            <!--<s:method name="deleteKorisnik" result="deleteKorisnikResult(event)" fault="faultHandler(event)"/>-->
        </s:RemoteObject>
//......................

[Bindable] private var tabela_Knjiga_Provider:ArrayCollection;
            [Bindable] public var lista_autora_provider:ArrayCollection;

private function initRequest():void {
                
                
                autori.getListaAutora.send( );
                izdavaci.getListaIzdavaca.send( );
                zanrovi.getListaZanrova.send( );
                tagovi.getListaTagova.send( );
                korisnici.getListaKorisnika.send( );
                knjige.getListaKnjiga.send( );
                knjigautori.getListaKnjigaautor.send( );
            }


private function getListaKnjigaResult(event:ResultEvent):void {
                
                if( !knjige.getListaKnjiga.lastResult.greska.uspesno )
                    Alert.show( knjige.getListaKnjiga.lastResult.greska.poruka, "GREŠKA" );
                
                else
                
                    tabela_Knjiga_Provider = new ArrayCollection(knjige.getListaKnjiga.lastResult.knjige);
                
            }
            
            private function getListaKnjigaautorResult(event:ResultEvent):void {
                
                if( !knjigautori.getListaKnjigaautor.lastResult.greska.uspesno )
                    Alert.show( knjigautori.getListaKnjigaautor.lastResult.greska.poruka, "GREŠKA" );
                
                else
                
                    lista_autora_provider = new ArrayCollection(knjigautori.getListaKnjigaautor.lastResult.knjigautori);
                
            }




<s:GridColumn headerText="Autori">
                                <s:itemRenderer>
                                    <fx:Component>
                                        <s:GridItemRenderer>
                                            <s:VGroup paddingTop="5" paddingLeft="5" 
                                                      paddingBottom="5" paddingRight="5"
                                                      verticalAlign="middle"
                                                      horizontalAlign="center">
                                        
                                                <s:List id="listaAutora" dataProvider="{outerDocument.lista_autora_provider}" labelField="ime"/>
                                            </s:VGroup>
                                        </s:GridItemRenderer>
                                    </fx:Component>
                                </s:itemRenderer> 
                            </s:GridColumn>


slika tabele:



grska pri ucitavanju flash fajla u chrome-u:
Code:
Missing argument 1 for Knjiga::getListaKnjigaautor()


nadam se da ce sada biti lakse
[ djoka_l @ 28.12.2013. 19:27 ] @
Argument funkcije getListaKnjigaautor je $knjigaId, a ti praviš upit sa $knjiga->knjigaId.

Pomoglo bi kada debaguješ program da ispišeš SQL upit, onda bude mnogo jasnije...
[ milos 2 @ 28.12.2013. 19:34 ] @
dobro, ali opet ostaje greska koju mi flex izbacuje:
Code:
Missing argument 1 for Knjiga::getListaKnjigaautor()
dok kada u service browser-u pokrenem funkciju, ja dobijem niz autora koji odgovara upitu. naravno kada ja upisem knjigaId


[ djoka_l @ 28.12.2013. 20:11 ] @
Ne znam flex bas, ali koliko vidim, nemaš za method getListaKnjigaautor <arguments>. Još jednom, ne znam mnogo o flex-u, ali ne shvatam kako možeš da pozivaš metod bez argumenata...
[ milos 2 @ 28.12.2013. 21:24 ] @
U sustini body je prazan, nista se ne prenosi, pa skoci u cech deo koda, u sustini sam cuo da treba php da se vrti u nekoj petlji, i na servisnom sloju se da treba da se sparuje, i onda da niz odlazi na fleks, ali to ne znam kako da napravim
[ MenOfHonor @ 29.12.2013. 00:03 ] @
Kada pozivaš metod getListaKnjigaautor() moraš da proslediš argument $knjigaId, zbog čega ti i Flex prijaljuje grešku. Pored toga, rekao bih da problem leži u samom upitu:
Code:
$upit = "SELECT autor.ime, autor.Prezime, autor.autorId, knjiga.knjigaId
FROM autor
INNER JOIN knjigaautor ON autor.autorId = knjigaautor.IdAutor
INNER JOIN knjiga ON knjiga.knjigaId = knjigaautor.IdKnjiga
where knjiga.knjigaId ='". $knjiga->knjigaId ."'";

Ne vidim gde si uopšte definisao promenljivu $knjiga. S obzirom da želiš metodu getListaKnjigaautor() da proslediš argument $knjigaId onda bi poslednja linija upita u klauzuli WHERE trebala da izgleda ovako:
Code:
$upit = "SELECT autor.ime, autor.Prezime, autor.autorId, knjiga.knjigaId ";
$upit .= "FROM autor ";
$upit .= "INNER JOIN knjigaautor ON autor.autorId = knjigaautor.IdAutor ";
$upit .= "INNER JOIN knjiga ON knjiga.knjigaId = knjigaautor.IdKnjiga ";
$upit .= "WHERE knjiga.knjigaId = $knjigaId";

Malo sam izmenio upit kako bi bio čitljiviji, a s obzirom da je lokalna promenljiva $knjigaId tipa int ne moraš da je stavljaš pod apostrofe. Takođe bih ti preporučio da koristiš pripremljene naredbe (prepared statements) kako bi upiti bili bezbedniji i brže se izvršavali u situacijama kada imaš više upita kod kojih se samo vrednosti menjaju.
[ milos 2 @ 29.12.2013. 11:44 ] @
e to, ne znam kako da prosledim parametar knjigaId iz flex-a. probao sam da ovde:
Code:
private function initRequest():void {
                
                autori.getListaAutora.send( );
                izdavaci.getListaIzdavaca.send( );
                zanrovi.getListaZanrova.send( );
                tagovi.getListaTagova.send( );
                korisnici.getListaKorisnika.send( );
                knjige.getListaKnjiga.send( );
                knjigautori.getListaKnjigaautor.send(knjigaId );
            }
da dodam u zagrade knjigaId, medjutim onda mi u kompajliranju daje gresku da promenljiva ne postoji, naravno, pa je ja onda napravim iznad svih funkcija napisem
Code:
public var knjigaId:VOKnjiga;
i sada nemam ni jednu gresku prilikom kompajliranja, ali i dalje nece da prosledi parametar koji sam mu dao, odnosno prenosi null.

sto se tice upita, da vec sam ispravljen oko toga, ta greska je nastala u raznim eksperimentisanjima sa upitom, a stavljam je pod navodnike jer sam cuo da flex radi samo sa JSON-om, pa ne znam kako prenosi int, pa da budem siguran.