tabel vullen op datum en tijd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Reshad F

Reshad F

11/10/2013 20:58:32
Quote Anchor link
Hello,

Ergens waar ik niet helemaal uitkom is het volgende.

Ik heb een lijst in de database als volgt

id - name - datetime

Nu wil ik vervolgens deze items allemaal selecteren en laten zien als volgt

Ik heb een tabel in mijn pagina met datum in het linker kolom en vervolgens tijden

| datum | 9 tot 10 | 10 tot 11 | etc etc..

Vervolgens wil ik de namen die ik uit de database wil halen sorteren en goed zetten aan de hand van datum/tijd.. maar hoe doe ik dit handig? ik kom er even zelf niet meer uit dus als iemand even mee kan/wil denken :)
 
PHP hulp

PHP hulp

17/11/2024 11:47:16
 
Dennis WhoCares

Dennis WhoCares

11/10/2013 21:30:34
Quote Anchor link
Je bedoelt gewoon je resultaten sorteren op datum/tijd ?
in je SQL query ORDER BY datetime DESC

als je de nieuwste als eerste wilt gebruiken we DESC, en als je de oudste wilt, ASC
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/10/2013 21:42:09
Quote Anchor link
vul je voorbeeldje eens verder aan? je laat nu alleen de headers zien maar laat eens een voorbeeld-rij zien?
 
Reshad F

Reshad F

11/10/2013 21:56:02
Quote Anchor link
@Dennis nee in vakjargon heet dit pivot table

@Frank

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
DATE       | 9 to 10  | 10 to 11   | 11 to 12

11-10-2013 | John     | Chris      | Barbara


Maar mochten er dus meerdere namen op dezelfde tijdstip komen te vallen bijvoorbeeld tussen 9 en 10 dan krijg je dus John en eronder weer de volgende naam. maar ik ben al blij als hij het zoals in het voorbeeldje al doet :)
Gewijzigd op 11/10/2013 21:57:16 door Reshad F
 
Erwin H

Erwin H

11/10/2013 23:55:20
Quote Anchor link
Volgens mij moet je twee dingen splitsen. Ten eerste heb je het ophalen van je data uit de database, ten tweede heb je de presentatie op het scherm. In menig applicatie zijn die lagen al gescheiden en in dit geval zou ik er zeker voor kiezen om dat te doen. Het ophalen van de data wordt dan vrij eenvoudig
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT id, naam, DATE(datetime) AS datum, TIME(datetime) AS tijd
FROM tabel
WHERE....

En in php kan je de presentatie verzorgen. Ik zou er dan gewoon een matrix van maken. Dus door al je opgehaalde records lopen en in feite alleen dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$matrix
= array();
while( $row = etc ){
  $matrix[$row['datum']][$row['tijd'][] = $row['naam'];
}

?>

Vervolgens kan je die matrix omzetten naar een mooie tabel.
Je kan de hele matrix vast ook wel in SQL bouwen, maar persoonlijk zie ik daar het nut niet van in, helemaal niet als je data en presentatie toch al gescheiden hebt, dan wil je helemaal niet dat je datalaag bepaalt hoe de data vorm gegeven wordt.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/10/2013 18:34:12
Quote Anchor link
Natuurlijk kan je zo'n matrix ook in SQL bouwen, en ik zie ook het nut daar niet van in. Databases zijn 2 dimensionaal, alleen ik begrijp jou argumentatie niet helemaal.
Imo heeft een array opbouwen niets met presentatie te maken maar met data, in een MVC zou ik dat in het model doen.

En als ik een beetje ga muggenziften ben je ook niet helemaal consequent, DATE(datetime) en TIME(datetime) is dan ook presentatie.
 
Erwin H

Erwin H

12/10/2013 20:28:49
Quote Anchor link
Als je ziet hoe ik die matrix bouw dan zie je dat dat in feite die matrix al in het model gebouwd wordt. Maar op zich is dat een keuze. Het is een tussenstap tussen de rauwe data die je uit een database haalt en de vorm waarin je het in de view nodig hebt. Of je die tussenstap dus uitvoert in het model, of in de view (in MVC termen) is volgens mij gewoon een persoonlijke keuze.

Het DATE en TIME is inderdaad al inconsequent, op zich niet nodig.
 
Reshad F

Reshad F

12/10/2013 20:44:20
Quote Anchor link
Erwin ik heb een beetje moeite om de array nu netjes in mijn tabel te krijgen Ik heb het volgende tot nu toe. ( de data komen nu goed ) maar ik krijg de namen niet in de juiste vakjes bij de juiste tijd..

Afbeelding

En de code als volgt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

$res
= $mysqli->query(
    "SELECT name, date(datum) as datum, hour(datum) as tijd
    FROM Lijst
    ORDER BY datum
    "
);
if(!$res) {
    echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;
}

else {

    $matrix = array();
    while ($row = $res->fetch_assoc()) {
        
        $matrix[$row['datum']]['tijd'][] = $row['name'];

            $var = '<table class="striped">';
            $var .= '<tr class="header" id="ax">';
            $var .= '<td id="a_datum">Datum</td>';
            
                for($i=9; $i<24; $i++) {

                    $var .= '<td>' . $i . ':00</td>';                        
                }

            
            $var .= '</tr>';

            foreach ($matrix as $key => $value) {
                # code...
                $var .= '<tr>';
                $var .= '<td>';
                $var .= $key;
                $var .= '</td>';

                $var .= '</tr>';

            }



            $var .= '</table>';



    }

            
            echo $var;
            
}


?>


ps. de bovenste row maak ik gewoon zelf met die for loop dat zijn niet de tijden uit de DB
Gewijzigd op 12/10/2013 22:23:57 door Reshad F
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/10/2013 09:52:00
Quote Anchor link
Je moet eerst de matrix opbouwen in de while lus en die dan daarna uitlezen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
55
<?php
// eerst een array voor de tijden zodat elke datum alle tijden krijgt
$times = array();
for ($i=9; $i<24; $i++) {
    $times[$i] = array();
}

$res = $mysqli->query(
    "SELECT name, date(datum) as datum, hour(datum) as tijd
    FROM Lijst
    ORDER BY datum, tijd
    "
);
$date = '';
if(!$res) {
    echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;
}

else {
    $matrix = array();
    // matrix vullen
    while ($row = $res->fetch_assoc()) {
        if ($row['datum'] != $date) {
            $date = $row['datum'];
            $matrix[$date] = $times;
        }

        $matrix[$date][$row['tijd']][] = $row['name'];
    }

    // de tabel beginnen
    $var = '<table class="striped">';
    $var .= '<tr class="header" id="ax">';
    $var .= '<td id="a_datum">Datum</td>';
            
    for($i=9; $i<24; $i++) {

        $var .= '<td>' . $i . ':00</td>';                        
    }

            
    $var .= '</tr>';
    // de matrix uitlezen
    foreach ($matrix as $datekey => $timearray) {
        $var .= '<tr><td>' . $datekey . '</td>';
        foreach ($timearray as $names) {
            $var .= '<td>';
            if (count($names) > 0) {
                $var .= implode('<br>', $names);
            }

            else {
                $var .= '&nbsp;';
            }

            $var .= '</td>';
        }

        $var .= '</tr>' . PHP_EOL;
    }

    $var .= '</table>';
    echo $var;
}

?>
 
Reshad F

Reshad F

13/10/2013 10:17:52
Quote Anchor link
@Ger

Precies als ik nodig had!

thanks :)

Toevoeging op 13/10/2013 11:23:35:

Edit:


Ik heb nu een tweede tijd toegevoegd zodat ik kan aangeven uur VAN en uur TOT dit lukt al. alleen hoe krijg ik nu alle uren daartussen ook gevuld?
Gewijzigd op 13/10/2013 10:51:21 door Reshad F
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/10/2013 11:54:51
Quote Anchor link
In plaats van op regel 24 één tijd in te vullen met een for lus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
for ($h = (int)$row['van']; $h < (int)$row['tot']; $h++) {
    $matrix[$date][$row[$h]][] = $row['name'];
}

?>

Of bedoel je dit niet?
Gewijzigd op 13/10/2013 11:55:07 door Ger van Steenderen
 
Reshad F

Reshad F

13/10/2013 12:32:20
Quote Anchor link
Ja dat is wat ik bedoel.. alleen krijg ik nu op een of andere manier een undefined offset error. De namen komen er overigens wel alleen niet meer in de juiste tijdvak.

Ik heb er dit van gemaakt om te kijken of $h de juiste integers heeft en ik krijg netjes 14 en 15 terug.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
        for ($h = (int)$row['tijd_van']; $h < (int)$row['tijd_tot']; $h++) {

            echo $h;
            $matrix[$date][$row[$h]][] = $row['name'];
        }

?>


dit is zoals ze worden weergegeven nu

Afbeelding
Gewijzigd op 13/10/2013 12:42:43 door Reshad F
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/10/2013 12:44:55
Quote Anchor link
Hoe ziet je query er nu uit?

Toevoeging op 13/10/2013 12:49:10:

Laat maar, de undefined offset komt van $row[$h], het moet dus zijn:
$matrix[$date][$h][] = $row['name'];
 
Reshad F

Reshad F

13/10/2013 12:56:02
Quote Anchor link
@Ger dat was hem! bedankt :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.