Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP / MySQL] html tabel opbouwen uit 3 mysql tabellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een systeempje aan het maken waarbij leden van een band de aanwezigheid van optredens aan kunnen geven.

er zijn 3 tabellen:

members:
- memberID - auto increment en sleutel
- username
- password

gigs:
- gigID - autoincrement en sleutel
- omschrijving
- datum

aanwezigheid:
- gigID
- memberID
Deze zijn samen sleutel omdat iedereen maar 1 keer per optreden mee doet en dat dus een unieke combinatie is
- keuze (wordt aangegeven met een 1 of 0)


Maar nu wil ik in een html tabel laten zien waarin per optreden aangegeven wordt wie er wel kan en wie niet.

horizontaal moeten dan de namen van de mensen komen te staan en verticaal de optredens (of andersom

code:
1
2
3
4
5
6
7
8
+----------+---------+---------+---------+---------+
|          |1        |3        |6        |7        |
+----------+---------+---------+---------+---------+
|1         |X        |         |         |         |
|3         |         |         |         |         |
|6         |         |         |X        |         |
|7         |X        |         |         |         |
+----------+---------+---------+---------+---------+

in deze tabel is als voorbeeld aangekruist bij een optreden wanneer iemand er is.

het laten zien van een tabel via html / php is niet het probleem maar ik krijg het niet voor elkaar met de gegevens uit 3 verschillende tabellen.

ik heb deze site gevonden waar in principe hetzelfde gevraagd wordt:
http://stackoverflow.com/questions/2634307/single-html-table-from-multiple-mysql-tables

maar daarmee krijg ik het ook niet werkend. Ik krijg telkens maar een deel van de informatie te zien of het staat niet in een normale tabel.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
een tabel wordt van linksboven naar rechtsonder opgebouwd...
met de juiste for-lusjes, lijkt me dat genoeg informatie eerlijk gezegd...

forlus1: de rijen
forlus2 IN forlus1: de kolommen
waarde zoeken IN forlus2 IN forlus1: de aanwezigheid

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 21-11 19:24

Kwastie

Awesomeness

Je kunt dit waarschijnlijk oplossen met een full outer join. Wikipedia: Join (SQL)

When I get sad i stop being sad and be awesome instead


Verwijderd

Topicstarter
P.O. Box schreef op donderdag 30 mei 2013 @ 16:44:
een tabel wordt van linksboven naar rechtsonder opgebouwd...
met de juiste for-lusjes, lijkt me dat genoeg informatie eerlijk gezegd...

forlus1: de rijen
forlus2 IN forlus1: de kolommen
waarde zoeken IN forlus2 IN forlus1: de aanwezigheid
Omdat een tabel dus van linksboven nar rechtsonder wordt opgebouwd krijg ik het op deze manier niet voor elkaar.

als ik dit gebruiken kloppen de waarde bij sommige personen niet en komt hij niet verder dan of 1 optreden of 1 persoon.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je "moet" het splitsen in 3 queries...

eerst haal je alle bandleden op.... daar lus je doorheen (forlus1)
IN die forlus haal je alle gigs op... daar lus je doorheen (forlus2)
IN die forlus haal je voor het betreffende bandlid en de betreffende gig de aanwezigheid op...
pas DAN print je de TD...

het kan ook allemaal wel in minder queries, maar dat is, gezien je vraag, misschien nog iets teveel van het goede... bij het begin beginnen ;)

Verwijderd

Topicstarter
aha dat maakt dan waarschijnlijk wel het verschil bij mij want dat deed ik uiteraard niet :9

Ik ga het meteen proberen!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Houdt er wel rekening mee dat het zo ongeveer de makkelijkste maar ook de slechtste methode is.

Verwijderd

Topicstarter
Als ik het zo voor elkaar krijg ga ik daarna wel op zoek naar betere methoden :)

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 18-11 12:06
P.O. Box schreef op donderdag 30 mei 2013 @ 19:37:
je "moet" het splitsen in 3 queries...

eerst haal je alle bandleden op.... daar lus je doorheen (forlus1)
IN die forlus haal je alle gigs op... daar lus je doorheen (forlus2)
IN die forlus haal je voor het betreffende bandlid en de betreffende gig de aanwezigheid op...
pas DAN print je de TD...

het kan ook allemaal wel in minder queries, maar dat is, gezien je vraag, misschien nog iets teveel van het goede... bij het begin beginnen ;)
Je weet wel dat je dan aantal bandleden * aantal gigs aan queries uit gaat voeren he? Als je het dan al zonder join wil doen, doe het dan met 3 queries. 1 voor alle bandleden, 1 voor alle gigs en 1 voor alle aanmeldingen.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Phoenix1337 schreef op donderdag 30 mei 2013 @ 20:49:
[...]


Je weet wel dat je dan aantal bandleden * aantal gigs aan queries uit gaat voeren he? Als je het dan al zonder join wil doen, doe het dan met 3 queries. 1 voor alle bandleden, 1 voor alle gigs en 1 voor alle aanmeldingen.
natuurlijk weet ik dat... maar mag toch hopen dat je ook wel door hebt dat TS een beginner is... nou, laat een beginner dan ook bij het begin beginnen...

dat gezegde met die vis geven of leren vissen kan uitgebreid worden dat je iemand niet meteen moet leren om een walvis te vangen... begin maar met een voorntje :)

Verwijderd

Topicstarter
Het is me eindelijk gelukt.

Maar volgens mij is dit de meest omslachtige manier ooit om dit te doen.

Nu heb ik 3 aparte divs:

div 1: een tabel met in elke column een 'gig' omschrijving
div 2: een tabel met rijen, elke rij is een nieuwe naam
div 3: een tabel waarin de aanwezigheid wordt aangegeven

Eerst worden de de omshrijvingen van de optredens (gigs) opgehaald en getoond, dan de namen. Dan wordt er nog een keer door de optredens namen geloopt en daarin door de optredens om op voor iedere persoon zijn keuze voor de verschillende optredens op te halen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$members = 0;           // Variable for total amount of members
$gigs = 0;              // Variable for total amount of gigs
$gigcounter = 1;        // Variable to keep track of lines in table


// Build top row of table with the gig names
echo ("<div id=gigtabel><table border = 1><tr><td width = 100></td>");
$sqlgig = "SELECT * FROM gigs";
$resultgigs = mysql_query($sqlgig);
while($rowgigs = mysql_fetch_array($resultgigs)){
    $gigs++;
    echo "<td width = 200>";
    echo $rowgigs['omschrijving'];
    echo "</td>";
}

// Build left column of table with the member usernames
echo "</tr></table></div><div id=memberstabel><table border = 1>";
$sqlmembers = "SELECT * FROM members";
$resultmembers=mysql_query($sqlmembers);
while($rowgig = mysql_fetch_array($resultmembers)){
    echo "<tr><td width = 100>";
    echo ($rowgig['username']);
    echo "</td></tr>";
    $members++;
}

echo "</tr></table></div><div id=keuzetabel>";


// Get the values that are used to fill the table
echo "<table border = 1><tr>";

$sqlmembers = "SELECT * FROM members";
$resultmembers=mysql_query($sqlmembers);
while($rowgig = mysql_fetch_array($resultmembers)){
    $sqlgig = "SELECT * FROM gigs";
    $resultgigs = mysql_query($sqlgig);
    while($rowgigs = mysql_fetch_array($resultgigs)){
        $sqlaanwezigheid = ("SELECT * FROM aanwezigheid WHERE memberID =". $rowgig['memberID']." AND gigID =". $rowgigs['gigID']);
        $resultaanwezigheid = mysql_query($sqlaanwezigheid);
        while($rowaanwezigheid = mysql_fetch_array($resultaanwezigheid)){
            echo ("<td width = 200>".$rowaanwezigheid['keuze']."</td>");
            if ($gigcounter == $gigs){
                $gigcounter = 1;
                echo "</tr><tr>";
            }else{
                $gigcounter++;
            }
        }
    }
}   

echo "</tr></table></div>";


Ik krijg het niet voor elkaar om in 1 keer een tabel te maken omdat ik de namen of optredenomschrijving dan telkens weer naar het scherm schrijf terwijl dat maar 1 keer zou moeten.

De divs zet ik met css op de goeie plaats.

Maar nu schaalt mijn table dus ook niet meer, gelukkig maakt dat nu in mijn geval niet zo veel uit.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je hebt het wel heel creatief gedaan :)

ik dacht meer aan zoiets (ook niet de beste oplossing, maar om te beginnen al beter).. als je dit hebt, kun je daarna verder leren optimaliseren (aantal queries verminderen enzo):

(let op, dit is geen exacte code, dat mag je er zelf van maken ;))
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$query_members = "<select members>";

while ($query_members_row = $query_member_result->fetch_object()) {
  if ($firstmember) then print header-row;
  $query_gigs = "<select gigs>";
  print "<tr><td>";
  print $membername;
  print "<td>
  while ($query_gigs_row = $query_gigs_result->fetch_object()) {
      $query_check = "<select aanwezigheid where gigid = #gigid# and memberid = #memberid>";
      if (recordbestaat en waarde = 1) {
          print "<td>Ja</td>";
      } else {
         print "<td>Nee</td>";
     }
  }
  print "</tr>";
}


dit is niet de idale manier... beter is om je hierna ook te verdiepen in JOINS en dergelijke, waardoor je met minder SQL-statements, en slim gekozen loops, hetzelfde effect bereikt met minder belasting voor je database en server

[ Voor 11% gewijzigd door P.O. Box op 04-06-2013 18:45 ]

Pagina: 1