Data weergeven in een bestaalde tabel
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 />";
}
}
}
?>
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 />";
}
}
}
?>
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
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)
1
2
3
4
2
3
4
while ($row = mysqli_fetch_assoc($resultmar)){
$totalmar []= $row["medicinename"]. " " . $row["quantity"] . "<br />";
}
$totalmar []= $row["medicinename"]. " " . $row["quantity"] . "<br />";
}
Tweede blok
Gewijzigd op 29/06/2017 21:32:30 door Mohamed nvt
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
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 -
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)
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
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 } ?>
//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
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 -
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.
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)
1
2
3
4
5
6
7
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');
}
/* 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
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 :)
Als je de commentaar een beetje volgt kun je het vast wel documenteren :)
Jouw commentaar snap ik wel hoor, maar de code zelf niet helemaal..
Code (php)
1
2
2
1. //maak een array van medicijndata op key $month bestaande uit medicine => quantity
$medicineDateMonths[$month][$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)
1
2
3
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>';
$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?
Nu ga je dus voor de tweede loopen. waarom eigenlijk en waarom is het nodig?
Code (php)
1
2
3
4
5
6
7
8
9
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>';
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..
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..
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
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:
Word de maandnaam, en als je dagnamen gebruik oid dan is het in het Nederlands
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
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
Jouw commentaar snap ik wel hoor, maar de code zelf niet helemaal..
Code (php)
1
2
2
1. //maak een array van medicijndata op key $month bestaande uit medicine => quantity
$medicineDateMonths[$month][$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)
1
2
3
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>';
$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:
Word de maandnaam, en als je dagnamen gebruik oid dan is het in het Nederlands
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)
1
2
3
4
5
6
7
8
9
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>';
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:
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
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 :-)