DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > PHP
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

PHP PHP aplikacije, Smarty, PEAR

Odgovori
 
Alati teme Način prikaza
Staro 03. 09. 2009.   #1
pocetnik00
novi član
 
Datum učlanjenja: 03.09.2009
Poruke: 3
Hvala: 0
0 "Hvala" u 0 poruka
pocetnik00 is on a distinguished road
Default prikaz svih vesti po kategorijama

imam jedan problem, i ne znam kako bih ga resio, a da to bude samo sa jednim upitom..

vesti uzimam iz baze, sa sve kategorijom u kojoj se nalaze:
Kôd:
$vesti=$db->get_results("SELECT vesti.id, vesti.title, category.name as cname FROM vesti LEFT JOIN category ON category.id=vesti.cat_id");
I sad imam array sa vestima i njihovim kategorijama:
Kôd:
Array
(
    [0] => stdClass Object
        (
            [title] => Vest1
            [id] => 1
            [cat_id] => 1
            [cname] => Kategorija1
        )

    [1] => stdClass Object
        (
            [title] => Vest2
            [id] => 2
            [cat_id] => 1
            [cname] => Kategorija1
        )

    [2] => stdClass Object
        (
            [title] => Vest3
            [id] => 3
            [cat_id] => 2
            [cname] => Kategorija2
        )
   [3] => stdClass Object
        (
            [title] => Vest4
            [id] => 3
            [cat_id] => 2
            [cname] => Kategorija2
        )
kako sad da ispisem sve vesti po kategorijama?
Znaci ovako nesto da dobijem:

Kôd:
<ul>
<li>Kategorija 1
  <ul>
   <li>Vest 1</li>
   <li>Vest 2</li>
 </ul>
</li>
<li>Kategorija 2
  <ul>
   <li>Vest 3</li>
   <li>Vest 4</li>
 </ul>
</li>
</ul>
Hvala unapred
pocetnik00 je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #2
eraser
profesionalac
Qualified
 
Avatar eraser
 
Datum učlanjenja: 24.08.2009
Lokacija: Berlin
Poruke: 101
Hvala: 37
300 "Hvala" u 17 poruka
eraser is on a distinguished roaderaser is on a distinguished roaderaser is on a distinguished roaderaser is on a distinguished road
Default

Ne znam dal sam dobro razumeo pitanje, ali evo odgovora kako bi mogao da "odradis".
U upitu stavis da ti sortira po id_cat,
sada sledi ispis podataka,
na pocetku stavis temp_cat = stdClass[0].cat_id i krenes u petlju za sve podatke, prilikom obrade sledeceg podatka pitas da li je temp_cat == stdClass[i].cat_id,
ako jeste to znaci da je to jos jedna vest iz te kategorije,
a ako nije jednako onda znaci da je nova kategorija.
Kada predjes u novu kategoriju moras da postavis temp_cat = stdClass[i].cat_id.
eraser je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #3
dootzky
profesionalac
Professional
 
Avatar dootzky
 
Datum učlanjenja: 11.10.2006
Lokacija: beograd, srbija
Poruke: 271
Hvala: 32
10 "Hvala" u 7 poruka
dootzky is on a distinguished road
Default

ili kako eraser kaze, ili to prosto uradi sa vise protrcavanja kroz bazu, nagadjam da nemas ni 100 unosa za sada? nek imas i 1000, pa opet nije puno...

1) prosto protrci i pokupi sve kategorije, sortiraj po volji
2) foreach($cat ..) $cat['news'] = get_news($id_cat); ...

right? :P

ne kazem da je preterano pametno resenje, ali je brzo i efektno (pragmatichno)
dootzky je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #4
LiquidBrain
Milan Cvejic
Wrote a book
 
Avatar LiquidBrain
 
Datum učlanjenja: 05.09.2006
Lokacija: Beograd
Poruke: 1.241
Hvala: 32
73 "Hvala" u 56 poruka
LiquidBrain će postati "faca" uskoro
Pošaljite poruku preko Yahoo za LiquidBrain
Default

@dootzky
Ne vidim razlog zasto bi za svaku vest ponovo pristupao bazi? Malo ne efikasno?
__________________
http://weevify.com
LiquidBrain je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #5
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

možeš jednim querijem ali moraš malo da promuljaš niz koji dobiješ.

PHP kôd:
// $data je tvoje niz koji dobiješ iz baze
$kategorije = array();
foreach (
$data as $row)
{
    if (!isset(
$kategorije[$row['cat_id']]))
    {
        
$kategorije[$row['cat_id']] = array();
    }

    
$kategorije[$row['cat_id']] [] = $row;

dobices bas tako kako su napravio tvoje ugnjezdene liste

$kategorije = array
(
[1] => array (vest 1, vest 2),
[2] => array (vest 3, vest 4),
);
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #6
pocetnik00
novi član
 
Datum učlanjenja: 03.09.2009
Poruke: 3
Hvala: 0
0 "Hvala" u 0 poruka
pocetnik00 is on a distinguished road
Default

@bluesman
Probacu tako ako ne uspem na ovaj nacin sto je eraser predlozio..


Uglavnom sad uspevam nesto da uradim, ali problem je sto u petlji ne znam koji je prethodni element bio, tako da kada ispisem kategoriju, ako u njoj ima vesti onda se ne ispise prva vest, jer u tom prolazu ispisem samo naziv kategorije..

A akada ispisem i naziv vesti onda mi se brka ispis, zakomplikovao sam mnogo, vise ni sam ne znam gde gresim..

Kôd:
$temp_cat = $artikli[0]->cat_id;

$open_cat=false;
echo "<ul>\n";
echo "<li>" . $artikli[0]->cname ."\n";
foreach ($artikli as $a) {
    if ($temp_cat == $a->cat_id){ //iz iste kategorije
        if (!$open_cat) { $open_cat=true;}//otvara se kategorija
        echo "\t\t<li>$a->title</li>\n";
    } else { //nova kategorija
        if ($open_cat){ echo "\t</ul>\n"; $open_cat=false;} //zatvara se kategorija
        $temp_cat=$a->cat_id;
        echo "</li>\n"; //zatvara se prethodni li
        echo "<li>$a->cname \n";
        echo "\t<ul>\n";
        echo "<li>$a->title</li> \n";
    }
}
Znam da sam imao neku funkciju koja na osnovu niza ispisuje katgorije/vesti, znam da se koristile neke rekurzivne funkcije, ali sam zaboravio kako tacno ide..
pocetnik00 je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #7
pocetnik00
novi član
 
Datum učlanjenja: 03.09.2009
Poruke: 3
Hvala: 0
0 "Hvala" u 0 poruka
pocetnik00 is on a distinguished road
Default

bluesman resenje se pokazalo nekako najlakse, ali moraju(?!) 2 upita zbog praznih kategorija..

Kôd:
$vesti=$db->get_results("SELECT vesti.id, vesti.title, category.name as cname FROM vesti LEFT JOIN category ON category.id=vesti.cat_id");

$kategorije2=$db->get_results("SELECT category.id,category.title FROM category order by category.id asc");

$kategorije = array();
foreach ($vesti as $row)
{
    if (!isset($kategorije[$row->cat_id]))
    {
        $kategorije[$row->cat_id] = array();
    }

    $kategorije[$row->cat_id][] = $row;
}



//echo "<pre>"; print_r($kategorije); echo "</pre>"; die();

echo "<ul>\n";
foreach ($kategorije2 as $cat) {
    echo "<li>$cat->title\n";
    if (!empty($kategorije[$cat->id])) {
        echo "\t<ul>\n";
        foreach ($kategorije[$cat->id] as $a){
            echo "\t\t<li>$a->title</li>\n";

        }
        echo "\t</ul>\n";
    } else {


    }
    echo "</li>\n";

}

echo "</ul>\n";
bitno je da radi, ali ako ima neki predlog kako ovo resiti sa jednim upitom, neka da ideju
pocetnik00 je offline   Odgovorite uz citat
Staro 03. 09. 2009.   #8
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Ček, hajde kada smo već krenuli sa ovim, da isteramo do kraja

Vrlo važno pitanje? Da li ti hoćeš da se listaju SVE kategorije ili samo one u kojima ima vesti? Od toga zavisi sve.

Ovaj 2. query ti je nepotreban u bilo kom slučaju.

Ako ćeš da listaš SVE kategorije, čak i one koje nemaju vesti, onda je najlakše da koristiš RIGHT JOIN kategorija, tako ćeš dobiti sve. Probaj:

"SELECT vesti.id, vesti.title, category.name as cname FROM vesti RIGHT JOIN category ON category.id=vesti.cat_id"

Trebalo bi da dobiješ ovako nešto
Kôd:
  id         title        cname
   1     naslov 1        kategorija 38
   2     naslov 2        kategorija 12
   3     naslov 3        kategorija 99
 null      null          kategorija 205 koja nema vesti
 null      null          kategorija 392 koja nema vesti
Ali je onda i ono "muljanje" malo drugacije nego sto sam ti napisao.

I samo jedna napomena: mysql querije u foreach petlji izvršavaš isključivo pod pretnjom smrću.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Odgovori



Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

Slične teme
Tema Početna poruka teme Forum Odgovori Poslednja poruka
Selektovanje odredjenih dana ali svih godina Ivan SQL baze podataka - Sponzor: Baze-Podataka.net 7 10. 02. 2009. 16:23
Redirekcija svih strana na main page Visitors Regular expression i htaccess 10 09. 01. 2008. 12:33
Potrebni .NET (C#) programeri svih nivoa mvrbaski Poslovne ponude i zapošljavanje 0 21. 07. 2007. 12:44
kako iz utf8 enkodiranog stringa napraviti niz svih reči od bar 3 karaktera? noviKorisnik PHP 4 09. 03. 2006. 00:58


Vreme je GMT +2. Trenutno vreme je 00:47.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.