Gå til innhold

Mange-til-mange, hvordan løse i php?


Anbefalte innlegg

Litt dårlig formulert topic kanskje, menmen.

Jeg har en mange-til-mange relasjon, tre tabeller med koblinger til en i midten, som vanlig er. Jeg lurer på hvordan dette kan løses i php. Jeg driver å lager en side om AC/DC, og nå skal jeg til på lineup. En lineup har selfølgelig flere medlemmer. Så jeg tenkte det slik at når jeg har fylt inn en medlem på lineup'en, skal en linje til "sprette opp". Går dette an å løse med php? Hvordan gjør jeg det?

 

For å tegne et lite bilde, så har jeg "member", "instrument" og "lineup"; disse tre tabellene har relasjoner til "member_on_lineup".

Har tenkt å bruke en lignende løsning for flere funksjoner, så håper dette går an å gjøre.

 

Håper noen forstod hva jeg mente her...

Lenke til kommentar
Videoannonse
Annonse

Løse det med PHP?

Antar at det er en SQL database og da kan du sende spørringer fra PHP, men du må løse det med SQL dersom det er en SQL database.

 

Forklar hva du vil hente fra databasen og kom gjerne med et eksempel. En til mange burde ikke være noe problem - det er vanlig, det er mange til mange som gir problemer.

Lenke til kommentar

Jeg mener at når jeg går inn på siden er det en "linje" der. Hadde tenkt å bruke "dropdown" menyer. Så i dette eksempelet velger man medlem og instrument (måtte skille dette pga små forandringer en sjelden gang...). Når man har gjort dette ville jeg at en "linje" til skulle bli lagd. Alternativet er at når man går inn på siden (fx "Add Lineup"), blir 5-6 linjer (en linje per bandmedlem) lagd.

 

Usikker på om/hvordan dette kan gjøres siden jeg ikke har gjort det før.

Noen som forstod litt mer nå?

Lenke til kommentar

Er fremdeles ikke helt sikker på hva du egentlig spør etter (er ikke så stø på musikersjargong, hva er en "line up"?).

 

Men slik jeg forstår deg skal du altså kjøre følgende scenario:

 

- Velg en artist -> liste/dropdown-meny over instrumenter denne har spilt generers

- Velg instrument -> liste over alle plater denne artisten har spilt dette instrumentet med hvilke andre artister som har spilt hva genereres og vises.

 

Korrekt?

 

I såfall er dette forholdsvist trivielt:

 

- Først henter du ut alle artister og genererer en listeboks.

- Når denne er valgt bruker du ID fra den til å finne alle instrumenter vedkommende har spilt.

- Når instrument er valgt kjører du to spørringer og viser resultatet. (Det kan gjøres mere fancy, men dette blir mest oversiktlig. Se evt. nedenfor.)

 

De siste spørringen blir da noe slikt som (kan ikke sjargongen, så jeg bruker navn jeg tror er lett forståelige):

 

 

Først finner vi de platene vedkommende har spilt på.

SELECT Plate_id 
FROM Besetning 
WHERE musiker_id=musiker_id_fra_skjema 
AND instrument_id=instrument_id_fra_skjema

 

Deretter spør vi om besetningen på disse platene.

SELECT Plate.Tittel, Medlem.Navn, Instrument.Instrumentnavn 
FROM Plate, Medlem, Instrument, Besetning 
WHERE Besetning.plate_id=plate_id_fra_forrige_spørring 
AND Plate.id=Besetning.plate_id 
AND Medlem.id=Besetning.medlem_id 
AND Instrument.id=Besetning.instrument_id 

 

Som sagt det ER mulig å gjøre dette i en spørring ved hjelp av aliasser. Men for oversiktens skyld er det like greit å kalle to spørringer. Den siste vil da returnere en liste hvor hver rad inneholder: Platetittel, Medlemsnavn, Instrument. Denne er det greit gjort å formatere som du vil i PHP.

 

 

 

Hvis du vil bruke en enkelt spørring kan du prøve (med forbehold om at jeg er litt rusten på SQL):

 

SELECT Plate.Tittel, Medlem.Navn, Instrument.Instrumentnavn 
FROM Plate, Medlem, Instrument, Besetning AS Besetning_1, Besetning AS Besetning_2 
WHERE Plate.id=Besetning_1.plate_id 
AND Medlem.id=Besetning_1.medlem_id 
AND Instrument.id=Besetning_1.instrument_id 
AND Besetning_1.plate_id=Besetning_2.plate_id 
AND Besetning_2.medlem_id=medlem_id_fra_skjema 
AND Besetning_2.instrument.id=instrument_id_fra_skjema

Som sagt er litt rusten på dette, så er ikke 100% sikker på om denne vil funke...

 

 

 

Var dette riktig, eller misforsto jeg helt nå? :blush:

Lenke til kommentar

Tror du misforsto litt. Tror jeg skal klare SQL-biten.

Lineup er hvem spilte i bandet på dette tidspunktet, besetning er sikkert et greit norsk ord. Det jeg vil her, er å lage lineup'ene.

Når skal lage en lineup, legger jeg inn fx et bilde av denne lineup'en, litt info, og muligens fra-til dato denne lineup'en eksisterte.

 

Så vil jeg legge inn medlemmene på akkurat denne lineup'en med hvilke instrument de spilte her (En medlem har spilt flere instrumenter i forskjellige lineups, så kunne ikke legge instrument direkte i medlem tabellen).

Jeg har en tabell med instrument. Disse setter jeg inn i en dropdownboks. Det samme gjør jeg med medlemmene i bandet. Så når jeg skal legge til medlemmene på lineup'en, får jeg opp en dropdownboks med alle medlemmene fra medlemstabellen, og alle instrumentene i en ny dropdownboks. Når jeg har valgt fx "Medlemsnavn" og "Lead Guitar", vil jeg at en ny linje hvor jeg kan velge en ny medlem med instrument skal blir lagd nedenfor den medlemmen jeg akkurat skrev inn.

 

Med medlemmer kunne jeg bare lagd fx 5 linjer, men når jeg skal lage album med sanger, blir det værre. De forandrer seg ganske mye. Og når jeg skal legge inn bootlegs blir det enda værre. Derfor hadde det vært topp om det gikk an å gjøre noe slikt.

 

Går vel ikke an uten en OK knapp per medlem (linje) eller noe sånt, men håper det er løselig. Et annet alternativ kan jo være å først velge hvor mange "linjer" man skal ha på denne lineup'en/CDen, og så blir de tegnet opp.

 

Alle linjene må vel også ha ulike navn så må vel legge inn en $i på slutten av navnet regner jeg med. Fx "medlem".$i og "instrument".$i

 

Håper noen kan hjelpe meg litt med dette her. Hadde vært kjempeflott om det gikk an å få til :)

 

Bilde med et eksempel av hvordan jeg har tenkt det

Endret av Pangaea
Lenke til kommentar
Alle linjene må vel også ha ulike navn så må vel legge inn en $i på slutten av navnet regner jeg med. Fx "medlem".$i og "instrument".$i

 

Bare bruk $instrument[] og medlem[].

Så kjører du en "$linjer=count($instrument);" før du legger den inn i SQL.

 

Hvordan du skal løse problemet med å få en ekstra "linje" når man har valgt, vet jeg ikke. Må vel bruke javascript da...?

 

Alternativet er at man på forhånd velger hvor mange man skal ha...

Lenke til kommentar

Ikke kjempebrukervennlig å måtte velge antall medlemmer osv på forhånd, men jeg velger den løsning for nå vertfall.

Håper jeg er på rett veg her...

 

$num = htmlspecialchars(mysql_escape_string(trim($_POST['num'])));

 

SQL:

$query = "INSERT INTO acdc_lineup (picture, notes, from_d, from_m, from_y, to_d, to_m, to_y)
       VALUES ('$picture', '$notes', '$from_d', '$from_m', '$from_y', '$to_d', '$to_m', '$to_y')";

$result = mysql_query($query) or die ("Could not execute query.".mysql_error());
$lineup_id = mysql_insert_id();
$i = 0;
while($i < $num)
{
       $instrument_id = $_POST['instrument'.$i]."<br/>";
       $member_id = $_POST['member'.$i]."<br/>";
       $i++;
       $query = "INSERT INTO acdc_member_on_lineup (lineup_id, member_id, instrument_id)
               VALUES ('$lineup_id', '$member_id', '$instrument_id')";
       $result = mysql_query($query) or die ("Could not execute query.".mysql_error());
}

 

PHP:

$i = 0;
while($i < $num)
{
       echo "<select name=\"instrument$i\">";
       instrument($instrument_id);
       echo "<select name=\"member$i\">";
       member($member_id);
       $i++;
}

 

Har lagt navnet utenfor funksjonen fordi jeg trenger unikt navn på hver av de. Kunne vel også tatt det i et argument til da, menmen.

 

Ser det noenlunde fornuftig ut?

Lenke til kommentar

Nå forstår jeg absolutt ingenting igjen. argh

 

instrument() funsjonen:

function instrument($instrument_id)
{
       $result = mysql_query("select * from acdc_instrument order by instrument");

       //echo "<select name=\"instrument\">";
       echo "<option value=\"Select an instrument\">Select an instrument</option>";
       echo "<option value=\"--------------\">--------------</option>";
       while ($record = mysql_fetch_assoc($result))
       {
               if($record['instrument_id'] == $instrument_id)
               {
                       echo "<option value=".$record['instrument_id']." selected>".$record['instrument']."</option>";
               }
               else
               {
                       echo "<option value=".$record['instrument_id'].">".$record['instrument']."</option>";
               }
       }
       echo "</select>";
}

 

legge instrument_id til array

$i = 0;
while($i < $num)
{
       $instrument[] = $_POST['instrument'.$i];
       $member[] = $_POST['member'.$i];
       $i++;
       echo $instrument[0];
}

 

vise det som er i dropdownboksen

echo "<select name=\"instrument0\">";
instrument($instrument[0]);

 

Det merkelige er at jeg echoer ut arrayen, og får opp tall, dropdownboksen klarer ikke å skrive ut det den skal. Legger jeg inn et tall til arrayen blir det rett. Men det burde jo funke siden der allerede ligger et tall i arrayen. Forstår fint lite her ass...

 

Noen som ser hva som er galt?

 

Edit: Vet ikke hva som var galt, men nå funker det vertfall :w00t:

Endret av Pangaea
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...