Data weergeven in een bestaalde tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mobile Developer in Oost-Nederland (Android en/of

Bedrijfsomschrijving Een unieke kans voor Mobile Developers in Oost-Nederland. Deze prachtige organisatie is namelijk opzoek naar een Mobile Developer. Mobile Development en Ops Engineering gaan hand in hand bij deze organisatie dat een hoog verantwoordelijkheidsgevoel draagt. Als organisatie ontwikkelt zij dan ook veelal mobiele applicaties ter inspiratie en ondersteuning van belangrijke sectoren in Nederland. Met het technische team van gepassioneerde developers en engineers voeren ze dagelijks veelal diverse, inspirerende en complexe werkzaamheden uit. Door gebruik van innovatieve software en de nieuwste platformen binnen de sector is deze klant dan ook zeker als vooruitstrevend te betitelen waar zijn enorm veel waarde

Bekijk vacature »

Mohamed nvt

Mohamed nvt

28/06/2017 09:04:40
Quote Anchor link
Hallo allemaal,

Hieronder zal ik toelichten wat ik bedoel met het onderwerp.

Momenteel heb ik een index.php pagina en een medicinereports.php pagina.
Vanuit index.php heb ik een link gemaakt naar medicinereports.php d.m.v een ID. Op de medicinereports controleer ik het ID en daarna voer ik een query uit. Vervolgens wordt de data opgehaald. Tot zover gaat het prima, maar de data wil ik weergeven in een bestaande tabel en enkel een record wordt weergeven in een bestaande tabel.

De volgende code gebruik ik hiervoor:

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

if (ISSET($_GET['id']) && (filter_var($_GET['id'], FILTER_VALIDATE_INT))) {
                
                require_once(MYSQL);
                //define query
                $querymar = "SELECT sum(quantity) AS quantity, medicinename from medicines where MONTH(medicineregistration) = 3 AND YEAR(medicineregistration) = YEAR(NOW()) AND userid= '{$_SESSION['user_id']}' GROUP BY medicinename";
                $resultmar = mysqli_query($dbc,$querymar);
                if(mysqli_num_rows($resultmar) > 0){
                    //output data of each row
                    while ($row = mysqli_fetch_assoc($resultmar)){
                        $totalmar = $row["medicinename"]. " " . $row["quantity"] . "<br />";
                                        
                    }    
                }
            }

    
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<td><?php echo $totalmar; ?></td>
 
PHP hulp

PHP hulp

19/01/2021 09:22:36
 
Ivo P

Ivo P

28/06/2017 10:06:47
Quote Anchor link
je vult nu in de lus steeds opnieuw $totalmar met info uit $row. Zo te zien doe je daar verder niets mee en in de volgende ronde overschrijf je $totalmar.

aan het einde zit de waarde van het laatste record in $totalmar.

ofwel: echo op regel 13
ofwel maak van $totalmar een array ($totalmar[] = $row..... )
en dan maak je van het onderste blok opniuew een foreach lus
 
Mohamed nvt

Mohamed nvt

29/06/2017 21:29:24
Quote Anchor link
Hallo Ivo P,

Ik heb je advies opgevolgd en de code veranderd naar:
Resultaat: http://hawarco.co/img/quantity3.PNG
Zoals je op de foto ziet, is het de precies de data die ik nodig heb.
Alleen ontbreekt het een beetje aan de design en daarom dacht ik om een tabel op te nemen in de foreach loop of kan ik het op een ander manier doen?

En eigenlijk wat ik graag wil bereiken is dat alle data van elk maand laten zien op deze manier, ongeacht op welke link wordt geklikt onder de totale van een maand op de index.php pagina. Moet ik nog 11 keer de huidige code schrijven of is het een betere manier het te managen?


Eerst blok
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
while ($row = mysqli_fetch_assoc($resultmar)){
                        $totalmar []= $row["medicinename"]. " " . $row["quantity"] . "<br />";
                                        
                    }

Tweede blok
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php foreach ($totalmar as $marchdata) { echo $marchdata. " " . "<br />"; } ?>
Gewijzigd op 29/06/2017 21:32:30 door Mohamed nvt
 
Dennis WhoCares

Dennis WhoCares

29/06/2017 23:03:51
Quote Anchor link
year,month in SELECT en in GROUP BY plaatsen zou voldoende moeten zijn, (moet je wel even uit het WHERE stukje weg laten.
Als je alleen van 1 jaar wilt hebben, kan je year wel in de WHERE laten staan
Dan is het een kwestie van een mooie loop maken, dat de jaar en maand bijhoud, om vervolgens naar nieuwe <TD> te verspringen.

let wel op de volgorde van de GROUP BY velden, anders kan je verkeerde resultaten krijgen :)
Gewijzigd op 29/06/2017 23:05:08 door Dennis WhoCares
 
Mohamed nvt

Mohamed nvt

30/06/2017 18:11:24
Quote Anchor link
** quoteknip**

Hallo Dennis,

Het probleem is dat ik de data van elk maand in een bijbehorende TD wil laten zien en dus niet alles moet in een TD.
Snap je het nu?
Daarnaast loop ik nu tegen een ander probleem is dat ik voor elk link controleer of het ID een getal is en daarna voer ik een query uit voor bijbehorende maand.
Betekent dit dat ik voor elke maand het ID moet controleren of het een getal is. Dus 12 if statements om te controleren of het ID een getal is en daarna 12 query om bijbehorende data op te halen?

Kan ik dit niet op een ander manier doen, zoiets van: een if statement voor alle ID te controleren of het een getal is en daarna 12 queries uit te voeren voor elk maand.

Kan dit eenvoudiger/logischer?

- Ariën -:
Quote verwijderd. Het is niet nodig het eerste-laatste bericht te quoten.
Gewijzigd op 30/06/2017 18:29:48 door - Ariën -
 
Dennis WhoCares

Dennis WhoCares

30/06/2017 21:26:37
Quote Anchor link
Hi Mohammed,

met group by month word je data dus per maand gegroepeerd. Hoewel ik niet zeker weet of as month, in group by gebruikt kan worden, anders zou je kunnen overwegen deze apart op te slaan in de tabel ook. (ik had niet alles helemaal doorgelezen.. excuses)

Je zou eventueel een array kunnen maken, met de data voor elke maand door gebruik te maken van 1 query.
Vervolgens door je data heen wandelen, en de array aanvullen met de gegevens.
En daarna bouw je je gehele tabel op.

Even snel uit m'n hoofd (!ik heb dit niet getest!)
Wellicht zullen er een aantal zijn hier die het zullen verbeteren, daar ben ik zelf ook wel ietwat benieuwd naar (-;
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
<?php
//Array voor data initialiseren, deze zal gevuld worden met alle medicijnen per maand
$medicineDateMonths = [];

//Query om alle data per maand ophalen
$medicineQ = 'SELECT sum(quantity) AS quantity, medicinename, MONTH(medicineregistration) as month
FROM medicines
WHERE  YEAR(medicineregistration) = YEAR(NOW()) AND userid= '
. intval($_SESSION['user_id']) . '
GROUP BY month, medicinename'
;
//Haal data van de query op, kan ook allemaal in 1 uiteraard
$medinceR = mysqli_query($dbc,$medicineQ);

//Kijk of er wel resultaten zijn uit de query
if(mysqli_num_rows($medicineR) > 0) {
//Voor alle resultaten in MedicineR als $medicines
while ($medicines = mysqli_fetch_assoc($medicineR)){
    $month = $medicines['month'];
    $medicine = $medicines['medicinename'];
    $quantity = $medicines['quantity'];

    //maak een array van medicijndata op key $month bestaande uit medicine => quantity
    $medicineDateMonths[$month][$medicine] = $quantity;
}

?>



<!-- Snel tabel opmaken etc -->
<table>
    <thead>
        <tr>
<?php
for($m=1;$m<13;$m++) {
    //12 maandnamen noemen voor bovenkant tabel, door gebruik te maken van locale settings, kun je de taal ook aanpassen.
    $dateObj   = DateTime::createFromFormat('!m', $m);
    echo '<th>' . $dateObj->format('F') . '</th>';
}

?>

        </tr>
    </thead>
    <tbody>
        <tr>

<?php
//Nogmaals 12 keer loopen voor elke maand
for($m=1;$m<13;$m++) {
    echo '<td>';

    //Controlleren of de maandnummer bestaat in de array medicineDateMonths
    if(array_key_exists($m,$medicineDateMonths)) {
        //Voor elk medicijn voor maandnummer $m zetten we het in de tabel in de juiste td :)
        foreach($medicineDateMonths[$m] as $medicine => $quantity) {
            echo '<p>' . $medicine . ' : ' . $quantity . '</p>';
        }
    }
else {
        //Geen data gevonden voor maandnummer $m
        echo 'No data';
    }

    echo '</td>';
}

?>

        </tr>
    </tbody>
</table>
<?php } else { ?>
<b>Geen resultaten gevonden</b>
<?php } ?>

Nogmaals dit is wat ik zo ff uit m'n hoofd schrijf, niet in een editor gedaan, maar het idee lijkt me duidelijk? Ik heb geprobeerd een beetje commentaar toe te voegen
Gewijzigd op 02/07/2017 17:15:11 door Dennis WhoCares
 
Mohamed nvt

Mohamed nvt

01/07/2017 22:03:48
Quote Anchor link
** knip **
Hallo Dennis,

Met mijn vorig bericht heb ik het ook niet zo bedoeld :-)
Ik heb je aanbevelingen getest en ze bijna perfect!
Volgens mij heb je een deel van het code in OOP stijl geschreven en ik zou het fijn vinden als je dat kan omzetten naar procedure. Voor mij als beginnende PHP-er ben ik nog niet zo ver dat ik met bezig wil houden met OOP.
Wil je daarnaast je code wat toelichten/concept/achterliggende gedachtegang zodat ik het beter kan begrijpen en in toekomst zelf kan aanpassen indien nodig? Alvast bedankt.
Kan ik de medicijnen alfabetisch weergeven? Moet ik dat in de SQL query aanpassen?

Momenteel is het zo dat ik vanaf index.php naar medicinereports.php ga en bovenstaande code wordt uitgevoerd.En, wanneer ik direct ga naar medicinereports.php, want dat is uiteindelijk de bedoeling dat ik krijg 25 mails van de foutafhandeling met de volgende info:

/hawarco/medicinesreports.php' on line 65: array_key_exists() expects parameter 2 to be array, null given
Date/Time: 7-1-2017 22:44:43

/hawarco/medicinesreports.php' on line 65: Undefined variable: medicineDateMonths

Hoe en waar moet ik aangeven dat bovenstaande code gedraaid moet worden enkel als het aangeroepen wordt vanuit index.php?
Alvast bedankt voor het meedenken!

- Ariën -:
Quote verwijderd. Het is niet nodig het eerste-laatste bericht te quoten. Gelieve hier even op te letten, anders wordt het topic onoverzichtelijk.
Gewijzigd op 01/07/2017 22:19:54 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

01/07/2017 22:24:26
Quote Anchor link
Ik zie enkel alleen de OO-versie van de DateTime-classe. Daar is niks mis mee.
Verder is de opbouw nog steeds procedureel te noemen, gezien ik geen algehele class zie met methods en visibilities.

Verder lijkt $medicineDateMonths leeg te zijn. Kijk eens met var_dump() en print_r() wat er in zit.
 
Dennis WhoCares

Dennis WhoCares

02/07/2017 17:17:04
Quote Anchor link
Hi Mohammed,
ik weet eerlijk gezegt niet hoeveel commentaar er nog nodig is ;-)
Ik zag stiekem even dat de MedicineR geen array terug geeft, ik heb het een beetje aangepast, dit zou beter moeten zijn
Er was ook geen controle of er wel data terug kwam ;-)
Ik gebruik al heel lang een pdo wrapper die geeft me een array met data terug of een foutmelding, mijn excuses

Toevoeging op 02/07/2017 17:23:46:

Je zou de link in index.php nog een get waarde kunnen geven, ik zou dan denken aan medicinesreports.php?year=2017

Vervolgens in de medicnesreports gelijk aan het begin kijken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
if(isset($_GET['year']) && ctype_digit($_GET['year'])) {
/* de code hier
In de query YEAR(NOW()) vervangen door: ' . intval($_GET['year']) . '
*/
} else {
header('location: index.php');
}

Dan kun je index.php linkjes geven per jaar :)
Als er geen jaar is meegeven of het is geen getal dan word je gelijk terug naar index.php gestuurd
 
Mohamed nvt

Mohamed nvt

03/07/2017 21:55:12
Quote Anchor link
Hoi Dennis,
Haha eigenlijk is er meer nodig dan enkel de commentaar.
Ik wil eigenlijk een lijst maken om de code helemaal uit te leggen volgens mijn eigen interpretatie maken om je code goed te begrijpen.
Ik heb de aangepaste code getest en het werkt helemaal precies zoals ik het wil. Dus nogmaals erg bedankt voor de moeite!
Er waren wat syntax errors, zoals MedicineR, maar die heb ik gelukkig zelf kunnen oplossen. ;-)
Op medicinereports wil ik eigenlijk geen redirect functie plaatsen als men direct op dit pagina komt, want dat is niet de bedoeling :)
 
Dennis WhoCares

Dennis WhoCares

04/07/2017 08:31:11
Quote Anchor link
Ja typo's blijven we houden he, ik heb het niet in IDE gedaan vandaar
Als je de commentaar een beetje volgt kun je het vast wel documenteren :)
 
Mohamed nvt

Mohamed nvt

06/07/2017 10:35:05
Quote Anchor link
En daarom vind ik het knap dat het conceptueel werkte.
Jouw commentaar snap ik wel hoor, maar de code zelf niet helemaal..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
1. //maak een array van medicijndata op key $month bestaande uit medicine => quantity
   $medicineDateMonths[$month][$medicine] = $quantity;

Waarom maak je hier een array aan en deze constructie zegt me eigenlijk helemaal niets...Ik snap wat een array is en het doet, maar bovenstaande code snap ik niet helemaal...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
//12 maandnamen noemen voor bovenkant tabel, door gebruik te maken van locale settings, kun je de taal ook aanpassen.
                $dateObj   = DateTime::createFromFormat('!m', $m);
                echo '<th>' . $dateObj->format('F') . '</th>';

Dit is OOP en hier heb ik geen kaas van gegeten. Is het zo dat de maandnamen uit de DB gehaald worden. Bedoel je hiermee met gebruik te maken van locale settings?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
//Nogmaals 12 keer loopen voor elke maand
            for($m=1;$m<13;$m++) {
                echo '<td>';

Nu ga je dus voor de tweede loopen. waarom eigenlijk en waarom is het nodig?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
//Voor elk medicijn voor maandnummer $m zetten we het in de tabel in de juiste td :)
                    foreach($medicineDateMonths[$m] as $medicine => $quantity) {
                        echo '<p>' . $medicine . ' : ' . $quantity . '</p>';
                    }
                } else {
                    //Geen data gevonden voor maandnummer $m
                    echo 'No data';
                }
                echo '</td>';

Best raar dat je het resultaat tot nu toe niet heb gezien, maar ook nooit gevraagd ;-):
http://hawarco.co/includes/applicatie6.PNG
Zoals je ziet is het duidelijk, maar ik zou graag elk medicijn met bijbehorend quantity in een eigen regel zetten ipv dat alle data nu in een TD zet. Ik heb reeds gekeken naar een td binnen een td, maar dat zag er niet uit. Ik heb gekeken naar een tabel binnen een td, maar dat wordt niet aangeraden helaas..
 
Dennis WhoCares

Dennis WhoCares

07/07/2017 12:54:16
Quote Anchor link
Mohamed nvt op 06/07/2017 10:35:05:
En daarom vind ik het knap dat het conceptueel werkte.
Jouw commentaar snap ik wel hoor, maar de code zelf niet helemaal..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
1. //maak een array van medicijndata op key $month bestaande uit medicine => quantity
   $medicineDateMonths[$month][$medicine] = $quantity;

Waarom maak je hier een array aan en deze constructie zegt me eigenlijk helemaal niets...Ik snap wat een array is en het doet, maar bovenstaande code snap ik niet helemaal...
Dit is een 2dimensionaal array, een array in array.
We maken een array, met als 'key' de maandnaam.
Hierin zit een array, met als 'key' de medicijnnaam en als 'value' de quantity


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
//12 maandnamen noemen voor bovenkant tabel, door gebruik te maken van locale settings, kun je de taal ook aanpassen.
                $dateObj   = DateTime::createFromFormat('!m', $m);
                echo '<th>' . $dateObj->format('F') . '</th>';

Dit is OOP en hier heb ik geen kaas van gegeten. Is het zo dat de maandnamen uit de DB gehaald worden. Bedoel je hiermee met gebruik te maken van locale settings?

DateTime is een standaard class in PHP, de $m komt uit de loop, en createFromFormat maakt een datum aan met het maandnummer $m.
format('F') laat de maandnaam zien.
Als je het volgende bovenaan je code zet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
setlocale(LC_ALL, 'nl_NL');

Word de maandnaam, en als je dagnamen gebruik oid dan is het in het Nederlands

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
//Nogmaals 12 keer loopen voor elke maand
            for($m=1;$m<13;$m++) {
                echo '<td>';

Nu ga je dus voor de tweede loopen. waarom eigenlijk en waarom is het nodig?
Daarnet hebben we data in een array gestopt om het nu makkelijker te kunnen verwerken.
Ook weer 12 keer, omdat de 'key' van de array maandnummers zijn.
Daarna pakken we alle medicijnen => quantity, uit deze maandnummer.
Je kan meerdere medicijnen in een maandnummer hebben, dus loopen we door deze array heen.
Zie opbouw van de array


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
//Voor elk medicijn voor maandnummer $m zetten we het in de tabel in de juiste td :)
                    foreach($medicineDateMonths[$m] as $medicine => $quantity) {
                        echo '<p>' . $medicine . ' : ' . $quantity . '</p>';
                    }
                } else {
                    //Geen data gevonden voor maandnummer $m
                    echo 'No data';
                }
                echo '</td>';

Best raar dat je het resultaat tot nu toe niet heb gezien, maar ook nooit gevraagd ;-):
http://hawarco.co/includes/applicatie6.PNG
Zoals je ziet is het duidelijk, maar ik zou graag elk medicijn met bijbehorend quantity in een eigen regel zetten ipv dat alle data nu in een TD zet. Ik heb reeds gekeken naar een td binnen een td, maar dat zag er niet uit. Ik heb gekeken naar een tabel binnen een td, maar dat wordt niet aangeraden helaas..
Eigenlijk wil je dus een X en Y as hebben:
X : Medicijn naam
Y : Maandnaam
en de velden het aantal ? Dat is wel net iets andersom.
Dan moet de 'key' medicijnnaam zijn, waarin de array zit: maandnummer => quantity


Ik heb hierboven in dikgedrukt even je vragen beantwoord, hopelijk duidelijk genoeg.

Als je na het invullen van de array eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
echo '<pre>';
print_r($medicineDateMonths);
echo '</pre>';

Doet, dan krijg je een beter idee hoe de data daarin staat en dan weet ik zeker dat je het verder begrijp :)
Gewijzigd op 07/07/2017 12:56:52 door Dennis WhoCares
 
Mohamed nvt

Mohamed nvt

09/07/2017 12:34:09
Quote Anchor link
Hoi Dennis,

Bedankt voor je uitleg.
Ik heb idd print_r uitgevoerd en het ziet eruit dat elk gevonden medicijn uit het resultaat een eigen array heeft/krijgt, toch?
Wat ik nu krijg als resultaat ben ik blij, maar ik wil elke medicijn met bijbehorende quantity in een eigen td zetten.

Dus als voorbeeld zal ik het hieronder proberen te tekenen
-------------
januari
-------------
medicijnnaam | quantity
------------------------
medicijnnaam | 10
------------------------
medicijnnaam 2 | 15
------------------------
etc | etc

Hopelijk is het nu duidelijk :-)
 



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.