Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kappaleiden, albumien ja artistien listaus

Sivun loppuun

stageradio [05.04.2009 10:36:18]

#

Niin .. toiseen keskusteluun kun en enää vastauksia saanut niin pistin sitten uuden. :/

Ongelma siis seuraavanlainen:

haen kappale listaa tietokannasta joka muotoiltu näin:

artisti1
albumi1
kap1
kap2
kap3
albumi2
kap1
kap2
artisti2
albumi1
kap1
kap2
....

ongelmana on sellainen pikku seikka että jos artistilla on useampikin levy .. niin kaikki koodin tulostamat levyt ovat samoja.

Nyt lista tulostuu näin

artisti1
albumi1
kap1
kap2
kap3
artisti1
albumi1
kap1
kap2
kap3
artisti2
albumi1
kap1
kap2
....

koodin pätkä alla..

<!DOCTYPE HTML public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <title>Albumi lista</title>
  <link rel="stylesheet" type="text/css" href="lista.css" />
  </head>
  <body>
<?php


  $samDB = mysql_connect( "stageradio.servemp3.com", "*********", "***********" );
  mysql_select_db( "samdb", $samDB);

$result = mysql_query( "select distinct artist, fhr_artistid, album, fhr_albumid from songlist order by artist", $samDB );
$result1 = mysql_query( "select distinct album, from songlist where artist = " . $row["artist"] . " order by album", $samDB );

  // **************************************************************************


// $artist_rd = mysql_query( "SELECT distinct artist, fhr_artistid, FROM songlist ORDER BY artist" );
?>
<h2>STAGERADIO ALBUMI LISTA</h2>

<table>
  <tr>
    <td colspan="2" id="artist"><input type="checkbox" name="sop" value="sop"> = kategoroitu <input type="checkbox" name="kat" value="kat"> = sopii main</td>
  </tr>
</table>
<?php
while ($artist = mysql_fetch_assoc($result)){

$i = $artist['fhr_artistid'];

?>
<table>
  <tr>
  <td colspan="2"></td><td></td>
  </tr>
  <tr>
    <td width ="200" colspan="2" id="artist">
<?php
echo ($artist['artist']);
?>
    </td>
    <td></td>
  </tr>

<?php
$read = mysql_query("SELECT distinct album, fhr_artistid, fhr_albumid FROM songlist WHERE fhr_artistid = '$i' ORDER BY album ");
while ($show = mysql_fetch_assoc($read)){
?>
  <tr>
    <td width="40"><input type="checkbox" name="sop" value="sop"><input type="checkbox" name="kat" value="kat"></td>
    <td width="500" id="album">
<?php    echo ($show['album']);

//tästä alkaa kappale haku

$a = $show['fhr_albumid'];

?>

<table>
  <tr>
  <td colspan="2"></td><td></td>
  </tr>

<?php
$read = mysql_query("SELECT trackno, title FROM songlist WHERE fhr_albumid = '$a' ORDER BY trackno ");
while ($show = mysql_fetch_assoc($read)){
?>
  <tr>
    <td width="50"><input type="checkbox" name="sop" value="sop"><input type="checkbox" name="kat" value="kat"></td>
    <td width="500" id="album">

<?php    echo ($show['trackno']);?> - <?php echo ($show['title']);
}
?>
    </td>
  </tr>
</table>

<?php


// tähän se loppuu

    }
?>
    </td>
  </tr>
</table>

<?php

}

?>
</body>
</html>

on vielä yksi asia jonka kanssa tarvitsisin apua, (Etten nyt varmasti mene sotkemaan tietokantaani) olisi muutaman rasti ruutuun kentän tekeminen niin että tiedot tallentuisivat tietokantaan ja ne voisi hakea sieltä kyseiseen listaan.

esim. jos haluan että jossain biisissä on rasti pistän checkboxiin ruksin ja napsautan päivitä .. sitten kun seuraavan kerran haen listaa niin rasti on edelleen paikallaan. ymmärrätte varmaankin.

minkälaiseen muotoon pitäisi tuonne mysql:ään tehdä sille sopiva kenttä. jne.
en ole mitenkään kovin hyvä vielä kyseisen kielen kanssa.. lähinnä copy paste koodaaja joten kaikki apu tulee tarpeeseen.. :D

trilog [05.04.2009 11:31:55]

#

En oikein ymmärtänyt ensimmäistä kysymystä, tuohonhan on mahdoton vastata jossei tiedä miten tietokanta on suunniteltu. Liitä tähän siis vaikka dumppi kantasi tietorakenteesta tai joku esitys siitä miten se on toteutettu.

stageradio kirjoitti:

on vielä yksi asia jonka kanssa tarvitsisin apua, (Etten nyt varmasti mene sotkemaan tietokantaani) olisi muutaman rasti ruutuun kentän tekeminen niin että tiedot tallentuisivat tietokantaan ja ne voisi hakea sieltä kyseiseen listaan.

esim. jos haluan että jossain biisissä on rasti pistän checkboxiin ruksin ja napsautan päivitä .. sitten kun seuraavan kerran haen listaa niin rasti on edelleen paikallaan. ymmärrätte varmaankin.

minkälaiseen muotoon pitäisi tuonne mysql:ään tehdä sille sopiva kenttä. jne.
en ole mitenkään kovin hyvä vielä kyseisen kielen kanssa.. lähinnä copy paste koodaaja joten kaikki apu tulee tarpeeseen.. :D

Luot johonkin sopivaan tauluun vaikkapa kentän "checkbox", tyyppiä tinyint ja sinne aina laitat numeron sen mukaan onko ruksia vai ei.

Eli tähän tyyliin sitten PHP:n puolella:

<?php
$ruksi = haeTietokannastaRuksi(); // 1 = ruksi, 0 = ei ruksia

echo '<input type="checkbox"'.(($ruksi) ? ' checked="true"' : '').' />';
?>

stageradio [05.04.2009 11:43:09]

#

tietokanta on kasattu niin että songlist taulukossa on kaikki tiedot mitä kappaleella nyt voi olla.
eli mitä tässä käytetään niin
ID, artist, album, trackno, title, fhr_albumid, fhr_artistid ( + 20 muuta kenttää mutta niitä emme tarvitse )
elikkä jokainen kappale pitää sisällään tiedot mihin albumiin se kuuluu ja mikä on kappaleen esittäjä...

missä itse lista on niin:

http://www.stageradio.com/kappalelista.php

TeNDoLLA [05.04.2009 23:03:15]

#

Siis onko sulla yhdessä ainoassa taulussa nuo kaikki albumien, artistien ja laulujen tiedot? Jos on niin kannattaisi kyllä harkita tietokanta rakenteen uusiksi tekemistä. Eli tauluja tyyliin näin:

artists
----------
artist_id
artist_name


albums
----------
album_id
album_name
artist_id (viittaa artists taulun artist_id -kenttään)


songs
----------
song_id
song_name
album_id (viittaa albums taulun album_id -kenttään)


Vähäiset vastaukset aikaisempaan keskusteluun varmaan johtuivat siitä, että nuo ongelma kuvaukset on hieman sekavia/puutteellisia. Et anna tarpeeksi informaatiota (esim. tietokanta rakennetta, joka olisi tässä aika oleellista tietää).

Miksi sulla muuten on noissa selecteissä tuo DISTINCT? Sehän valitsee vain jokaisen erilaisen tietueen kannasta kerran vaikka siellä olisi useampia, johtusko se kenties siitä?

Kannattaa myös katsoa mitä sieltä kannasta palautuu noilla sun kyselyillä ja tarkistaa onko kannasta tullut halutut tiedot vai ei. Joko PHP:ssa tulostamalla / var_dumpilla tai sitten jollain sql hallinta ohjelmalla ajat ne kyselyt ja katsot mitä tulee vastaukseksi. Tähän tarkoitukseen ilmaisia ja omista kokemuksista ihan hyviksi todettuja ovat ainakin SQLYog ja HeidiSQL.

Teuro [06.04.2009 06:52:55]

#

Eriyttämällä tuon taulun uusiksi loogisiksi tauluiksi voisi hakulogiikasta tulla jotenkin tämän näköinen viritelmä.

<?php
$page = new DOMDocument();
/* Tähän alle sivun alkutiedot head, body... */
/* Haetaan taulusta artist kaikki artistit ja heidän id numronsa */
$artis = mysql_query("SELECT name, id FROM artists ORDER BY name");

/* Muunnetaan rivi taulukoksi ja tulostetaan yksi kerrallaan koko sisältö */
while($rivi = mysql_fetch_array($artist)){
  $tr = $page->createElement("tr");
  $table->appendChild($tr);

  $th = $page->createElement("th", $rivi['name']);
  $tr->appendChild($th);

  /* Hakuehto seuraavalle kyselylle */
  $id = $rivi['id'];

  $album = mysql_query("SELECT name, id FROM albums WHERE album.id = $id ORDER BY name");

  while( ... ){

    /* Ja lopuksi kaikki kappaleet logiikka on ihan sama */
  }
}

/* Ja vielä koko roska näytölle */
echo $page->saveXML();
?>

stageradio [06.04.2009 09:35:24]

#

Hei .. Kiitos vastauksista.

Taulukon uusiminen voisi olla hyvä idea, mutta kun SAM Broadcaster (Radio automaatio ohjelma jota käytän) on luonut nuo taulukot ja käyttää tietokantaa kaikkeen tekemiseensä, Niin sitä ei voi lähteä muuttamaan.

Alun perin tämä koodinpätkä tulosti pelkästään artistit ja niiden alle kaikki niitten albumit. Ja tässä tarkoituksessa se toimii hienosti. Distinct on ymmärtääkseni ihan hyvä olla tässä tapauksessa. Kun artisteja hakee (jos sitä ei ole) se hakee artisteja yhtä monta kun sillä on kappaleita, samoin albumeita. Sen takia se sielä kummittelee.
Nyt kun lisäsin kappale haun while loopin sisälle niin ongelmat alkoivat ..
en tiedä pitäisikö olla niin että olisi

hae distinct artist
- while artist = $result
- hae albumit joiden artist on $result(artistid)
-- while artist = &result
-- hae kappaleet joiden albumi on $result(albumid)

onko tuossa sitten mitään järkeä ??

Teuron pohja näyttää fiksulta ja olisi varmasti järkevämpää rakentaa kyselyt tuolla menetelmällä .. pelkään vain että menee lopullisesti jauhot sekasin jos lähen nyt vielä uutta koodia siihen mukaan sörkkäämään. hyvä kun tajuan edes mitä tuossa vanhassa koodinpätkässä tapahtuu :)
Ehkä sitten kun olen saanut tuon jonkunlaiseen kuntoon. vai voisiko vika olla nimenomaan siinä että vanha on niin huonosti tehty :/

ja kiitoksen trilogille vinkistä. vielä puuttuu se että tulostetta muokattaessa tiedot tallentuu tietokantaan. Siihen varmasti jotain vinkkejä löytyy netistä. täytyy vain jaksaa googlettaa ...

Metabolix [06.04.2009 11:14:35]

#

Mitä jos hakisit kaiken datan kerralla sopivassa järjestyksessä? ORDER BY hyväksyy nimittäin useammankin kentän. Tulostuksen voit hoitaa tähän tapaan:

<?php
$artist = $album = null;
foreach ($result as $row) {
  if ($artist != $row["artist"]) {
    $artist = $row["artist"];
    $album = null;
    echo "Artist: $artist\n";
  }
  if ($album != $row["album"]) {
    $album = $row["album"];
    echo "Album: $album\n";
  }
  $song = $row["song"];
  echo "Song: $song\n";
}
?>

stageradio [06.04.2009 20:04:14]

#

Vaikuttaa hyvältä .. en vain ymmärrä miten tuo toimii. Tässä yrittäny säätää sitä toimintaan mutta ei tuu mitään.

Kattelin vähän netistäkin tuosta foreach toiminnosta. Mutta mutta..

tällä hetkellä valittaa
Warning: Invalid argument supplied for foreach() in plää plää rivillä jolla on
foreach ($result as $row) {

...

Teuro [06.04.2009 20:24:32]

#

foreach on silmukka, jossa ensimmäinen parametri on taulukko, ja toinen on muuttuja, joka on vuorollaan taulukon indeksinä.

<?php
$taulu = Array(1 => 1, 2 => 2, "kolmas" => 3, 4 => "neljäs");

foreach($taulu AS $indeksi){
    echo $indeksi . "<br />";
}

/* Käydään läpi tulosteet */
1
2
3
neljäs
?>

Samaiselle silmukalle voi antaa kolmannenkin parametrin, jolloin päästään käsiksi itse taulukon arvoon. Tämä ei pidä paikkaansa kts. Metabolixin vastaus.

<?php
$taulu = Array(1 => 1, 2 => 2, "kolmas" => 3, 4 => "neljäs");

foreach($taulu AS $indeksi => $arvo){
    echo $indeksi . " " . $arvo . "<br />";
}

/* Käydään läpi tulosteet */
1 1
2 2
3 kolmas
neljäs 4
?>

Metabolix [06.04.2009 20:30:31]

#

Teuro, PHP:ssä foreachin viimeiseen muuttujaan tulee aina arvo ja kolmimuuttujaista muotoa käytetään, kun tarvitaan lisäksi indeksi. Ensimmäinen esimerkkisi ei siis päde. (JS:ssä sen sijaan vastaava rakenne toimii noin.)

stageradio, hae ensin kaikki tulokset yhteen PHP:n taulukkoon ($result).

<?php
$res = mysql_query("SELECT ...");
$result = array();
while ($x = mysql_fetch_assoc($res)) {
  $result[] = $x;
}
mysql_free_result($res);
?>

Teuro [06.04.2009 20:36:28]

#

Metabolix kirjoitti:

Teuro, PHP:ssä foreachin viimeiseen muuttujaan tulee aina arvo ja kolmimuuttujaista muotoa käytetään, kun tarvitaan lisäksi indeksi. Ensimmäinen esimerkkisi ei siis päde.

Puhuin puutaheinää anteeksi siitä. Tarkoitus oli siis kirjoittaa arvot saadaan indeksin perusteella. Ja toisessa esimerkissä saadaan lisäksi indeksit esille. Kiitos tarkennuksesta.

Muokkasin edellistä viestiäni.

stageradio [06.04.2009 21:13:47]

#

HA!

Sain toimimaan .. enää tarvitsee vain siistiä ulkoasu.

Kiitokset taas kaikille auttajille! Ei menny hukkaan tää päivä ku tuli taas opittua jotain uutta :)

EDIT.

Täähän toimiiki jotain sata kertaa nopeemmin :D.. kiitokset vielä kerran!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta