Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kategorije i prikaz podforuma u njima?

[es] :: PHP :: Kategorije i prikaz podforuma u njima?

[ Pregleda: 1945 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_CaRtMan_

Član broj: 126731
Poruke: 305
*.PPPoE-5548.sa.bih.net.ba.



+1 Profil

icon Kategorije i prikaz podforuma u njima?14.02.2008. u 09:54 - pre 196 meseci
Code:
 $query = mysql_query("SELECT * FROM forum_kategorije");
while($a=mysql_fetch_array($query)){
$kategorije[] = $a;

$query = mysql_query("SELECT * FROM forum_podforumi WHERE kat='$a[id]'");
while($a=mysql_fetch_array($query)){
$podforumi[] = $a;
}


}

$smarty->assign('podforumi', $podforumi);
$smarty->assign('kategorije', $kategorije);  


Code:
<table width="100%" border="0" cellspacing="2" cellpadding="3">
{foreach from=$kategorije item=sta}
<tr>
<td width="43%" height="23" bgcolor="#73B000">{$sta.naziv}</td>
</tr> {/foreach}

</table>

<table width="100%" border="0" cellspacing="2" cellpadding="3">
{foreach from=$podforumi item=sta}<tr>
<td width="5%" height="23" bgcolor="#E5E5E5">Ovdje slika </td>
<td width="43%" bgcolor="#E5E5E5">{$sta.naziv}<br />
{$sta.opis}</td>
<td width="8%" bgcolor="#E5E5E5"><div align="center">{$sta.tema}</div></td>
<td width="10%" bgcolor="#E5E5E5"><div align="center">{$sta.postova}</div></td>
<td width="34%" bgcolor="#E5E5E5"><div align="center">Trenutno nema postova. </div></td>
</tr>{/foreach}
</table>


Prikazuje mi samo prvu kategoriju i podforume u njoj. Ostale nista???
 
Odgovor na temu

holodoc

Član broj: 171974
Poruke: 25



Profil

icon Re: Kategorije i prikaz podforuma u njima?14.02.2008. u 23:22 - pre 196 meseci
Ne vidim da ti je bilo gde u kodu deklarisana promenjljiva $id a koristiš je pri upitu u bazu za izlistavanjem podforuma. Ako je promenjljiva neinicirana a tebi iz nekog razloga kao prva vrednost identifikacije podforuma u bazi stoji vrednost nula uvek ćeš kao rezultat upita dobiti vrednost prvo unetog infa o podforumu tj. prvi uneti zapis. Sve ovo naravno zavisi i od strukture tabele u koju se smeštaju podaci.

Kao drugo, imao bih ozbiljniju primedbu na tvoj pristup očitavanju podataka iz baze podataka Pošto očigledno pokušavaš da dizajniraš dobar forumski sistem jedan od koraka bi svakako trebala i da bude što je moguće veći stepen optimizacije saobraćaja tj. pokušaj da smanjiš potrebu za komunikacijom php-a i baze podataka. Pogledaj tvoj kod. Ti prvo učitavaš kompletan spisak kategorija iz baze (što je jedan upit) a zatim za svaku od tih kategorija radiš po jedan upit za iščitavanje podforuma koji pripadaju toj kategoriji. Zamisli da imaš stotinak podforuma. Prvi problem je što će ti kod uraditi proveru za podforumima čak i kada postoji samo kategorija a ne i njemu dodeljeni podforumi a ako drugo za svaku od kategorija ide po jedan upit. Zamisli sada pedesetak korisnika koji zahtevaju tvoju stranicu na jednom recimo osrednje posećenom sajtu. Čini mi se da ti je jasno da bi se veliki teret postavljao pred komunikaciju između MySQL-a i php-a.

Moja preporuka je da kada god možeš koristiš JOIN operacije. Na taj način bi sve potrebne podatke mogao da povučeš jednim jedinim upitom a s obzirom da je svaka obrada na serveru brža od uzastopne obrade na MySQL serveru trud će se isplatiti

Konkretno tvoj dupli upit bi mogao da se odradi na sledeći način pod uslovom da obe tabele (forum_podforumi i forumi_kategorije) imaju zajedničko polje kategorija koja je u tabeli forumi_kategorije primarni ključ a u tabeli forumi_podforumi pravi ili simulirani strani ključ. Tada bi jednim jedinim pozivom sledećeg SQL-a dobio apsolutno sve podatke u bazi koji su ti potrebni za uspešan ispis tvoje tabele. Ne bi ti trebale čak ni uzastopne while petelje
Code:
SELECT forumi_podforumi.*, forumi_kategorije.* FROM forumi_podforumi LEFT JOIN forumi_kategorije ON forumi_podforumi.kategorija=forumi_kategorije.kategorija GROUP BY forumi_podforumi.podforumID ORDER BY forumi_podforumi.podforumID ASC

U prethodnom kodu vrednost podforumID je u stvari primarni ključ podforuma (pretpostavio sam da je u pitanju autoincrement polje tipa broj).
Na ovaj način si u jednom upitu dobio sve podatke o podforumima na koje su u odgovarajućim kolonama dodati i svi podaci o kategorijama i to još grupisane po kategoriji i poređane po rednom broju podforuma u rastućem redosledu.

Izvinjavam se ako sam preterao sa detaljima ali učinilo mi se da je ovo dobro mesto za ovakvu napomenu
 
Odgovor na temu

_CaRtMan_

Član broj: 126731
Poruke: 305
89.146.163.*



+1 Profil

icon Re: Kategorije i prikaz podforuma u njima?15.02.2008. u 09:24 - pre 196 meseci
Odličan post oko optimizacije i sl. Hvala puno.

Kod sam malo preuredio:

Code:

SELECT forum_podforumi.*, forum_kategorije.* FROM forum_podforumi LEFT JOIN forum_kategorije ON forum_podforumi.kat=forum_kategorije.id GROUP BY forum_podforumi.id ORDER BY forum_podforumi.id ASC


Evo kako izgleda struktura same baze:



Ja napisem u tpl: {$sta.forum_kategorije.naziv} i nista

I vidim da mi ima tri kategorije, tj prikazace mi tri kategorije (zelena bgcolor bez nzaiva) mislim da se to ne moze rjesiti na ovaj nacin. Zato sto forum_podforumi.kat = forum_kategorije.id ; Tako da ispade ako ima puno podforuma ima i kategorija. Jedno da se ne ponavljaju kategorije.

{foreach from=$forum item=sta}
<tr>
<td width="43%" height="23" bgcolor="#73B000">{$sta.forum_kategorije.naziv}</td>
</tr> {/foreach}

..... I kako cu citati kada ovako imam join ovaj.

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

EDIT:

Kad dodjem ovo:

Citat:


$query = mysql_query("SELECT forum_podforumi. * , forum_kategorije. * , forum_kategorije.id AS kat_id, forum_kategorije.naziv AS kat_naziv
FROM forum_podforumi
LEFT JOIN forum_kategorije ON forum_podforumi.kat = forum_kategorije.id
GROUP BY forum_podforumi.id
ORDER BY forum_podforumi.id ASC");
while($a=mysql_fetch_array($query)){
$forum[] = $a;

}


I vamo:

Citat:

{foreach from=$forum item=sta}
<tr>
<td width="5%" height="23" bgcolor="#E5E5E5">Ovdje slika </td>
<td width="43%" bgcolor="#E5E5E5">{$sta.naziv}<br />
{$sta.opis}</td>
<td width="8%" bgcolor="#CCCCCC"><div align="center">{$sta.tema}</div></td>
<td width="10%" bgcolor="#CCCCCC"><div align="center">{$sta.postova}</div></td>
<td width="34%" bgcolor="#E5E5E5"><div align="center">Trenutno nema postova. </div></td>
</tr>{/foreach}
</table>


PRikaze tri kategorije, pa podforuma tri. I to ne u kategorijama, vec poslije. A trebalo bi dvije kategorije.
 
Odgovor na temu

holodoc

Član broj: 171974
Poruke: 25



Profil

icon Re: Kategorije i prikaz podforuma u njima?16.02.2008. u 11:26 - pre 196 meseci
Ako sam dobro razumeo ono što si napisao tebi treba način da lepo i kulturno uradiš prikaz svih kategorija podforuma zajedno sa kategorijama kojima ti podforumi pripadaju. Drugim rečima način da se podforumi prikazuju na sledeći način:

Kategorija1
+Podforum 1
+Podforum 2
+Podforum 3
Kategorija 2
+Podforum 4
+Podforum 5
...

U tom slučaju prethodni JOIN izraz možeš da modifikuješ tako da se umesto vezivanja kategorija za podforume uradiš obrnutu stvar tj. da se vezuju podforumi za kategorije. Za tu potrebu možeš umesto LEFT JOIN-a da koristiš recimo RIGHT JOIN ali ti ja preporučujem da uradiš LEFT JOIN i to na sledeći način.
Code:
SELECT forum_podforumi.*, forum_kategorije.* FROM forum_kategorije LEFT JOIN forum_podforumi ON forum_podforumi.kat=forum_kategorije.id GROUP BY forum_kategorije.id ORDER BY forum_kategorije.id ASC

Kao što ćeš videti ovim izrazom za svaku kategoriju vezuješ sve njegove podforume a ne obrnuto što je u ovom slučaju logičnije. Jedina stvar koju ti ovde treba da uradiš jeste da uradiš ispisivanje podataka.

Još par stvari u vezi optimizacije

Kao prvo, ako sam dobro ukapirao čemu treba da ti služi polje tema u tom slučaju tvoja baza ne ispunjava uslove normalizovanosti tabela. Drugim rečima, ako ti tema polje služi da u njemu napišeš koja tema pripada datom podforumu (i to po jedna tema za jedan zapis) u tom slučaju, povrh svega, baza pati od anomalije ažuriranja i brisanja. Ako si hteo da napraviš bazu koja će biti sposobna da vodi računa o kategorijama, podforumima i temama trebalo je da polje sa temama koje pripadaju odgovarajućem podforumu odvojiš u posebnu tabelu. Onako laički rečeno problem je u tome što ako recimo obrišeš određeni podforum automatski gubiš info o njemu pripadajućim temama i sl. Isto tako nemoj nikada da u bazu skladištiš podatke do kojih se može doći analizom već postojećih podataka u njoj. Primera radi u tvojoj bazi skladištiš vrednost postova tj. u toj koloni skladištiš ukupan broj postova u nekom podforumu. Taj problem se zove redunsansa podataka tj. skladištenje viška nepotrebnih podataka jer si taj podatak mogao da dobiješ jednostavnim upitom tipa
Code:
SELECT COUNT(id) AS postova FROM forum_podforumi WHERE forum_podforumi.kat=ovde_ide_broj_kategorije

Ovo je veoma jednostavan primer a kompletna stvar se može dodatano optimizovati kombinovanjem u okviru jednog jedinog složenijeg upita.

Važna napomena: Ova fora sa COUNT-om nije preporučljiva ako su ti tabele u bazi tipa InnoDB a baza povelika jer se brojanje vrši bukvalnim proveravanjem svakog pojedinačnog zapisa što znači da će ti aplikacija pokazivati strašan pad performansi rada

Kako da rešiš problem vezan za tabele? Tako što ćeš kao što rekoh da odvojiš teme u posebnu tabelu i kasnije kad ti zatreba da koristiš JOIN operaciju.

Dakle tabele trebaju da ti izgledaju ovako:

podforumi(id, naziv, opis, kat, slika)

kategorije(id, naziv)

teme(temaID, forumID)

To bi bilo to za danas Puno sreće u radu jer su počeci najuzbudljiviji
 
Odgovor na temu

_CaRtMan_

Član broj: 126731
Poruke: 305
*.PPPoE-1620.sa.bih.net.ba.



+1 Profil

icon Re: Kategorije i prikaz podforuma u njima?18.02.2008. u 19:38 - pre 196 meseci


Prikaze mi dva podforuma, vjerovatno (sigurno) radi ovoga:

... ON forum_podforumi.kat=forum_kategorije.id ...

A treba tri da prikaze.

 
Odgovor na temu

holodoc

Član broj: 171974
Poruke: 25



Profil

icon Re: Kategorije i prikaz podforuma u njima?18.02.2008. u 20:33 - pre 196 meseci
Nije problem u uslovu JOIN-a već u pogrešnom tipu JOIN-a za ovu priliku. Nisam uzeo u obzir za trenutak da mogu postojati kategorije bez podforuma. Rešenje bi trebalo da bude korišćenje INNER JOIN-a
 
Odgovor na temu

_CaRtMan_

Član broj: 126731
Poruke: 305
*.PPPoE-2344.sa.bih.net.ba.



+1 Profil

icon Re: Kategorije i prikaz podforuma u njima?19.02.2008. u 10:53 - pre 196 meseci
Kad upišem:

Code:
SELECT forum_podforumi. * , forum_kategorije. *
FROM forum_kategorije
INNER JOIN forum_podforumi ON forum_podforumi.kat = forum_kategorije.id
GROUP BY forum_kategorije.id
ORDER BY forum_kategorije.id ASC


Opet prikaže isto, kao gore. Dakle, dva podforuma.
 
Odgovor na temu

[es] :: PHP :: Kategorije i prikaz podforuma u njima?

[ Pregleda: 1945 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.