Diskuze: databáze s texty písní
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, vůbec nerozumím principu tvých tabulek. Já bych na to šel stromově - skupiny -> alba -> songy. Poté bych vypisoval záznamy dle požadovaného klíče do html šablony. Také by bylo vhodné použít OOP nebo se v tom ztratíš. Tutoriál na dotazy přes více tabulek nalezneš zde: Dotaz přes více tabulek
Přesně jak říká Jarda. Udělej si tabulku "skupiny", tabulku "alba", kde bude jako cizí klíč figurovat ID skupiny a tabulku "songy", kde budou cizí klíče ID skupiny a ID alba (ID skupiny tam nutně být nemusí, ale nic se nezkazí, když tam bude)...
Pozor na to, že jedna pesnička môže byť na viacerých albumoch, že jedna pesnička a/alebo jeden album môže mať viacero interpretov, ...
Zdravím,
přesně takto to mám dělané. Mám tabulku skupiny, alba a songy. Umím z
nich dostat, vše co potřebuju, ale nejde mi to dostat do té formy, kterou
jsem popsal HTML kódem nahoře. Tzn výpis alb a vedle toho od každého alba
rovnou i výpis songů.
Přijde mi divný, že musím x krát vypsat $album=... pro každé album v
databázi a následuje výpis písniček.
Chci, abych zadal jen $skupina=... a vypsali se písničky roztříděné dle
alb.
nebylo by lepší použít nějaký framework? ten špagety kod se špatně čte
Album : nazev_alba album rok skupina
Song : track_no nazev_songu song album skupina
skupina: id_skupina, nazev
album : id_album, nazev, rok, id_skupina
song: id_song, nazev, id_album, id_skupina
Takovato struktura ale predpoklada, ze album nemuze vydat sam zpevak,
pripadne ani song. A rovnez to neresi prechody zpevaku mezi skupinami nebo clenu
skupiny jinam. Nebo se jim treba bubenik vyboura, tak maji jineho. Ale ve tvem
pripade budou vsechna alba pod stejnou skupinou se stejnymi lidmi, asi. To by
musela byt asi specialni nova skupina s jinym datumem zalozeni, se setjnym
nazvem, jinymi osobami. Coz by pak ale komplikovalo vyhledavani Musela by tam byt nejaka vazba, ze
je to soucasne stejna skupina a soucasne uplne jina, kdyz si to clovek rozklikne
u pisnicky....
No, dost uvah. Takze:
skupina: id_skupina, nazev
album : id_album, nazev, rok, id_skupina
song: id_song, nazev, id_album, id_skupina
vypis skupin:
SELECT nazev FROM skupina
vypis pisnicek podle skupiny id
SELECT nazev FROM song WHERE id_skupina=123
vypis pisnicek podle skupiny nazev
SELECT nazev FROM song
LEFT JOIN skupina ON skupina.id_skupina = song.id_skupina
WHERE skupina.nazev='abc' // nebo LIKE='abc%'
A ted by to slo cele udelat slozitym sql dotazem, a na to bohuzel nemam v soucasnem stavu. Alternativne to jde resit php cykly.
str = '';
$query = "SELECT id_skupina, nazev FROM skupina WHERE nazev LIKE '%s%'";
$query = sprintf($query, mysql_escape_string($skupina))
$result_skupiny = mysql_query($query);
while ($row_skupiny = mysql_fetch_assoc($result_skupiny))
{
$str .= radekSkupina($row_skupiny);
$query = "SELECT... WHERE id_skupina=%d"; // dotaz pro alba
$query = sprintf($query, $row_skupiny['id_skupina']))
$result_alba = mysql_query($query);
while ($row_alba = mysql_fetch_assoc($result_alba))
{
$str .= radekNecoDalsiho($row_alba);
}
}
echo $str;
Jo, a ja bych tu funkci pro zacatek dal vsem spolecnou. A pak ji upravil na tabulku nebo mozna ul-li strom.
function funkce ($row, $lvl) {echo $lvl.$row['nazev'].'<br>';}
funkce ($row_skupina, '');
funkce ($row_album, ' '); // 2 mezery pred
funkce ($row_song, ' '); // 4 mezery pred
Jo, pokud predpokladas, ze vse bude zarazene, do alba a skupiny, pak je uplne zbytecne mit
song: id_song, nazev, id_album, id_skupina
song: id_song, nazev, id_album
Protoze pisnicka je vzdy soucasti albumu a pres id_album se dostanes k id_skupina.
A take by mozna bylo lepsi si na sql udelat funkci (vsprintf) nebo class. Pozdeji to mozna budes chtit predelat na pdo a musel bys pak vsude dohledava a menit. To je lepsi pouzit jeden include navic (php.net/include)
function sql($query='', $data=array())
{
foreach ($data as $key=>$value) {$data[$key] = mysql_escape_string($value);}
$query = vsprintf($query, $data);
return mysql_query($query);
}
}
Jo, a ty zavinace na zacatku potlacuji chyby. Kdybys na sql mel funkci, staci to pridat na jeden radek v ni. Ale pro ladeni programu e lepsi tam zavinac zas nemit. @$vysledek
Zobrazeno 10 zpráv z 10.