« 1 2 »
Autor Zpráva
daddy
Profil *
Ahoj, potřeoboval bych pomoct. Mám stránku, kde mám vypsané filmy a ty jsou rozdělené podle kategorii. Film muůže mít více kategorií a proto to mám udělané do 2 tabulek, ale nejde mi stále mi to nejde sestavit. Udělal jsem si tabulku filmy, kategorie a spojení mezi kategoriemi a filmem (nemusí se použít). Nemohl by mi někdo prosím poradit? Díky.
Majkl578
Profil
Pokud žádáš o věštbu z koule, jsi na špatném místě. V opačném místě zkus přiložit nefunkční kód. Teoreticky může být chyba v čemkoliv.
daddy
Profil *
No já bohužel zatím žádný nemám, potřeboval bych popostrčit, ja nevim jak to udělat. Nemohl by jsi mě "pošťouchnout"? Díky.
WanTo
Profil
Budeš potřebovat tabulku filmů, tabulku kategorií a pak třetí, vazební tabulku - ve vazební tabulce pak budeš mít vždy ID filmu, kterému přiřazuješ kategorii, a vedle něj ID kategorie, kterou chceš použít. Například:

Tabulka filmů:
ID | jméno filmu
 1 | Vykoupení z věznice Shawshank
 2 | Forrest Gump
 3 | Přelet nad kukaččím hnízdem


Tabulka kategorií:
ID | jméno kategorie
 1 | Drama
 2 | Komedie
 3 | Romantický


Nakonec vazební tabulkou filmy a kategorie propojíš:
Film | Kategorie
   1 | 1  // Vykoupení z věznice Shawshank je Drama
   2 | 1  // Forrest Gump je Drama
   2 | 2  // Forrest Gump je Komedie
   2 | 3  // Forrest Gump je Romantický
   3 | 1  // Přelet nad kukaččím hnízdem je Drama



Doufám, že tenhle příklad poslouží líp než suché vysvětlování... rozumíš principu, SQL dotaz si dokážeš sestavit?
daddy
Profil *
Jsi hodný, ale hned na začátku jsem psal, že mám 3 tabulky = přesně to, co jsi napsal. Nastáva tu problém ten, že si nevím rady jak udělat právě ten SQL dotaz.
WanTo
Profil
No dobře... a co má SQL dotaz, který neumíš sestavit, zjišťovat? Ono z těch 3 tabulek toho jde vytáhnout celkem hodně :o)
daddy
Profil *
Základ by asi byl ten, že když kliknu třeba na animované tak mi vyjedou podle toho filmy.
WanTo
Profil
SELECT * FROM filmy, propojeni WHERE propojeni.kategorie = id_nějaké_kategorie AND propojeni.film = filmy.ID


Možná to půjde nějak pomocí joinů, ale to by musel poradit někdo v tomhle ohledu vzdělanější...
daddy
Profil *
Když se tak zamýšlím nad tvým kódem, přicházim na to, že to tak nepujde, protože já nevím ID filmu. Představ si hlavni stranku kde mám vybrané všechny filmy z db. A nahoře budou odkazi: animované, komedie, drama. Kliknu na animovane a potřebuju, aby se mi zobrazily vsechny filmy, které obsahují žánr "animovane".
AM_
Profil
daddy:
Když se tak zamýšlím nad tvým kódem, přicházim na to, že to tak nepujde, protože já nevím ID filmu.
Tady problém není. ID filmu vědět nemusíš, SQL dotaz říká (zjednodušeně) "Spoj řádky tabulky "filmy" a "propojeni" tam, kde se id filmu rovná.
Lepší je ale používat JOIN, funguje vnitřně lépe (rovnou vybírá správné kombinace, kdežto předchozí dotaz vytvoří všechny možné kombinace film-propojeni-kategorie a pak vyfiltruje jen vyhovující, což je příšerný overhead.
Má to být nějak takto
   SELECT
     `filmy`.`name` AS filmname,
     `kategorie`.`name` AS katname
   FROM `filmy`
   LEFT JOIN `propojeni` ON `filmy`.`id`=`propojeni`.`film`
   LEFT JOIN `kategorie` ON `propojeni`.`kategorie`=`kategorie`.`id`
   WHERE `kategorie`.`id`=(id aktualni kategorie)
radvis
Profil *
To je asi přesně to, co potřebuju. Nemohl by jsi mi prosím popsat jak to funguje? A vypíšu to nějakým cyklem? Potřeboval bych vypsat všechny záznamy, co mám v db. Díky.

Jde mi hlavně o to, že bych potřovoval z těch filmů vytáhnout všechno (id, nazev .... ), ale nedaří se mi to rozjet, díky.

Tak na to už jsem taky přišel jak to udělat. Teď řeším problém ten, že když dám $xx->nazevFilmu tak to vypise nazve filmu, ale kdyz dam $xx->id tak to vypíše id kategorii.

Moderátor nightfish: Sloučeno do jednoho příspěvku, nejsme na chatu.
SpotRudloff
Profil
Tak dej ID v tabulce kategorií na kategorieid.
radvis
Profil *
Ja jsem blbý, díky.

Teď jsem ale bohužel přišel na to, že mi to moc nefunguje:D. Jako funguje to tak, že to vybere jen jeden záznam (to, co poslal AM_) v cyklu to mám, ale kdyz dám do tabulky, která spojuje filmy a kategorie "animovane | 3, animovane | 2, animovane | 1" tak to vypíše pouze jeden záznam.

Neví prosím někdo?

Moderátor nightfish: Sloučeno do jednoho příspěvku, nejsme na chatu.
AM_
Profil
radvis:
Neví prosím někdo?
Víš, že re-posting se tu začne trestat smrtí?

ale kdyz dám do tabulky, která spojuje filmy a kategorie "animovane | 3, animovane | 2, animovane | 1"
Co??? propojovací tabulka (propojeni) by měla obsahovat integer | integer, ne? nebo id kategorie je string?

"ale kdyz dám do tabulky ... tak to vypíše pouze jeden záznam"
tak to je ještě docela dobré. Já když (vklá)dám do tabulky, obvykle to vypíše něco jako "3 rows inserted".

Nauč se pokládat dotazy srozumitelně.
radvis
Profil *
Víš, že re-posting se tu začne trestat smrtí?
Tak to se omlouvám, ale rád bych se chyby už zbavil.

Co??? propojovací tabulka (propojeni) by měla obsahovat integer | integer, ne? nebo id kategorie je string? 

Mělo (i jsemto tak měl), ale chtěl jsem mít url: neco.cz/filmy.php?kategorie=komedie a ne neco.cz/fimly.php?kategorie=5. Byl bych spokojený i s tím číslem, ale nejde mi to ani tak! Prostě i když tam mám 2filmy k dané kategorii tak to vypíše pouze jednu a já nevim už nevím jak to opravit.
AM_
Profil
radvis:
Mělo (i jsemto tak měl), ale chtěl jsem mít url: neco.cz/filmy.php?kategorie=komedie a ne neco.cz/fimly.php?kategorie=5.
Vnitřní struktura databáze vůbec nemusí souviset s URL. klidně pak úpravou WHERE u toho query můžeš vybírat podle názvu a nikoli podle čísla kategorie.

Prostě i když tam mám 2filmy k dané kategorii tak to vypíše pouze jednu
-Používáš ten query, co jsem napsal výše?
-Jsi si vědom toho, že to vypíše něco jako:
Matrix - cyberpunk
Matrix - mystérium
a nikoliv: Matrix - cyberpunk, mystérium
-možná to máš v databázi nějak blbě uložené, když nevidím, co tam přesně máš, těžko z toho něco vyvěštit.
radvis
Profil *
Jsem si toho vědom, že to tak vypíše, ale mě jde o to, že budu mít prostě třeba 5 filmů. A jeden bude mít kategorie "animovane", "komedie" a další film bude mít třeba stejné žánry a když kliknu na animované tak se vypíše pouze první film a druhý ne. Vypisoval jsem si to pomoci var_dump(); a když to mám v cyklu tak to vypíše jen jeden film a když to v cyklu není (vypíšu si jen celý SQL dotaz) tak mi to vypíše vše od 2 filmů. Ale když chci třeba "$query->id nebo jsem zkoušel $query["id"]" tak to hodí chybu (myslím, že to není objekt). Omlouvám se, to moc neumím vysvětlit.
AM_
Profil
radvis:
Omlouvám se, to moc neumím vysvětlit.
to máš pravdu, teď už ti nerozumím zhola nic.
Napiš, co máš v databázi, jaký posíláš query a co to hodí za výsledek. Tedy ne napiš, ale přesně okopíruj a pastni sem, popisování ti opravdu moc nejde.
radvis
Profil *
Takže se to pokusím vysvětlit postupně.

tabulky:

filmy - id - nazev -xxxx
kategorie - id - nazev - xxx
kat_filmy(spojovaci tabulka) - id - filmy(int) - kategorie(int)

filmy:
ID | jméno filmu
1 | Vykoupení z věznice Shawshank
2 | Forrest Gump
3 | Přelet nad kukaččím hnízdem

kategorie
ID | jméno kategorie
1 | Drama
2 | Komedie
3 | Romantický

kat_filmy (propojeni)
Film | Kategorie
1 | 1
2 | 1
2 | 2
2 | 2
A teď když kliknu na kategorii "Komedie" tak chci aby se mi vypsali ty 2 filmy.
petr 6
Profil
[#23] radvis
A teď když kliknu na kategorii "Komedie" tak chci aby se mi vypsali ty 2 filmy.
A vypíše se co?

A vůbec, jaké 2 filmy?
Pokud vše funguje správně, tak kategorii Komedie (id=2) máš jen u jednoho filmu (Forrest, id=2), zato dvakrát.
radvis
Profil *
Blbě jsem to přepsal. Prostě se mi vypíše pouze jedno ID.

film | kategorie
2 | 2
3 | 2

A teď bych potřeboval vypsat ty 2 filmy poté, co kliknu na "komedie".
radvis
Profil *
Prostě už si fakt nevím rady, vypisuje se mi stále jen jedno ID i když mám v propojovací tabulce poukázané na 2filmy.
nightfish
Profil
radvis:
Prostě už si fakt nevím rady, vypisuje se mi stále jen jedno ID i když mám v propojovací tabulce poukázané na 2filmy.
už ti tu kolegové několikrát psali, že se máš dát kromě struktury databáze i kód, kterým provádíš dotaz a vrácená data vypisuješ
radvis
Profil *
   $query = $this->mysql->queryObject("SELECT *
   FROM `filmy`
   LEFT JOIN `kat_filmy` ON `filmy`.`id`=`kat_filmy`.`filmy`
   LEFT JOIN `kategorie` ON `kat_filmy`.`kategorie`=`kategorie`.`kategorie_id`
   WHERE `kategorie`.`kategorie_id`= '$sekce' ");
   
   //print '<pre>';
   //var_dump($query); exit;

   foreach($query as $filmy){
   
 return $filmy->id;
    
   }


fimy, kategorie, kat_filmy(propojeni)

filmy - id, nazev ...
kategorie - id, nazev ...
kat_filmy - kategorie, filmy (id)
nightfish
Profil
řádek 12 způsobí ukončení (funkce), což asi nechceš
AM_
Profil
tabulku "kategorie" vůbec nemusíš joinovat, když vybíráš podle id kategorie, tak to zjistíš už z tabulky kat_filmy.
Jinak problém je samozřejmě v tom co říká nightwish - tedy princip běhu PHP, nikoli chyba v dotazu.
//Dotaz: mohu Tvůj kód výše použít jako ukázku do svého článku? Neber to osobně, myslím to vážně - je to krásný příklad, na kterém se dá ukázat, jak ladit kód, o čemž se chystám napsat pár řádků.
Moderátor nightfish: Příště prosím nightfish, ne nightwish.
radvis
Profil *
nightfish: no jasně, ale já chci ať mi to vrátí všechny ID. Takže by mi to mělo vypsat: 2, 3.
AM_. a co tam napíšeš? Nikdy nepoužívat tohle: a muj kod:D.
nightfish
Profil
radvis:
ale já chci ať mi to vrátí všechny ID
pak si je budeš muset ukládat do pole, a za koncem toho cyklu pole vrátit pomocí return
radvis
Profil *
Mohl by jsi prosím příklad? Já myslel, že když mám $xx->id; tak mi to vrátí prostě 2 id.
AM_
Profil
radvis:
AM_. a co tam napíšeš? Nikdy nepoužívat tohle: a muj kod:D.
Ne, chci na tom ukázat, jak se taková chyba najde a odstraní vlastními silami ;)
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: