datums weergeven in tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Davey Mat

Davey Mat

07/08/2013 23:26:27
Quote Anchor link
Ik weet niet of dit de juiste plek is om met deze vraag te komen, anders sorry mods, verplaats mijn bericht dan aub!:)

Nu mijn probleem: Ik heb een databasetabel met de volgende kolommen;
id,datum1,datum2,naam,datumaanvraag,status,commentaar,admincommentaar.
Kolom id geeft een unieke id aan iedere aanvraag.
datum1 geeft begindatum aan,
datum2 einddatum.
naam bevat de naam van de persoon die de aanvraag heeft geplaatst.
datumaanvraag is de datum dat de aanvraag is geplaatst.
Status of de aanvraag al is geaccepteerd ja/nee.
commentaar bevat commentaar van degene die de aanvraag instuurt,
admincommentaar bevat commentaar van de admin op de aanvraag.

Nu wil ik een tabel maken met bovenaan de datums van 1 maand/ 1 week. Aan de zijkant de namen van alle mensen. Als een aanvraag van datum1 t/m datum2 bij een persoon in een week valt wil ik daar in de tabel kruisjes hebben. Zie hier een voorbeeld: http://i.imgur.com/pSSYEyz.png (de rode kruisjes in het plaatje geven bijvoorbeeld aan als de datum in de bovenste rij matcht met de datum van een aanvraag bij die persoon.)

Ik weet alleen niet hoe ik dit moet aanpakken. Om een array te krijgen van alle datums tussen datum1 en datum2 heb ik wel dit gevonden:
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
<?php
/**
 * creating between two date
 * @param string since
 * @param string until
 * @param string step
 * @param string date format
 * @return array
 * @author Ali OYGUR <[email protected]>
 */

function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {

    $dates = array();
    $current = strtotime($first);
    $last = strtotime($last);

    while( $current <= $last ) {

        $dates[] = date($format, $current);
        $current = strtotime($step, $current);
    }


    return $dates;
}

//toon periode in array
print_r(dateRange($datum1, $datum2));
}

?>

Voorbeeld: datum1=2013-08-14 en datum2=2013-08-23
Dan krijg ik als output:
Array ( [0] => 14/08/2013 [1] => 15/08/2013 [2] => 16/08/2013 [3] => 17/08/2013 [4] => 18/08/2013 [5] => 19/08/2013 [6] => 20/08/2013 [7] => 21/08/2013 [8] => 22/08/2013 [9] => 23/08/2013 )

Nu de tabel nog, maar ik weet niet hoe ik dat precies moet gaan aanpakken.
Ik hoop dat ik mijn probleem goed heb omschreven?
Kan iemand mij alsjeblieft op weg helpen? Alle tips zijn meer dan welkom!:)
Gewijzigd op 07/08/2013 23:33:59 door Davey Mat
 
PHP hulp

PHP hulp

22/11/2024 17:51:58
 
Eddy E

Eddy E

08/08/2013 08:09:50
Quote Anchor link
Je gaat je rijen uit je database aflopen.
Op de plek waar je de data (datums) wilt hebben loop je echter NIET je rijen uit database af, maar de array met data uit de functie.
Daar kijk je of de datum uit de functie ook als datum in de database-array stond. Dus met if(in_array($datum_database, $datum_functie));

Als dat het geval is (dus true), dan zet je een kruisje.

Let dus even op dat je de data uit de database in een array hebt staan.
 
Davey Mat

Davey Mat

08/08/2013 19:17:31
Quote Anchor link
Ik denk niet dat ik duidelijk ben geweest, of anders snap ik even niet wat je bedoelt;)

Het gaat hier om een "verlof aanvraag" systeempje.
Persoon vult begindatum en einddatum in.
Daarna wil ik een overzicht met personen in een kalender. Op de datums dat een persoon verlof heeft aangevraagd wil ik dat er in de kalender/tabel een kruisje o.i.d. komt te staan. Op deze manier:Afbeelding

Ik moet dus een kalender met de juiste datums hebben horizontaal en verticaal namen van de personen.

Ik denk dat ik moet beginnen met zo'n kalender, maar ik weet even niet hoe ik dit moet aanpakken.

-----edit
De horizontale rij met datums moeten dus vast staan, evenals de personen. Enkel de verlof aanvraag datums moeten matchen met de datums in de horizontale rij en moeten dan een kruisje weergeven in de tabel/kalender.
Gewijzigd op 08/08/2013 19:19:09 door Davey Mat
 
Frank Nietbelangrijk

Frank Nietbelangrijk

08/08/2013 20:54:47
Quote Anchor link
opzetje:

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
<?php

setlocale(LC_ALL, 'nld_nld');

$dayOfWeek = strftime('%w');

$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
    $daysBack += 7;

$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');

$dagen = array('ma','di','wo','do','vr','za','zo');
$namen = array('henk','jan','ilse');
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>

<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th>&nbsp;</th>';
for($i = 0 ; $i < 7 ; $i++)
{

    echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
    $date = $date->add(new DateInterval('P1D'));
}

foreach($namen as $naam)
{

    echo '</tr><tr><td>'.$naam.'</td>';
    for($i = 0 ; $i < 7 ; $i++)
    {

        echo '<td>?</td>';
    }
}

echo '</tr></table>';


?>

</body>
</html>
 
Davey Mat

Davey Mat

09/08/2013 01:53:27
Quote Anchor link
Heel erg bedankt Frank!
Heb de namen en begin van verlofdatums toegevoegd:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
define('INCLUDE_CHECK',true);

require 'inc/connect.php';

setlocale(LC_ALL, 'nld_nld');

$dayOfWeek = strftime('%w');

$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
    $daysBack += 7;

$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');

//haal array voornaam + achternaam uit db
$result=mysql_query("SELECT voornaam, achternaam FROM members ORDER BY voornaam ASC");
$namen = array();
while ($row = mysql_fetch_assoc($result)) {
$namen[] = $row['voornaam'] . " " . $row['achternaam'];
}

$dagen = array('ma','di','wo','do','vr','za','zo');

//haal datum1 en datum2 uit db
$result2=mysql_query("SELECT naam, datum1, datum2 FROM verlofaanvragen");
//via while data krijgen?

//array datums

function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {

    $dates = array();
    $current = strtotime($first);
    $last = strtotime($last);

    while( $current <= $last ) {

        $dates[] = date($format, $current);
        $current = strtotime($step, $current);
    }


    return $dates;
}

//toon periode in array (enkel ter verduidelijking tijdens testen)
print_r(dateRange($datum1, $datum2));
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>

<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th>&nbsp;</th>';
for($i = 0 ; $i < 7 ; $i++)
{

    echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
    $date = $date->add(new DateInterval('P1D'));
}

foreach($namen as $naam)
{

    echo '</tr><tr><td>'.$naam.'</td>';
    for($i = 0 ; $i < 7 ; $i++)
    {

        echo '<td>';
        //if datumtabel == datum uit array { echo 'X'; }else{ echo '-'; }
        echo'</td>';
    }
}

echo '</tr></table>';


?>

</body>
</html>


Alleen zoals je kunt zien op regel 28 en regel 73 weet ik even niet hoe ik verder moet. Zal eens lekker naar bed gaan want het is al laat en morgen weer verder kijken.
Gewijzigd op 09/08/2013 01:55:38 door Davey Mat
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/08/2013 09:12:06
Quote Anchor link
Allemaal veel te omslachtig, dit kan gewoon in één keer in SQL, enige voorwaarde is dat je een tabel hebt met minimaal 7 records:
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
SELECT
    m.member_id,
    m.first_name,
    d.check_date,
    IF(f.member_id IS NULL, 0, 1) dayoff
FROM
    (SELECT
        @startdate + INTERVAL (@pos := @pos + 1) DAY check_date
    FROM
        willekeurige_tabel,
        (SELECT @pos := -1,
        @startdate := '2013-08-05') a
    LIMIT 7) d
CROSS JOIN members m
LEFT JOIN
    daysoff f
    ON m.member_id = f.member_id
        AND d.check_date BETWEEN f.start_date AND f.end_date
ORDER BY m.first_name, m.member_id, d.check_date

Het enige wat je in PHP nog hoeft te doen is het begin van de week bepalen, en natuurlijk het resultaat van de query uitlezen.
Gewijzigd op 09/08/2013 09:23:25 door Ger van Steenderen
 
Davey Mat

Davey Mat

09/08/2013 14:35:25
Quote Anchor link
Bedankt Ger, maar de oplossing van Frank "snap" ik beter. Ik zal even niet weten hoe je met jouw query die tabel maakt. Ben namelijk geen topper in php/sql haha.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/08/2013 15:45:40
Quote Anchor link
datum, en datum2 is dat van en tot?
 
Davey Mat

Davey Mat

09/08/2013 15:47:42
Quote Anchor link
Ja Frank, datum1 is begindatum en datum2 is einddatum. Dus van datum1 tot en met datum2. Met die functie die ik erin heb gezet krijg ik een array met alle data vanaf datum1 tot en met datum2.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/08/2013 15:54:57
Quote Anchor link
Waar Ger wel gelijk in heeft is natuurlijk het feit dat je uit de database alleen die gegevens haalt die je nodig hebt en ook direct in de juiste volgorde zodat je inderdaad met een hele simpele while lus de teruggegeven rijen kunt verwerken

Toevoeging op 09/08/2013 15:58:17:

dus jouw query van regel 27 uitbreiden met de WHERE

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT naam, datum1, datum2 FROM verlofaanvragen WHERE datum1>=$firstday && datum2<=$lastday


Toevoeging op 09/08/2013 16:00:04:

en indien nodig natuurlijk nog uitbreiden met ORDER BY datum1

Toevoeging op 09/08/2013 16:02:18:

als je phpmyadmin hebt of een vergelijkbare tool dan kun je daarin mooi je queries testen. (zonder php variabelen dan natuurlijk)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/08/2013 19:11:37
Quote Anchor link
@Frank, jij vergeet 1 ding en dat is dat het datum1 en datum2 ranges zijn, dus als iemand 2 1/2 week verlof heeft wordt deze niet mee geselecteerd.
Dan moet je alles nog eens naar arrays gaan omzetten om met elkaar te vergelijken, want Davey wil van alle members laten zien of ze er of wel of niet zijn.

Maar zien is geloven:
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
+ -------------- + --------------- + --------------- + ----------- +
| member_id      | first_name      | check_date      | dayoff      |
+ -------------- + --------------- + --------------- + ----------- +
| 1              | Davey           | 2013-08-05      | 1           |
| 1              | Davey           | 2013-08-06      | 1           |
| 1              | Davey           | 2013-08-07      | 1           |
| 1              | Davey           | 2013-08-08      | 1           |
| 1              | Davey           | 2013-08-09      | 1           |
| 1              | Davey           | 2013-08-10      | 1           |
| 1              | Davey           | 2013-08-11      | 1           |
| 3              | Frank           | 2013-08-05      | 1           |
| 3              | Frank           | 2013-08-06      | 0           |
| 3              | Frank           | 2013-08-07      | 1           |
| 3              | Frank           | 2013-08-08      | 0           |
| 3              | Frank           | 2013-08-09      | 0           |
| 3              | Frank           | 2013-08-10      | 0           |
| 3              | Frank           | 2013-08-11      | 0           |
| 2              | Ger             | 2013-08-05      | 0           |
| 2              | Ger             | 2013-08-06      | 0           |
| 2              | Ger             | 2013-08-07      | 0           |
| 2              | Ger             | 2013-08-08      | 0           |
| 2              | Ger             | 2013-08-09      | 1           |
| 2              | Ger             | 2013-08-10      | 0           |
| 2              | Ger             | 2013-08-11      | 0           |
+ -------------- + --------------- + --------------- + ----------- +

Ik zal even wat toelichting geven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
        @startdate + INTERVAL (@pos := @pos + 1) DAY check_date
    FROM
        willekeurige_tabel,
        (SELECT @pos := -1,
        @startdate := '2013-08-05') a
    LIMIT 7

Deze query resulteert in 7 rijen met de datum van 2013-08-05 t/m 2013-08-11
@startdate en @pos zijn in SQL user variabelen, met de subquery in de FROM geef je ze een (begin)waarde
Als je een aantal rijen wilt hebben moet je iets hebben om te uit selecteren, dus heb je een tabel nodig die minimaal dat aantal rijen bevat. Welke tabel dat is macht kein flaus aus.

Met CROSS JOIN (MySQL only) op de members plak je aan elke datum alle members.
En dan met met de LEFT JOIN kijken of een member op die datum wel of geen off day heeft.

@Davey
En natuurlijk geen relaties op naam tussen twee tabellen!!!
Gewijzigd op 10/08/2013 08:50:00 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/08/2013 22:25:41
Quote Anchor link
Hoi Ger,

ik ga dit morgen eens proberen uit te pluizen. Inderdaad voldoet mijn query niet nee. die opperator := waar staat dat voor?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/08/2013 08:48:42
Quote Anchor link
:= is een assignment operator, = is in principe een comparison operator alleen in combinatie met SET wordt het een assignment operator.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

10/08/2013 11:26:46
Quote Anchor link
Ger dit werkt erg mooi inderdaad. Mag ik je vragen hoe het komt dat jij zoveel sql kennis hebt (maw: hoe en waar kan ik mijn kennis vergroten?)

voor de mensen die het willen proberen:
je hebt dus een dummy tabel nodig met zeven records.
Met deze twee query kun je hem aanmaken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
CREATE TABLE IF NOT EXISTS `willekeurige_tabel` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
INSERT INTO `willekeurige_tabel` (`id`) VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7);


daarnaast heb je een tabel members nodig en een tabel daysoff.

members moet hebben: member_id en first_name.
daysoff moet hebben: member_id, start_date en end_date.
Gewijzigd op 10/08/2013 11:33:45 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/08/2013 12:14:01
Quote Anchor link
Frank, iedereen heeft denk ik een tabel in zijn database staan die op zijn minst 7 records bevat.
Je hoeft daar geen aparte (nutteloze) tabel voor te maken.

De meeste kennis heb ik via internet opgedaan, met heel veel dank aan Google ;-)
 
Davey Mat

Davey Mat

11/08/2013 13:03:44
Quote Anchor link
Bedankt voor de uitleg, alleen ik snap op het moment twee dingetjes nog niet:
-d.check_date, waarom komt deze vandaag/waar staat deze voor?
-waarom een willekeurige tabel met 7 waardes? Dus ik kan gewoon tabel members pakken daarvoor?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/08/2013 13:25:40
Quote Anchor link
Je kan inderdaad daarvoor de tabel members nemen.
Ik heb 7 rijen nodig om 7 datums te kunnen generen, bij elke gevonden rij wordt @pos met 1 verhoogd en als aantal dagen aan @startdate toegevoegd.
Je mag ipv @startdate ook gewoon letterlijk de startdatum invoegen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date

Dit staat in een subquery met als alias d
Gewijzigd op 11/08/2013 13:28:09 door Ger van Steenderen
 
Davey Mat

Davey Mat

12/08/2013 15:23:34
Quote Anchor link
Dank voor de uitleg! Hierdoor ben ik verder gekomen en snap ik de query.
Echter, ik wil nu de hele maand tonen ipv enkel 1 week. Begin datum pas ik aan op 2013-08-01 en LIMIT op 31.
Dit werkt. Alleen omdat ik $row['check_date'] pak krijg ik data als 2013-08-05 en ma 5 ziet er een stuk beter uit. Ik heb geprobeerd de code van Frank te gebruiken hiervoor maar ben hier niet in geslaagd.

Daarnaast probeer ik op functie te filteren. Dus in de query wil ik WHERE functie = 'algemeen'. Maar omdat ik nooit echt met JOINS werk weet ik even niet waar ik die (en hoe) moet plaatsen.

Mijn code:
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
56
57
58
59
60
61
62
63
64
<?php
define('INCLUDE_CHECK',true);

require 'inc/connect.php';

$query1="
SELECT
    m.id,
    m.voornaam,
    m.achternaam,
    d.check_date,
    IF(f.memberid IS NULL, '-', 'X') dayoff
FROM
    (SELECT
        @startdate + INTERVAL (@pos := @pos + 1) DAY check_date
    FROM
        members,
        (SELECT @pos := -1,
        @startdate := '2013-08-01') a
    LIMIT 31) d
CROSS JOIN members m
LEFT JOIN
    verlofaanvragen f
    ON m.id = f.memberid
    AND d.check_date BETWEEN f.datum1 AND f.datum2
ORDER BY m.voornaam, m.id, d.check_date"
;

$sqltitel = mysql_query($query1) or die(mysql_error());  
$member = 0; //dit is de pointer om bij te houden met welk lid we werken
$tr = '<tr>';
$tbody = ''; //voor de rijen van de tabel    
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<h1><img src="/img/titel/Info.png" />Kalender</h1><hr>';
echo '<p>Kalender weergave van geaccepteerde verlofaanvragen</p>';
echo '<table border="1" cellpadding="5"><tr><th colspan="32">Augustus</th>';
while ($row = mysql_fetch_assoc($sqltitel)) {
    //controleer of het een ander lid is
    if ($row['id'] !== $member) {        
        $tbody .= $tr . '<td>' . $row['voornaam'] . ' ' . $row['achternaam'] . '</td>';
        $member = $row['id'];
        $tr = '</tr><tr>';
        $thead = '<tr><td>&nbsp;</td>'; //de head voor de titels
    }
    $thead .= '<td>' . $row['check_date'] . '</td>';
    $tbody .= '<td>' . $row['dayoff'] . '</td>';
}

echo $thead . '</tr>';
echo $tbody . '</tr>';    
echo '</table>';
?>

</body>
</html>
Gewijzigd op 12/08/2013 15:30:07 door Davey Mat
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/08/2013 16:01:24
Quote Anchor link
Joins zijn onderdeel van de FROM, dus een WHERE komt altijd na de JOINS en voor een eventuele GROUP BY en/of ORDER BY en/of LIMIT
 
Davey Mat

Davey Mat

12/08/2013 16:10:31
Quote Anchor link
Oke bedankt voor de uitleg Ger!
 
Davey Mat

Davey Mat

13/08/2013 17:33:19
Quote Anchor link
Ik krijg nog steeds niet voor elkaar om ipv 2013-08-01 'do 1' te krijgen. Dus dag + datum. Hier voorbeeld van wat ik nu krijg:Afbeelding
Kan iemand mij nog helpen hiermee?
 

Pagina: 1 2 volgende »



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.