webForumDet fria alternativet

Relationer.. HJÄLP!!!!

16 svar · 810 visningar · startad av Guldstrand

GuldstrandMedlem sedan juli 20041 274 inlägg
#1

Hej alla WF:are och glad påsk i efterskott. :e

Jag har "fastnat" i mitt php-kodande, och hade uppskattat lite hjälp.
Well.. jag försöker hämta information från 5 olika tabeller i min databas, men det verkar inte fungera riktigt.

Tyvärr är min erfarenhet av php/mysql rätt begränsad, så jag hoppas att Ni kan hjälpa mig!!?

Med andra ord, jag försöker relatera (stavn.) information från 5 olika tabeller till samma "id". (Lite svårt att förklara.)

Tabellerna är:
artister (tabell med alla artister)
genre_music (tabell med genres/kategorier)
music (tabell med album/singlar)
labels (tabell med skivbolag)
lyrics (tabell med sångtexter/lyrics)

Jag vill koppla alla tabeller till artist id:et.

*Förmodlingen har jag strulat till det ordentligt i relationerna. :r

CREATE TABLE `artister` (
  `id` int(11) NOT NULL auto_increment,
  `musicid` int(10) NOT NULL default '0',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `anamn` varchar(80) NOT NULL default '',
  `fnamn` varchar(80) NOT NULL default '',
  `birthday` date NOT NULL default '0000-00-00',
  `formed` date NOT NULL default '0000-00-00',
  `land` varchar(50) NOT NULL default '',
  `medlemmar` varchar(100) NOT NULL default '',
  `artist_foto` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `kategori` tinyint(3) NOT NULL default '0',
  `webb` varchar(100) NOT NULL default '',
  `userid` int(10) NOT NULL default '0',
  `lyrics` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)

CREATE TABLE `genre_music` (
  `id` int(11) NOT NULL auto_increment,
  `genre` varchar(80) NOT NULL default '',
  `g_info` varchar(255) NOT NULL default '',
  `artist` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)

CREATE TABLE `labels` (
  `id` tinyint(3) NOT NULL auto_increment,
  `lnamn` varchar(100) NOT NULL default '',
  `logo` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(50) NOT NULL default '',
  `musicid` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)

CREATE TABLE `lyrics` (
  `id` int(11) NOT NULL auto_increment,
  `artist_id` int(11) NOT NULL default '0',
  `titel` varchar(50) NOT NULL default '',
  `artist` varchar(30) NOT NULL default '',
  `text` text NOT NULL,
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)

CREATE TABLE `music` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `artist` varchar(50) NOT NULL default '',
  `kategori` varchar(50) NOT NULL default '',
  `media` enum('album','singel','dvd','ej angivet') NOT NULL default 'album',
  `label` varchar(50) NOT NULL default '',
  `lyric` varchar(50) NOT NULL default '',
  `tid` varchar(10) NOT NULL default '',
  `added` datetime NOT NULL default '0000-00-00 00:00:00',
  `titel` varchar(100) NOT NULL default '',
  `m_covers` varchar(100) NOT NULL default '',
  `m_info` text NOT NULL,
  `ean` varchar(50) NOT NULL default '',
  `buylink` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)

Koden jag FÖRSÖKER använda, är följande:

<?php }elseif ($_GET['id'] != ""){

$sql = mysql_query("Select * From artister,lyrics Where artister.id='".$_GET['id']."'") or die(mysql_error());
?>
  <table width="<?=$width?>" align="center" class="text_2">
  <?php if (mysql_affected_rows() == 0){?>
    <tr>
      <td>Information saknas.</td>
    </tr>
  <?php }else{
  $RS = mysql_fetch_array($sql);?>
    <tr>
      <?php if ($RS['artist_foto'] != ""){?>
        <td valign="top"><img src=artist_foto/<?=$RS['artist_foto'];?> border=1 width=120 alt=<?=$RS['namn'];?>></td>
      <?php }?>
      <td valign="top">
      <!--
	  [ <a href=favoriter.php?id=<?=$RS['id'];?> title=Lägg&nbsp;till&nbsp;<?=$RS['namn'];?> class="link_2"><b>Lägg till i favoriter</b></a> ]<br>
      <br>
	  -->
      <b>Artist/Grupp):</b> <?=$RS['anamn'];?><br>

      <?php if ($RS['fnamn'] != ""){?>
      <b>Fullständigt namn:</b> <?=$RS['fnamn'];?>
      <br><?php }?>
      <?php if ($RS['birthday'] != ""){?>
      <b>Född:</b> <?=$RS['birthday'];?><br><br>
      <?php }?>
      <b>Information:</b><br>
      <?=nl2br($RS['info']);?><br><br>
      <b>Kategori:</b><br>
      <?=$RS['kategori'];?><br><br>
      <? if ($RS['medlemmar'] != ""){?>
      <b>Medlemmar i gruppen/bandet:</b><br>    
      <?=nl2br($RS['medlemmar']);?><br><br>
      <?php }?>
      <b>Diskografi:</b><br>
      <?=$RS['latar'];?><br><br>

      <b>Sångtexter/Lyrics:</b><br>
      <?=$RS['artist_id'];?><br><br>

      <?php if ($RS['webb'] != ""){?>
      <b>Webb:</b><br>
      <a href=http://<?=$RS['webb'];?> class=link_2 target=_blank><?=$RS['webb'];?></a><br><br>
      <?php }?>
jmeMedlem sedan maj 20011 967 inlägg
#2

SELECT * FROM artister as a, genre_music as gm, labels as l, lyrics as ls, music as m WHERE a.id = x AND a.id = gm.artist AND a.id = ls.artist AND a.id = m.artist AND l.musicid = m.id;

Ovanstående frågan borde hämta all information som gäller en viss artist. Observera att du måse ange artist id där jag har skrivit ett 'x' ( diret efter WHERE-satsen).

PeeerMedlem sedan mars 20025 362 inlägg
#3

Tråden passar bättre i SQL-forumet, så tråden flyttas från PHP!

lillebrorMedlem sedan apr. 20041 687 inlägg
#4

Om du vill säkerställa databasintegriteten (att rätt information lagras på rätt plats) i databasen rekommenderar jag dig att skapa främmandenycklar. Vilka tabeller som skall ha främmandenycklar beror helt och hållet på hur du har valt att designa din databas.

GuldstrandMedlem sedan juli 20041 274 inlägg
#5

jme skrev:

SELECT * FROM artister as a, genre_music as gm, labels as l, lyrics as ls, music as m WHERE a.id = x AND a.id = gm.artist AND a.id = ls.artist AND a.id = m.artist AND l.musicid = m.id;

Ovanstående frågan borde hämta all information som gäller en viss artist. Observera att du måse ange artist id där jag har skrivit ett 'x' ( diret efter WHERE-satsen).

Tack för hjälpen, men nu fick jag...

Unknown column 'm.artist' in 'where clause'

:q

jmeMedlem sedan maj 20011 967 inlägg
#6

Guldstrand:

jag kikade lite på tavlan music och där är artist av typen char. Vad är artist i music? Ska den inte vara en int?

Om du ska ha främmandenycklar så måste de fälten som binds ihop vara av sama typ och av samma storlek. Du kör ibland med int(10) och ibland med int(11). Kör med samma storlek om dessa fält ska bindas ihop.

WHERE a.id = m.artist fungerar inte då a.id är av typen int och m.artist är av typen varchar.

Sen varför du får "Unknown column" är jag inte riktigt säker på för artist finns ju i tavlan music men det kan ha göra med att dessa två fält inte är av samma typ.

Sen om jag minns srätt så måste tavlorna vara av typen InnoDB för att man skall kunna använda främmandenycklar (foreign keys).

GuldstrandMedlem sedan juli 20041 274 inlägg
#7

jme skrev:

Guldstrand:

jag kikade lite på tavlan music och där är artist av typen char. Vad är artist i music? Ska den inte vara en int?

Om du ska ha främmandenycklar så måste de fälten som binds ihop vara av sama typ och av samma storlek. Du kör ibland med int(10) och ibland med int(11). Kör med samma storlek om dessa fält ska bindas ihop.

WHERE a.id = m.artist fungerar inte då a.id är av typen int och m.artist är av typen varchar.

Sen varför du får "Unknown column" är jag inte riktigt säker på för artist finns ju i tavlan music men det kan ha göra med att dessa två fält inte är av samma typ.

Sen om jag minns srätt så måste tavlorna vara av typen InnoDB för att man skall kunna använda främmandenycklar (foreign keys).

Fältet "artist_id" (i music-tabellen) har int(10).
Har även kontrollat så att alla fält har samma "storlek" och "typ", men jag har fortfarande samma problem. :l

GuldstrandMedlem sedan juli 20041 274 inlägg
#8

Jag har lyckats att komma ett steg längre med att hämta rätt information till rätt ID, men det finns fortfarande problem med att hämta ALL information. :(

jmeMedlem sedan maj 20011 967 inlägg
#9

Hur se din nuvarande sqlfråga ut?

GuldstrandMedlem sedan juli 20041 274 inlägg
#10

jme skrev:

Hur se din nuvarande sqlfråga ut?

Den ser ut som följer...

$sql = mysql_query("
SELECT  * 
FROM artister, countries, music, genre_music 
WHERE 
artister.id = ".$_GET['id']." AND 
countries.artist_id AND 
music.artist_id AND 
genre_music.artist_id AND
artister.kat_id
") or die(mysql_error());

:r

jmeMedlem sedan maj 20011 967 inlägg
#11
  1. du har:

WHERE
artister.id = ".$_GET['id']." AND
countries.artist_id AND ...

du måste ha typ:

WHERE
artister = xxx AND countries.artist_id = xxx osv

  1. Placera ALDRIG värden ur GET och POST direkt i sql-värden. Du kan utsätta din kod för s k sql-injections, dvs en illasinnad person kan placera en sql-fråga i parametern id som sedan exekveras.

Googla för med infromation om sql-injections.

jmeMedlem sedan maj 20011 967 inlägg
#12

I tavlorna music och genre_music så har du inte artist_id.

I tavlan music har du fältet label som är av typen varchar men ska den inte vara en int och referera fältet id i tavlan labels (foreign key)?

GuldstrandMedlem sedan juli 20041 274 inlägg
#13

jme skrev:

I tavlorna music och genre_music så har du inte artist_id.

I tavlan music har du fältet label som är av typen varchar men ska den inte vara en int och referera fältet id i tavlan labels (foreign key)?

Såhär ser mina tabeller ut nu.

CREATE TABLE `artister` (
  `id` int(11) NOT NULL auto_increment,
  `kat_id` int(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `anamn` varchar(80) NOT NULL default '',
  `fnamn` varchar(80) NOT NULL default '',
  `birthday` date NOT NULL default '0000-00-00',
  `formed` date NOT NULL default '0000-00-00',
  `land` int(10) unsigned NOT NULL default '0',
  `medlemmar` varchar(100) NOT NULL default '',
  `artist_foto` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(100) NOT NULL default '',
  `lyrics` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `anamn` (`anamn`),
  KEY `land` (`land`),
  KEY `musicid` (`musicid`,`lyrics`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=253 ;

CREATE TABLE `genre_music` (
  `id` int(11) NOT NULL auto_increment,
  `genre` varchar(80) NOT NULL default '',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `kat_ikon` varchar(50) NOT NULL default '',
  `g_info` varchar(255) NOT NULL default '',
  `artist_id` int(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `artist` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;

-- 
-- Dumping data for table `genre_music`
-- 

INSERT INTO `genre_music` VALUES (1, 'Blues', '0000-00-00 00:00:00', 'kat_ikon_1.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (2, 'Humor', '0000-00-00 00:00:00', 'kat_ikon_2.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (3, 'Country', '0000-00-00 00:00:00', 'kat_ikon_3.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (4, 'Folkmusik', '0000-00-00 00:00:00', 'kat_ikon_4.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (5, 'Gospel', '0000-00-00 00:00:00', 'kat_ikon_5.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (6, 'Jazz', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (7, 'Rap', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (8, 'Reggae', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (9, 'Rock', '0000-00-00 00:00:00', 'kat_ikon_9.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (10, 'Filmmusik', '0000-00-00 00:00:00', 'kat_ikon_10.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (11, 'Barn', '0000-00-00 00:00:00', 'kat_ikon_11.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (12, 'Dansband', '0000-00-00 00:00:00', 'kat_ikon_12.png', '', 252, 0);
INSERT INTO `genre_music` VALUES (13, 'Pop', '0000-00-00 00:00:00', 'kat_ikon_13.png', '', 66, 0);
INSERT INTO `genre_music` VALUES (14, 'Techno', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (15, 'Electronica', '0000-00-00 00:00:00', 'kat_ikon_15.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (16, 'Soul & R&B', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (17, 'Hip Hop', '0000-00-00 00:00:00', 'kat_ikon_17.png', '', 0, 0);
INSERT INTO `genre_music` VALUES (18, 'HÃ¥rdrock', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (19, 'Klassiskt', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (20, 'Trance & Dance', '0000-00-00 00:00:00', '', '', 0, 0);
INSERT INTO `genre_music` VALUES (21, 'Metal', '0000-00-00 00:00:00', '', '', 0, 0);

CREATE TABLE `labels` (
  `id` tinyint(3) NOT NULL auto_increment,
  `lnamn` varchar(100) NOT NULL default '',
  `logo` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(50) NOT NULL default '',
  `musicid` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `artist_id` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ;

CREATE TABLE `lyrics` (
  `id` int(10) NOT NULL auto_increment,
  `artist_id` tinyint(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  `titel` varchar(50) NOT NULL default '',
  `artistnamn` varchar(50) NOT NULL default '',
  `text` text NOT NULL,
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=127 ;

CREATE TABLE `music` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `artist_id` int(10) unsigned NOT NULL default '0',
  `kat_id` int(10) unsigned NOT NULL default '0',
  `media` enum('album','singel','dvd','ej angivet') NOT NULL default 'album',
  `label` int(10) unsigned NOT NULL default '0',
  `lyric` int(10) unsigned NOT NULL default '0',
  `tid` varchar(10) NOT NULL default '',
  `added` datetime NOT NULL default '0000-00-00 00:00:00',
  `titel` varchar(100) NOT NULL default '',
  `m_covers` varchar(100) NOT NULL default '',
  `m_info` text NOT NULL,
  `ean` varchar(50) NOT NULL default '',
  `buylink` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `artist` (`artist_id`,`label`,`lyric`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=90 ;

CREATE TABLE `songs` (
  `id` int(10) NOT NULL auto_increment,
  `artist_id` int(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  `kat_id` int(10) unsigned NOT NULL default '0',
  `namn` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `musicid` (`musicid`),
  KEY `artistid` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
GuldstrandMedlem sedan juli 20041 274 inlägg
#14

Jag använder följande kod för att hämta all information från tabellerna ovan.

<?php }elseif ($_GET['id'] != ""){

$sql = mysql_query("
SELECT  * 
FROM artister, countries, music, genre_music 
WHERE 
artister.id = ".$_GET['id']." AND 
countries.artist_id AND 
music.artist_id AND 
genre_music.artist_id AND
artister.kat_id
") or die(mysql_error());

?>

  <table width="<?=$width?>" align="center" class="text_2">
  <?php if (mysql_affected_rows() == 0){?>
    <tr>
      <td>Information saknas.</td>
    </tr>
  <?php }else{
  $RS = mysql_fetch_array($sql);?>
    <tr>
      <?php if ($RS['artist_foto'] != ""){?>
        <td valign="top"><img src=../artist_foto/<?=$RS['artist_foto'];?> border=1 width=100 alt=<?=$RS['namn'];?>></td>
      <?php }?>
      <td valign="top">
      <!--
	  [ <a href=favoriter.php?id=<?=$RS['id'];?> title=Lägg&nbsp;till&nbsp;<?=$RS['namn'];?> class="link_2"><b>Lägg till i favoriter</b></a> ]<br>
      <br>
	  -->
      <b>Artist/Grupp):</b> <?=$RS['anamn'];?><br>
      <?php if ($RS['fnamn'] != ""){?>
      <b>Fullständigt namn:</b> <?=$RS['fnamn'];?><?php }?>
	  <br>
	  
      <?php if ($RS['birthday'] != ""){?>
      <b>Född:</b> <?=$RS['birthday'];?><?php } ?>
	  <br>
	  
	  <?php if ($RS['land'] != ""){?>
      <b>Land:</b> <img src=../bilder/<?=$RS['flagpic'];?> alt=<?=$RS['name'];?>><?php }?>
	  <br>
	  
	  <?php if ($RS['bor'] != ""){?>
      <b>Bor:</b> <?=$RS['bor'];?><?php }?>
	  <br><br>
      
	  <?php if ($RS['info'] != ""){?>
      <b>Information:</b><br>
      <?=nl2br($RS['info']);?><?php }?>
	  <br><br>
      <b>Kategori:</b><br>
      <a href=kategorier.php?id=<?=$RS['id'];?>><?=$RS['genre'];?></a><br><br>
	  
	  <?php if ($RS['medlemmar'] != ""){?>
      <b>Medlemmar i bandet:</b><br>    
      <?=nl2br($RS['medlemmar']);?><br><br>
      <?php }?>
	  
	  <?php if ($RS['musicid'] != ""){?>
      <b>Diskografi:</b><br>
      <a href=musik.php?id=<?=$RS['musicid'];?>><?=$RS['titel'];?></a><?php }?>
	  <br><br>

      <?php if ($RS['lyrics'] != ""){?>
	  <b>Sångtexter/Lyrics:</b><br>
      <?=$RS['lyrics'];?><?php }?>
	  <br><br>

      <?php if ($RS['webb'] != ""){?>
      <b>Officiell webbplats:</b><br>
      <a href=http://<?=$RS['webb'];?> class=link_2 target=_blank><?=$RS['webb'];?></a><br><br>
      <?php }?>

Hade verkligen uppskattat ifall NÅGON kunde hjälpa mig med koden så att den hämtar RÄTT info till resp. ID, samt lite optimering. :r

jmeMedlem sedan maj 20011 967 inlägg
#15

Du har följande i tavlan lyrics:

artist_id tinyint(10) unsigned NOT NULL default '0',

tinyint kan endast lagra värden -128 - 127 men då du kör med unsigned så kan du endast lagra 0-127.

Jag förmodar att artist_id i tavlan lyrics refererar till en viss post i tavlan artiester?

Om du senare tänker köra med foreign keys så kommer du få problem pga att i tavlan lyrics är artist_id unsigned men i tavlan artister så är id inte unsigned och om jag minns rätt så kommer du då inte kunna skapa en foreign key relation mellan dessa två.

I tavlan lyrics har du också artistnamn. Varför, artist_id pekar väl mot en artist?

GuldstrandMedlem sedan juli 20041 274 inlägg
#16

jme skrev:

I tavlan lyrics har du också artistnamn. Varför, artist_id pekar väl mot en artist?

Orsaken till detta är att (lyrics) är ett annat script som jag har användt mig av tidigare på ett lite annorlunda sätt. ;)

Jag kommer ändra alla "värden" på artist_id till samma för att förhindra komplikationer.
Vad mer måste jag göra?

GuldstrandMedlem sedan juli 20041 274 inlägg
#17

Som det ser ut nu, så sparar jag...

artist_id (id:et på artisten i tabellen artister)
kat_id (id:et på kategorin i tabellen genre_music)
label_id (id:et på label i tabellen labels)

..i tabellen "music" när jag lägger till nya album/singlar, men jag vet inte riktigt hur jag ska hämta/visa alla information till rätt artist. :(
(Hoppas någon förstår vad jag menar.)

Eller...
Måste jag spara music id:et i tabellen "artister", samt liknande för övrig info som ska sparas?

Lite klurigt detta ju...

Genererad på 390 ms · cache AV · v20260730165559-full.f96bc7eb