Avatar billede overgreat Forsker
24. juli 2006 - 21:41 Der er 13 kommentarer og
1 løsning

Udvalgsproblem i forbindelse med forespørgsel i php

Hej alle

Jeg har fundet frem til at liste alle bestyrelsesmedlemmer med tilhørende udvalg.

Problemet for mig er dog, at når et bestyrelsesmedlem er med i to udvalg, så står hans navn på to linier.

HVORDAN HOLDER JEG DET TIL AT PERSONEN FREMGÅR EN GANG, MENS UDVALGENE LISTES NEDENUNDER HINANDEN.
----------------------
Sådan ser outputtet ud nu:

Jesper Kasserer Samarbejdsudvalg Tilføj udvalg
Jesper Kasserer Sponsorudvalget Tilføj udvalg
Jesper Kasserer Senior Tilføj udvalg

Sådan ønsker jeg det skal se ud:

Jesper Overgaard Kasserer Samarbejdsudvalg Tilføj udvalg
                          Sponsorudvalget
                          Senior
-----------------------

Her er koden:
                         



        if ($tjeck==se){
        include("config.php");
        $db = mysql_connect($server, $user, $pass);
        mysql_select_db($database, $db);
        $foresp = mysql_query("SELECT navne_basis.id, navne_basis.fornavn, navne_basis.efternavn, navne_basis.adresse, navne_basis.postnr, navne_basis.by, navne_basis.tlf, navne_basis.mobil, navne_basis.billede, navne_basis.email, bestyrelse_medlemmer.navnid, bestyrelse_poster.bpost, udvalg_poster.udvalg
FROM navne_basis, bestyrelse_medlemmer, bestyrelse_poster, udvalg_medlemmer, udvalg_poster WHERE navne_basis.id = bestyrelse_medlemmer.navnid AND bestyrelse_medlemmer.bpost = bestyrelse_poster.id AND navne_basis.id = udvalg_medlemmer.navnid AND udvalg_medlemmer.udvalg = udvalg_poster.id ORDER BY bestyrelse_poster.id") or die(mysql_error());       
        while ($data = mysql_fetch_row($foresp)){
        echo "<tr  valign='top'><td width='150'><h2>$data[1] $data[2]</h2></td><td width='100'><h2><a href='bestadmin.php?opdatermedlemnu=se&id=$data[0]' target='_top'>$data[11]</a></h2></td>";
        echo "<td width='150'><h2>$data[12]</h2></td><td width='100'>
<a href='bestadmin.php?opretudvalg=se&id=$data[0]' target='_top'>Tilføj udvalg</a></td></tr>
        ";
        }}
Avatar billede overgreat Forsker
24. juli 2006 - 21:42 #1
Udvalgene ligger selvfølgelig i samme celle.... opstillingen holdt alligevel ikke helt. :-)

Der er lavet en tabel med celler til navn, bestyrelsespost, udvalg, og tilføj udvalg knappen
Avatar billede overgreat Forsker
25. juli 2006 - 10:57 #2
Er det en slags array jeg skal lave? Håber der er en der kan hjælpe mig på sporet trods sommervarmen!
Avatar billede Slettet bruger
25. juli 2006 - 23:47 #3
Et par ting:
- det er meget lettere at overskue koden, hvis du bruger feltnavne i stedet for numre.
- du udvælger meget mere data, end du rent faktisk bruger.

Et øjeblik, så omorganiserer jeg lige lidt.
Avatar billede Slettet bruger
26. juli 2006 - 00:15 #4
Det er ikke korrekt brug af html-koderne at bruge h2 til alt det, da der jo ikke er tale om overskrifter. Især ikke, da du har sat alt til at blive sat med den. Brug CSS i stedet til at sætte størrelse på tekst.

Derudover har jeg omorganiseret SQL-koden, så den er lettere at overskue. Det er det smarteste, når man er ved at udvikle. Når det så er færdigt, kan man altid samle det igen, hvis man har lyst. Tilsvarende har jeg gjort med udskriften.
$foresp = mysql_query("
  SELECT
    navne_basis.id,
    navne_basis.fornavn,
    navne_basis.efternavn,
    bestyrelse_poster.bpost,
    udvalg_poster.udvalg
  FROM
    navne_basis,
    bestyrelse_medlemmer,
    bestyrelse_poster,
    udvalg_medlemmer,
    udvalg_poster
  WHERE
      navne_basis.id = bestyrelse_medlemmer.navnid
    AND bestyrelse_medlemmer.bpost = bestyrelse_poster.id
    AND navne_basis.id = udvalg_medlemmer.navnid
    AND udvalg_medlemmer.udvalg = udvalg_poster.id
  ORDER BY bestyrelse_poster.id
") or die(mysql_error());

$best_list=array();
while ($data = mysql_fetch_row($foresp)){
  $best_list[$data['id']][]=$data;
}

foreach($best_list as $medlem){
  echo "<tr  valign='top'>";
  echo "<td width='150'>{$medlem[0]['fornavn']} {$medlem[0]['efternavn']}</td>";
  echo "<td width='100'><a href='bestadmin.php?opdatermedlemnu=se&id={$medlem[0]['id']}' target='_top'>{$medlem[0]['bpost']}</a></td>";
  echo "<td width='150'>";
  foreach($medlem as $udvalgspost){
    echo $udvalgspost['udvalg'] . '<br>';
  }
  echo "</td>";
  echo "<td width='100'><a href='bestadmin.php?opretudvalg=se&id={$medlem[0]['id']}' target='_top'>Tilføj udvalg</a></td>";
  echo "</tr>";
}
Avatar billede overgreat Forsker
26. juli 2006 - 11:59 #5
Hej sandbox

Tak for rådene som jeg vil tage til mig.

Jeg har klippet dit udkast ind, men den kommer med et tomt resultat.

Den viser hverken bestyrelsesmedlemmer eller nogle udvalg...
Avatar billede overgreat Forsker
26. juli 2006 - 12:36 #6
Er der nogen der kan se hvad der går galt siden den ikke henter noget som helst og heller ikke bringer nogen fejlmeddelse?
Avatar billede Slettet bruger
26. juli 2006 - 15:23 #7
To ideer:

1) Jeg havde glemt at lave mysql_fetch_row( om til mysql_fetch_assoc(

2) I din kode havde du to } på den sidste linie. Den afsluttende } i min kode skal anses som den første af de to, så der skal altså være en mere bagefter til at afslutte if-blokken, som det hele ligger i.
Avatar billede overgreat Forsker
27. juli 2006 - 14:14 #8
Den virker super.... bare et problem.

Hvis en person er medlem af bestyrelsen, men endnu ikke er en del af et udvalg, så kommer han ikke frem på listen.

Hvordan får jeg ham ind på listen, trods mangel på deltagelse i udvalg?
Avatar billede Slettet bruger
27. juli 2006 - 23:05 #9
Så skal du bruge en OUTER JOIN, som kan skrives på to måder. Mange skriver noget i stil med "... FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.felt = tabel2.felt ...", men det kan også bare gøres med en strategisk placeret *

  SELECT
    navne_basis.id,
    navne_basis.fornavn,
    navne_basis.efternavn,
    bestyrelse_poster.bpost,
    udvalg_poster.udvalg
  FROM
    navne_basis,
    bestyrelse_medlemmer,
    bestyrelse_poster,
    udvalg_medlemmer,
    udvalg_poster
  WHERE
      navne_basis.id = bestyrelse_medlemmer.navnid
    AND bestyrelse_medlemmer.bpost = bestyrelse_poster.id
    AND navne_basis.id *= udvalg_medlemmer.navnid
    AND udvalg_medlemmer.udvalg = udvalg_poster.id
  ORDER BY bestyrelse_poster.id

Her er den anden skrivemåde, hvis den første ikke skulle virke (jeg er ikke helt sikker på den videre forbindelse fra udvalg_medlemmer til udvalg_poster):

  SELECT
    navne_basis.id,
    navne_basis.fornavn,
    navne_basis.efternavn,
    bestyrelse_poster.bpost,
    udvalg_poster.udvalg
  FROM
    bestyrelse_medlemmer
    JOIN navne_basis ON bestyrelse_medlemmer.navnid = navne_basis.id
    JOIN bestyrelse_poster ON bestyrelse_medlemmer.bpost = bestyrelse_poster.id
    LEFT OUTER JOIN udvalg_medlemmer ON bestyrelse_medlemmer.navnid = udvalg_medlemmer.navnid
    JOIN udvalg_poster ON udvalg_medlemmer.udvalg = udvalg_poster.id
  ORDER BY bestyrelse_poster.id

Og hvis den melder fejl, skal der måske lidt parenteser til:

  SELECT
    navne_basis.id,
    navne_basis.fornavn,
    navne_basis.efternavn,
    bestyrelse_poster.bpost,
    udvalg_poster.udvalg
  FROM
    ((((bestyrelse_medlemmer
    JOIN navne_basis ON bestyrelse_medlemmer.navnid = navne_basis.id)
    JOIN bestyrelse_poster ON bestyrelse_medlemmer.bpost = bestyrelse_poster.id)
    LEFT OUTER JOIN udvalg_medlemmer ON bestyrelse_medlemmer.navnid = udvalg_medlemmer.navnid)
    JOIN udvalg_poster ON udvalg_medlemmer.udvalg = udvalg_poster.id)
  ORDER BY bestyrelse_poster.id
Avatar billede overgreat Forsker
28. juli 2006 - 11:06 #10
Nummer 1 giver en sql kode fejl.

2 og 3 giver stadig bare et blankt output...

Jeg har prøvet lidt frem og tilbage men kan ikke finde frem til fejlen.
Avatar billede overgreat Forsker
28. juli 2006 - 11:08 #11
Det er korrekt at sammenhængen er:

udvalg_medlemmer.udvalg = udvalg_poster.id
Avatar billede Slettet bruger
28. juli 2006 - 17:57 #12
Måske

SELECT
    navne_basis.id,
    navne_basis.fornavn,
    navne_basis.efternavn,
    bestyrelse_poster.bpost,
    udvalg_poster.udvalg
  FROM
    ((((bestyrelse_medlemmer
    JOIN navne_basis ON bestyrelse_medlemmer.navnid = navne_basis.id)
    JOIN bestyrelse_poster ON bestyrelse_medlemmer.bpost = bestyrelse_poster.id)
    LEFT OUTER JOIN udvalg_medlemmer ON bestyrelse_medlemmer.navnid = udvalg_medlemmer.navnid)
    LEFT OUTER JOIN udvalg_poster ON udvalg_medlemmer.udvalg = udvalg_poster.id)
  ORDER BY bestyrelse_poster.id
Avatar billede overgreat Forsker
28. juli 2006 - 20:27 #13
Superb..... det virker!

Sender du et meget velfortjent svar!

Mange tak for hjælpen og videregivelse af lidt visdom!
Avatar billede Slettet bruger
28. juli 2006 - 20:57 #14
Velbekomme
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester