Lijst met artiesten uit database halen? (probleem2)

Status
Niet open voor verdere reacties.

brownmouse

Gebruiker
Lid geworden
6 jul 2007
Berichten
497
Benik weer....

Nu zit ik met een ander probleem,
ik wil nu de lijst met DJ's uit me database halen.
en dat lukt me ook wel.. maar wil maar 1x de lijst hebben.
maar als ik nu dus dit script gebruik.

PHP:
<?php

		session_start();
		include("database.php.ini");


if(isset($_GET['downloads'])) {
  $query = "SELECT artist FROM downloads WHERE artist='". $_GET['downloads'] ."' ORDER BY id ASC";
  $result = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($result);
  print_r($row);
} else {
  $query = "SELECT id, title, link, artist, genre FROM downloads ORDER BY artist ASC";
  $result = mysql_query($query) or die(mysql_error());
  while($row = mysql_fetch_assoc($result)) {

    echo '<li><a href="artistslist.php?artist='. $row['artist'] .'">'. $row['artist'] .'</a></li>
';
  }
}

?>

Dan krijg ik dit
Ambassador Inc.
Angerfist
Angerfist
Angerfist
Angerfist
Angerfist
Angerfist
Angerfist
Angerfist
Angerfist
Bioweapon
Braindeztruktor
Brennan Heart
Chain Reaction
Coone
D-Block & S-te-Fan
D-Block & S-te-fan
D-Block & S-te-Fan
Darkraver
Darkraver

Terwijl ik dan gewoon

Ambassador Inc.
Angerfist
Bioweapon
Braindeztruktor
Brennan Heart
Chain Reaction
Coone
D-Block & S-te-Fan
Darkraver

wil.. hoe kan ik dit oplossen?
 
De makkelijke oplossing is om "SELECT DISTINCT(artiest)" te doen, dan krijg je alle resultaten maar 1x terug.

De nette oplossing is om je tabel te normaliseren zodat "artiest" een aparte tabel is waar elke naam maar 1x in voorkomt ;)
 
Nee ik bedoelde met normaliseren dat je meerdere tabellen hebt in SQL (een voor nummers, een voor artiesten) en dat je ze aan elkaar koppelt via je queries.

Dat is een stuk netter, dus dat zou ik wel een keer gaan leren als je een beetje wilt blijven programmeren ;)
 
Nee ik bedoelde met normaliseren dat je meerdere tabellen hebt in SQL (een voor nummers, een voor artiesten) en dat je ze aan elkaar koppelt via je queries.

Dat is een stuk netter, dus dat zou ik wel een keer gaan leren als je een beetje wilt blijven programmeren ;)

owkee,
maar als ik zo doe, is toch stuk simpeler?
of licht dat aan mj?
 
Nog wel, maar dit is niet de juiste manier. Nu heb je een heleboel data dubbel in je database (heel veel rijen met dezelfde DJ-naam)

Dat is erg onhandig als je bijvoorbeeld aan de artiest een geboortedatum toe wil voegen (dan moet je elke geboortedatum ineens 10 of 20 keer toevoegen, bij elke naam van de artiest een keer) of als je de naam van een artiest wil veranderen (dat moet dan ook 10x) en je hebt bovendien een hele grote kans dat je een keer een typefout maakt en dan heb je ineens 2 verschillende namen voor dezelfde artiest en dan gaat je code rare dingen doen.
 
Nog wel, maar dit is niet de juiste manier. Nu heb je een heleboel data dubbel in je database (heel veel rijen met dezelfde DJ-naam)

Dat is erg onhandig als je bijvoorbeeld aan de artiest een geboortedatum toe wil voegen (dan moet je elke geboortedatum ineens 10 of 20 keer toevoegen, bij elke naam van de artiest een keer) of als je de naam van een artiest wil veranderen (dat moet dan ook 10x) en je hebt bovendien een hele grote kans dat je een keer een typefout maakt en dan heb je ineens 2 verschillende namen voor dezelfde artiest en dan gaat je code rare dingen doen.

hoe zou ik het dan moeten doen.. want ik heb altijd al zo gedaan...
moet ik zeker hele script omgooien?

[SQL]
CREATE TABLE `downloads` (
`ID` int(10) NOT NULL auto_increment,
`rand` int(10) NOT NULL,
`time` varchar(20) collate latin1_general_ci NOT NULL,
`title` varchar(100) collate latin1_general_ci NOT NULL,
`text` text collate latin1_general_ci NOT NULL,
`artist` varchar(100) collate latin1_general_ci NOT NULL,
`genre` varchar(25) collate latin1_general_ci NOT NULL,
`link` varchar(100) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=78 ;
[/SQL]
is dus niet verstandig
 
Laatst bewerkt:
Dan moet je idd het nodige omgooien. De correcte layout is meer zo:

TABEL artiest
id
naam
website
geboortedatum
... etc

TABEL lied
id
artiest_id
naam
genre
lyrics
... etc


En als je dan wil weten wat de naam van de artiest van een nummer is, dan JOIN je de "lied" tabel op de "artiest" tabel en dan krijg je alle namen alsnog terug.

[sql]
SELECT *
FROM lied
INNER JOIN artiest ON artiest.id = lied.artiest_id
[/sql]
 
Dan moet je idd het nodige omgooien. De correcte layout is meer zo:

TABEL artiest
id
naam
website
geboortedatum
... etc

TABEL lied
id
artiest_id
naam
genre
lyrics
... etc


En als je dan wil weten wat de naam van de artiest van een nummer is, dan JOIN je de "lied" tabel op de "artiest" tabel en dan krijg je alle namen alsnog terug.

[sql]
SELECT *
FROM lied
INNER JOIN artiest ON artiest.id = lied.artiest_id
[/sql]

dus

PHP:
<?php
			require("../database.php.ini");

			$query = mysql_query("SELECT * FROM lied ORDER BY ID DESC LIMIT 5 INNER JOIN artiest ON artiest.id = lied.artiest_id") or die(mysql_error());
			while($object = mysql_fetch_object($query)){
			echo "<li><a href=\"track.php?pagina=$object->ID&artist=$object->artist_id\">$object->name - $object->title</a></li>";
			}
			?>

zou dan goed zijn?
ik snap niet dan heeft ieder liedje een eige id en artiest enc ga zo door..
hoe wil dan dan bijv bij deze code,, het goeie ophalen?
 
Laatst bewerkt:
Dan moet je idd het nodige omgooien. De correcte layout is meer zo:

TABEL artiest
id
naam
website
geboortedatum
... etc

TABEL lied
id
artiest_id
naam
genre
lyrics
... etc


En als je dan wil weten wat de naam van de artiest van een nummer is, dan JOIN je de "lied" tabel op de "artiest" tabel en dan krijg je alle namen alsnog terug.

[sql]
SELECT *
FROM lied
INNER JOIN artiest ON artiest.id = lied.artiest_id
[/sql]

ow whaha,, nee ik snap nu een beetje hoe je bedoelt.. maar dan kom ik met nog een vraag..

als ik dan de tabel.. artist heb en title (nummer dan)
moet ik dan in title de artiest/dj zetten of in artist?

en hoe haal ik hem op als ik de rest uit title haal ipv artist?

en zou dit dan perfecte sql zijn?
[SQL]
CREATE TABLE `artiest` (
`ID` int(10) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`bio` text NOT NULL,
`website` varchar(100) NOT NULL,
PRIMARY KEY (`ID`)
)
CREATE TABLE `lied` (
`ID` int(10) NOT NULL auto_increment,
`artist_id` int(10) NOT NULL auto_increment,
`genre` varchar(50) NOT NULL,
`time` varchar(20) NOT NULL,
`lyrics` varchar(150) NOT NULL,
PRIMARY KEY (`ID`)
)
[/SQL]
 
Laatst bewerkt:
Laten we deze topic maar denk sluiten :P
voor we weer in deze vedergaan.

ik heb beetje gegoogelt.
en ben er uit gekomen.

PHP:
    		<?php
			require("../database.php.ini");

			$query = mysql_query("SELECT * FROM lied,artiest WHERE artiest.ID = lied.artistid ORDER BY lied.ID DESC LIMIT 5") or die(mysql_error());
			while($object = mysql_fetch_object($query)){
			echo "<li><a href=\"track.php?pagina=$object->ID&artist=$object->artist_id\">$object->name - $object->title</a></li>";
			}
			?>

dat werkt wel :D
athans zover ik het nu heb werkt dit :D
 
Dat laatste ziet er inderdaad goed uit, netjes uitgezocht allemaal ;)
 
Kom ik weer ..... :P

PHP:
<?
			include("../database.php.ini");
			$track=$_GET['ID'];
			$query="SELECT * FROM lied,artiest WHERE artiest=artiest.name AND lied.ID='".mysql_real_escape_string($_GET['track'])."'";
			$results=mysql_query($query);

			$num=mysql_num_rows($results);

			mysql_close();

			echo "";

		$i=0;
		while ($i < $num) {


$title=mysql_result($results,$i,"title");
$artiest=mysql_result($results,$i,"artiest");
$link=mysql_result($results,$i,"link");
$id=mysql_result($results,$i,"id");
$genre=mysql_result($results,$i,"genre");
$time=mysql_result($results,$i,"time");



echo "
		<div id=left_side>
			<h3><span>
			$artiest - $title ($genre)
			</span></h3>
			<p>
			<!-- <img src=images/img.jpg alt=img /> -->

<object width=550 height=334><param name=movie value=http://www.youtube.com/v/$link?fs=1&amp;hl=nl_NL&amp;color1=0x5d1719&amp;color2=0xcd311b&autoplay=1></param><param name=allowFullScreen value=true></param><param name=allowscriptaccess value=always></param><embed src=http://www.youtube.com/v/$link?fs=1&amp;hl=nl_NL&amp;color1=0x5d1719&amp;color2=0xcd311b&autoplay=1 type=application/x-shockwave-flash allowscriptaccess=always allowfullscreen=true width=550 height=334></embed></object>


			</p>
			<blockquote>
			<p>



			</p>
			</blockquote>
			<div class=date>Track toegevoegt op: $time</div>";
$i++;
} ?>

krijg ik deze foutmelding op:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/a1823375/public_html/versie2/music/track.php on line 100

de regel die hem veroorzaakt is. :
PHP:
			$num=mysql_num_rows($results);

ik heb al opgelost :P
me php wordt nu echt stukke beter begin zelfs uitmezelf te leren vergat
code om arieste id uit link te halen
heb nu

PHP:
			<?
			include("../database.php.ini");
			$track=$_GET['ID'];
			$artiest=$_GET['artiestid'];
			$query="SELECT * FROM lied,artiest WHERE artiest.id='".mysql_real_escape_string($_GET['artiest'])."' AND lied.ID='".mysql_real_escape_string($_GET['track'])."'";
			$results=mysql_query($query);

			$num=mysql_num_rows($results);

			mysql_close();

			echo "";

		$i=0;
		while ($i < $num) {


$title=mysql_result($results,$i,"title");
$name=mysql_result($results,$i,"name");
$link=mysql_result($results,$i,"link");
$id=mysql_result($results,$i,"id");
$genre=mysql_result($results,$i,"genre");
$time=mysql_result($results,$i,"time");



echo "
		<div id=left_side>
			<h3><span>
			$name - $title ($genre)
			</span></h3>
			<p>
			<!-- <img src=images/img.jpg alt=img /> -->

<object width=550 height=334><param name=movie value=http://www.youtube.com/v/$link?fs=1&amp;hl=nl_NL&amp;color1=0x5d1719&amp;color2=0xcd311b&autoplay=1></param><param name=allowFullScreen value=true></param><param name=allowscriptaccess value=always></param><embed src=http://www.youtube.com/v/$link?fs=1&amp;hl=nl_NL&amp;color1=0x5d1719&amp;color2=0xcd311b&autoplay=1 type=application/x-shockwave-flash allowscriptaccess=always allowfullscreen=true width=550 height=334></embed></object>


			</p>
			<blockquote>
			<p>



			</p>
			</blockquote>
			<div class=date>Track toegevoegt op: $time</div>";
$i++;
} ?>

En die doet wel wat ik wil :D
 
Laatst bewerkt:
Weer een probleem hihi..

jhaa ik gebruik veels te veel verschillende php code's

PHP:
			require("../database.php.ini");

			$query = mysql_query("SELECT * FROM lied,artiest WHERE artiest.id = lied.artistid ORDER BY lied.id DESC LIMIT 5") or die(mysql_error());
			while($object = mysql_fetch_object($query)){
			echo "<li><a href=track.php?track=$object->ID&artiest=$object->artistid>$object->name - $object->title</a></li>";
			}
			?>

lijkt wel of hy track id niet pakt! maar ipv daarvan artistid pakt
 
Je verwijst naar ID, dat is waarschijnlijk dubbelop en dus niet betrouwbaar. Hij heeft namelijk een veld ID in artiest en een veld ID in track, en je kunt niet weten welke van die twee hij benoemt heeft als "ID" in je array, waar ID maar 1x in voor mag komen.

Wat je het beste kunt doen is alle velden die je nodig hebt handmatig benoemen:

[sql]
SELECT veld1, veld2, veld3
[/sql]

Op die manier weet je zeker dat je altijd alleen de nodige informatie hebt, en dat de namen kloppen.

Je kunt het ook dubbel opvragen, maar das weer niet zo netjes ;)

[sql]
SELECT *, track.ID as trackID
[/sql]
Dan krijg je een extra veld trackID dat zeker weten de track ID bevat.
 
Je verwijst naar ID, dat is waarschijnlijk dubbelop en dus niet betrouwbaar. Hij heeft namelijk een veld ID in artiest en een veld ID in track, en je kunt niet weten welke van die twee hij benoemt heeft als "ID" in je array, waar ID maar 1x in voor mag komen.

Wat je het beste kunt doen is alle velden die je nodig hebt handmatig benoemen:

[sql]
SELECT veld1, veld2, veld3
[/sql]

Op die manier weet je zeker dat je altijd alleen de nodige informatie hebt, en dat de namen kloppen.

Je kunt het ook dubbel opvragen, maar das weer niet zo netjes ;)

[sql]
SELECT *, track.ID as trackID
[/sql]
Dan krijg je een extra veld trackID dat zeker weten de track ID bevat.

ik heb ID van artiest nu aID genoemt en die van lied lID werkt nu ook goed, maar zit nu met ander probleem
 
Niet de meest nette methode, maar werkt ook ;)

Als je er niet uit komt moet je maar roepen.
 
PHP:
<?php
include("../database.php.ini");
error_reporting( E_ALL );

if(isset($_GET['artiest'])) {
  $query = "SELECT * FROM artiest,lied WHERE artiest.name = '". $_GET['artiest.name'] ."' ORDER BY artiest.name ASC";
  $result = mysql_query($query) or die(mysql_error());
  $row = mysql_fetch_assoc($result);
  print_r($row);
} else {
  $query = "SELECT * FROM artiest,lied WHERE artiest.name = '". $_GET['artiest.name'] ."' ORDER BY artiest.name ASC";
  $result = mysql_query($query) or die(mysql_error());
  while($row = mysql_fetch_assoc($result)) {

    echo '
    <h3><span>Alle tracks van $row[artiest.name]</span></h3>
	<p></p>
    <table>
    <tr>
    <td width=350><li><a href="track.php?track='. $row['lied.lID'] .'&artiest='. $row['lied.artistid'] .'">'. $row['artiest.name'] .' - '. $row['lied.title'] .'</a></td> <td>( '. $row['lied.genre'] .' ) </li></td>
    </tr>
    </table>';
  }
}
?>
</p>

hij moet met die code dus onder het nummer een lijst met nummers laten zien vandezelfde artiest... die ik nu een nummer van aan't afspelen ben..
maar dat krijg ik niet ik krijg nu..
Notice: Undefined index: artiest.name in /home/a1823375/public_html/versie2/music/track.php on line 149

die regel is trouwens
PHP:
 $query = "SELECT * FROM artiest,lied WHERE artiest.name = '". $_GET['artiest.name'] ."' ORDER BY artiest.name ASC";
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan