[ milos 2 @ 10.01.2014. 18:27 ] @
pozdrav, php-u prosledjujem niz autora neke knjige, i potrebno mi je da se to unese u bazi. ja sam napravio php koji bi trebalo to da radi, ali ne radi, pa bih vas zamolio da mi kazete gde je greska.

Code:

public function insertKnjiga($knjiga=NULL, $autorId, $zanrId=NULL, $tagId=NULL, $izdavacId=NULL ) {
                
                $greska = new VOGreska();
                $greska->uspesno = true;
                
                try{
            
                
                $konektor = new DbKonektor();
                    
                //dodavanje podataka u tabelu
                $upit = "INSERT INTO 
                            knjiga (ISBN, naziv, godIzdanja, kolicina) 
                        VALUES (
                            '" . $knjiga->ISBN . "',
                            '" . $knjiga->naziv . "',
                            '" . $knjiga->godIzdanja . "',
                            '" . $knjiga->kolicina . "'
                        )
                    ";
                    $autorId=array();
                foreach($autorId as $niz){    
                $upit1 = "INSERT INTO
                            knjigaautor (IdKnjiga, IdAutor)
                         VALUES (
                             LAST_INSERT_ID(), $niz
                         )
                         ";
                         $autorId[] = $niz;
                $konektor->upit($upit1);         
                }
                         
                $upit2 = "INSERT INTO
                            knjigazanr (IdKnjiga, IdZanr)
                         VALUES (
                             LAST_INSERT_ID(), $zanrId
                         )
                         ";
                         
                $upit3 = "INSERT INTO
                            knjigaizdavac (IdKnjiga, IdIzdavac)
                         VALUES (
                             LAST_INSERT_ID(), $izdavacId
                         )
                         ";
                $konektor->upit($upit);
                //$konektor->upit($upit1);            
                $konektor->upit($upit2);
                $konektor->upit($upit3);    
                
                //zatvaranje konekcije
                $konektor->zatvori();
                
                } catch(ConnectException $e) {
                    $greska->uspesno = false;
                    $greska->poruka = $e->getMessage();
                } catch(SQLException $e) {
                    $greska->uspesno = false;
                    $greska->poruka = "GREÅ KA PRILIKOM UNOSA NOVIH PODATAKA U BAZI:\n\n".$e->getMessage();
                    $greska->stackTrace = $e->getTraceAsString();
                }        
                
                return $greska;    
                }
}


u napred hvala.
[ peromalosutra @ 11.01.2014. 09:17 ] @
Zasto kažeš da ne radi? Sastavni dio programiranja je nalaženje i ispravljanje grešaka u kodu. U tu svrhu možes koristiti debugere, ali za učenje i jednostavnije situacije kao sto je ova, dovoljno je i tzv. printf debugovanje koje ne traži nikakvu dodatnu konfiguraciju.

Neki standardni proces inicijalnog testiranja koda ide ovako nekako:
1. Provjeriš kod i ispraviš eventualne sintaksne greške.
2. Pogledaš da li se kod uredno završio ili si dobio neki error. Ako imas runtime error, onda će te opis greške ili stack trace uputiti na mjesto gdje je nastala greška.
3. Ako nema errora, a i dalje nije odrađeno to što si očekivao, onda je greška logičkog tipa, tj. kod se izvršava uredno, ali to što si ti tražio da ti kod odradi nije ono što ti zapravo hoćeš. Ovo je najčešći tip greške i onaj koji traži najviše vremena da se ispravi. Da bi našao gdje je greška, moraš imati u glavi sliku potrebnih koraka koji bi te trebali dovesti do rješenja problema (algoritam), zatim pratiš kod cjelinu po cjelinu i nakon svake cjeline dumpuješ rezultate nekih ključnih promjenjivih i provjeravaš da li je u njima ono što ti očekuješ. U jednom trenutku slaganja neće biti i nakon popravljanja tog dijela vraćaš se na početak i ponavljaš ove korake dok sve ne proradi.

Često je zgodnije ići unazad. Npr. imaš problem da se nešto ne upisuje u tabelu. Prvi krivac ti je upit za upis jer da se on izvršava kako treba sve bi bilo ok. Echuješ taj upit i ako ti se čini ok, pokušaj ga izvršiti direktno kroz mysql cli / phpmyadmin / mysql workbench itd i vidi dobijaš li grešku. Kod prepared statementa moraš prije toga zamijeniti vrijednosti u taj upit. Ako upit pravi sintaksnu grešku, riješiš to. Ako je problem u nekoj vrijednosti koja se ubacuje u upit, a koja dolazi od izvršavanja nekog koda prije upita, onda prelaziš na taj dio i backtrajsuješ dok ne nađeš krivca.
[ gotivac @ 11.01.2014. 20:38 ] @
Trenutno nemam vremena da ti pratim ceo kod, ali već ovde:

Code:

    $autorId=array();
    foreach($autorId as $niz){    


vidim nelogičnost. Prvo si promenljivoj $autorId dodelio vrednost praznog niza, a onda hoćeš da se krećeš u petlji po njemu.

Drugim rečima, nakon prvog reda je jasno da se foreach petlja ispod neće izvršiti nijedanput jer je $autorId prazan.

Još nešto, vidim da koristiš $knjiga->ISBN, $knjiga->naziv i tako dalje. To možeš da radiš samo ako je knjiga objekat, ako je u pitanju niz, koristi sintaksu $knjiga['ISNB'], $knjiga['naziv']...
[ milos 2 @ 11.01.2014. 22:58 ] @
peromalosutra

sve to sam vec uradio kroz serviceBrowser u amfPHP-u, upit je ispravan i lepo radi kada sklonim sve sto se tice foreach petlje.

gotivac:

knjiga jeste objekat. ali sta da stavim, da je to niz autorId-jeva koji dolaze na kao parametar funkcije. da li moze malo objasnjenje kako da uradim da mi hvata jedan po jedan koliko god da ih dodje sa nekog interfejsa?