Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: databáze s texty písní

Aktivity
Avatar
Lukas Dohnal
Člen
Avatar
Lukas Dohnal:1.2.2019 20:19

Zdravím a prosím o radu. Mám databázy, kde jsou tyto tabulky:

Album

nazev_alba album rok skupina

Song

track_no nazev_songu song album skupina

Nedaří se mi správně uspořádat SQL a php kod, aby se mi na www stránce zobrazilo to, co chci, uspořádané tak, jak popisuju níže (Čeho se snažíš dosáhnout?).

Na stránce mám např tento odkaz:
< A href="index.php?sku­pina=chinaski">Chi­naski< /A>

Do $skupina se mi tedy vloží název skupiny a ted chci, aby se mi vypsal seznam alb a u nich vypsaný seznam písniček této skupiny.

Zkusil jsem: Do teď jsem to mám dělané tak, že mám speciální soubor chinaski.php, kde vyloženě vkládám jednotlivé názvy alb do neznámé $album, takto:

@$vysledek = MySQL_Query("select * from skupina where skupina like '$skupina'");
while ($zaznam = mysql_fetch_array($vysledek))
echo "<H2>&nbsp;<A href=http://lyrics.profitux.cz/".$zaznam["skupina"].".php?skupina=".$zaznam["skupina"].">".$zaznam["nazev_skupiny"]."</A></H2>";
echo "<TR><TD valign='top' align='left' padding='0'>";


$album = "neninacocekat";
@$vysledek = MySQL_Query("select * from album where album like '$album'");
while ($zaznam = mysql_fetch_array($vysledek))
echo
"<DIV class='album'>&nbsp;&nbsp;".$zaznam["nazev_alba"]." (".$zaznam["rok"].")</DIV><BR>
<TABLE border=0><TR><TD valign=top>
<IMG src=covers/".$zaznam["album"].".jpg align=left height=140 width=140>
<TD style='font-size: 13px; line-height: 20px;'>
<TABLE border=0>";
@$vysledek = MySQL_Query("select * from song where album like '$album' order by track_no");
while ($zaznam = mysql_fetch_array($vysledek))
echo "<TR><TD align=right style='font-size: 13px;'>"
.$zaznam["track_no"]."<TD align=left style='font-size: 13px;'>&nbsp; <A href=".$zaznam["skupina"].".php?skupina=".$skupina."&album=".$album."&text=".$zaznam["song"].">".$zaznam["nazev_songu"]."</A></TD></TR>";
echo "</TABLE></TD></TR></TABLE>
<BR><BR>";

$album = "07";
@$vysledek = MySQL_Query("select * from album where album like '$album'");
while ($zaznam = mysql_fetch_array($vysledek))
echo
"<DIV class='album'>&nbsp;&nbsp;".$zaznam["nazev_alba"]." (".$zaznam["rok"].")</DIV><BR>
<TABLE border=0><TR><TD valign=top>
<IMG src=covers/".$zaznam["album"].".jpg align=left height=140 width=140>
<TD style='font-size: 13px; line-height: 20px;'>
<TABLE border=0>";
@$vysledek = MySQL_Query("select * from song where album like '$album' order by track_no");
while ($zaznam = mysql_fetch_array($vysledek))
echo "<TR><TD align=right style='font-size: 13px;'>"
.$zaznam["track_no"]."<TD align=left style='font-size: 13px;'>&nbsp; <A href=".$zaznam["skupina"].".php?skupina=".$skupina."&album=".$album."&text=".$zaznam["song"].">".$zaznam["nazev_songu"]."</A></TD></TR>";
echo "</TABLE></TD></TR></TABLE>
<BR><BR>";

Takže když má skupina třeba 12 alb, tak to musím nakopírovat 12x a 12x vložit do $album název toho alba.
Chtěl bych, aby si to bralo automaticky z databáze, ale nevím, jak na to.
Umím vytáhnout z db seznam alb, umím vytáhnout seznam písniček, ale neumím to zobrazit, jako níže (Čeho se snažíš dosáhnout).

Chci docílit: Chci, aby výsledek vypadal takto:

<TABLE border=1>
<TR><TD rowspan=3>První album</TD><TD>1. píseň</TD></TR>
<TR><TD>2. píseň</TD></TR>
<TR><TD>3. píseň</TD></TR>

<TR><TD rowspan=3>Druhé album</TD><TD>Píseň 1</TD></TR>
<TR><TD>Píseň 2</TD></TR>
<TR><TD>Píseň3</TD></TR>
</TABLE>

Budu rád, když poradíte.
Děkuji.

 
Odpovědět
1.2.2019 20:19
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Jaroslav Smrž:2.2.2019 9:21

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

Nahoru Odpovědět
2.2.2019 9:21
/* Life runs on code */
Avatar
Odpovídá na Lukas Dohnal
Michal Štěpánek:2.2.2019 10:02

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)...

Nahoru Odpovědět
2.2.2019 10:02
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Matúš Petrofčík:2.2.2019 10:46

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, ...

Nahoru Odpovědět
2.2.2019 10:46
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Lukas Dohnal
Člen
Avatar
Odpovídá na Michal Štěpánek
Lukas Dohnal:2.2.2019 12:53

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.

 
Nahoru Odpovědět
2.2.2019 12:53
Avatar
Ondřej Němec
Tvůrce
Avatar
Ondřej Němec:5.2.2019 12:53

nebylo by lepší použít nějaký framework? ten špagety kod se špatně čte

Nahoru Odpovědět
5.2.2019 12:53
Život by byl mnohem jednodušší, kdybychom k němu měli zdrojový kód.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.2.2019 16:46
  1. spatne je to, ze michas php vypis z ostatnim kodem. Tim si desne zkomplikujes problem, protoze se v tom snadno ztratis.
  2. Tvuj navrh tabulek mi prijde divny.

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;
Editováno 5.2.2019 16:47
 
Nahoru Odpovědět
5.2.2019 16:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.2.2019 16:53

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, ' &nbsp;'); // 2 mezery pred
funkce ($row_song, ' &nbsp; &nbsp;'); // 4 mezery pred
 
Nahoru Odpovědět
5.2.2019 16:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.2.2019 8:43

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);
}

}

Editováno 6.2.2019 8:44
 
Nahoru Odpovědět
6.2.2019 8:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.2.2019 8:47

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

 
Nahoru Odpovědět
6.2.2019 8:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.