Totaal van records aangeven met php/mysqli lukt niet

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • CIAagentB
  • Registratie: Juni 2014
  • Laatst online: 06-11-2024
Ik ben voor mijzelf een projectje begonnen. Het komt er kort op neer dat ik bezig ben met een formulier waar personen gegevens kunnen invullen over een hoeveelheid troepen, van tribalwars, en deze hoeveelheid wordt dan inclusief gebruikersnaam opgeslagen in een database. Het probleem is echter dat ik het totaal aantal troepen van alle gebruikers bij elkaar opgeteld wil zijn en dat gegeven dan outputten in een html tabel. Het is me nu wel gelukt om een totaal van troepen per gebruiker weer te geven, maar het lukt me niet om dat van alle gebruikers in totaal te doen.

Dit is de code die ik nu gebruik:
PHP: test.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
$mysqli = new mysqli($servername, $username, $password, $db);
 
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
 
$query = "SELECT * FROM Troepen";
 
if ($result = $mysqli->query($query)) {
 echo "<table border=1 width=70% bgcolor=white>";
 echo "<tr>";
 echo "<th> Speler</th>";
 echo "<th> Aanvallend</th>";
 echo "<th> Verdedigend</th>";
 echo "<th> Totaal</th>";
 echo "</tr>";
 
 while ($row = $result->fetch_assoc()) {
  $username = $row["username"];
  $aanvallend = $row["bijlvechter"] + $row["cavalerist"] + $row["boogschutter_te_paard"] + $row["ram"] + $row["katapult"];
  $verdedigend = $row["speervechter"] + $row["zwaardvechter"] + $row["boogschutter"] + $row["gepantserde_cavalerist"];
  $totaal = $aanvallend + $verdedigend;
 
  echo "<tr>";
  echo "<td> $username</td>";
  echo "<td> $aanvallend </td>";
  echo "<td> $verdedigend </td>";
  echo "<td> $totaal </td>";
  echo "</tr>";
  ob_flush();
  flush();
    }  
 echo "</table>";
    $result->free();
}
 
$mysqli->close();

[ Voor 47% gewijzigd door CIAagentB op 26-01-2016 22:15 ]

Alle reacties


Acties:
  • 0 Henk 'm!

Verwijderd

Wat is de structuur van je tabel en welke datatypes gebruik je?

Acties:
  • 0 Henk 'm!

  • CIAagentB
  • Registratie: Juni 2014
  • Laatst online: 06-11-2024
Ik heb verschillende kolommen: id, username (varchar), bijlvechter(int), speervechter(int), cavalerist(int), boogschutter_te_paard(int), ram(int), katapult(int), zwaardvechter(int), boogschutter(int), gepantserde_cavalerist(int). De lengte/waarden zijn ingesteld op 64.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
SQL:
1
2
3
4
5
SELECT 
    SUM(bijlvechter) + SUM(cavalerist) + SUM(boogschutter_te_paard) + SUM(ram) 
    + SUM(katapult) + SUM(speervechter) + SUM(zwaardvechter) + SUM(boogschutter)
    + SUM(gepantserde_cavalerist) AS totaal 
FROM Troepen 

[ Voor 3% gewijzigd door frickY op 26-01-2016 22:10 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Begin eens met je code te posten *in* het topic i.p.v. te linken naar pastebin (code tags). Als pastebin besluit je code offline te halen (of het "verloopt") dan is je topic in de toekomst voor mensen die er met een google-search ofzo op stuiten niets meer waard.

Daarna: schrijf eens een query die doet wat je wil; de query die je nu hebt (SELECT * FROM Troepen waarna je in code gaat tellen :X ) slaat nergens op en schaalt voor geen meter als je straks ettelijke duizenden gebruikers hebt. Kijk daarvoor eens naar de aggregate functies van MySQL (en lees dan meteen Hoe werkt dat GROUP BY nu eigenlijk? even).

Als je het dan toch in PHP code wil doen i.p.v. een query: wat let je om een tweede variabele (array desnoods) te maken en daar de lopende totalen in bij te houden :?

code:
1
2
3
4
5
foreach row
  usertotal_foo = x + y + z
  usertotal_bar = p + q + r
  grandtotal_foo += usertotal_foo
  grandtotal_bar += usertotal_bar
Lekker makkelijk; het is hier toch geen stackoverflow?
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
On a sidenote: vanwaar dat ge-(ob_)flush :? Heb je daar een goede reden voor?

[ Voor 52% gewijzigd door RobIII op 26-01-2016 22:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 11:49
CIAagentB schreef op dinsdag 26 januari 2016 @ 22:07:
Ik heb verschillende kolommen: id, username (varchar), bijlvechter(int), speervechter(int), cavalerist(int), boogschutter_te_paard(int), ram(int), katapult(int), zwaardvechter(int), boogschutter(int), gepantserde_cavalerist(int). De lengte/waarden zijn ingesteld op 64.
Aan het einde zou je nogmaals een query kunnen doen die een SUM van alle values per kolom doet, maar hoe je dat doet moet je zelf even zoeken. SUM in combinatie met MySQL is hier de keyword.

Je kan het ook in PHP doen als je wilt, je krijgt de data binnen uit je eerste query en in je loopje zou je dan best alles los kunnen optellen, wegzetten in een variabele en aan het einde weer printen. De eerste methode is netter (al is de manier waarop je het nu doet al niet echt best practice, maar dat wijd ik aan dat ik gok dat je nog niet heel bekend bent met PHP/MySQL).

Edit: RobIII heeft een beter antwoord, dus die raad ik aan. Ik laat de mijne echter staan, heb je meer mogelijke richtingen (maar ik raad heel sterk zijn tip aan)

[ Voor 7% gewijzigd door Merethil op 26-01-2016 22:12 ]


Acties:
  • 0 Henk 'm!

  • CIAagentB
  • Registratie: Juni 2014
  • Laatst online: 06-11-2024
Het gedeelte van de query en dan de sum nemen van alle kolommen snap ik wel. Maar hoe krijg ik daar dan een fatsoenlijke output uit die ik kan printen?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
CIAagentB schreef op dinsdag 26 januari 2016 @ 22:41:
Het gedeelte van de query en dan de sum nemen van alle kolommen snap ik wel. Maar hoe krijg ik daar dan een fatsoenlijke output uit die ik kan printen?
Snap je ook wat een select * doet? Want dat is je eerste struikelblok.

Ik zou zeggen :
1 : schrijf eerst eens je select * om naar een niet * variant die exact hetzelfde doet
2 : Bekijk deze herschrijving eens goed en je zal zien dat je velden meekrijgt waar je niets mee doet, dus deze kunnen eruit.
3 : Lees de door Rob III gelinkte Group by uitleg eens door en kijk eens naar het keywoordje sum voor het totaliseren.
4 : Voila, je resultaat zoals gevraagd.
5 : Waarschijnlijk zul je dit resultaat weer willen filteren dus kijk ook eens naar where / having.

Acties:
  • 0 Henk 'm!

  • CIAagentB
  • Registratie: Juni 2014
  • Laatst online: 06-11-2024
Ik snap het principe wel van de query want bij een select * worden alle kolommen geselecteerd. Ik snap ook dat ik met deze query niet het totaal kan krijgen, ik gebruikte die query om ook de username te krijgen. Alleen mijn php kennis is zeer beperkt, ik weet daarom ook niet hoe ik uit de query die als het goed is een totaal moet geven van alle velden bij elkaar (exclusief username) een output moet krijgen. De bedoeling is om er een enkel getal uit te krijgen wat ik eenvoudig kan echoën via de php echo functie. Kortom het principe achter de query zelf snap ik wel, dat heb ik ook gehad tijdens informatica de afgelopen weken. Het gedeelte om die informatie om te zetten in een variabele die ik kan echoën snap ik alleen niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CIAagentB schreef op dinsdag 26 januari 2016 @ 22:41:
Het gedeelte van de query en dan de sum nemen van alle kolommen snap ik wel. Maar hoe krijg ik daar dan een fatsoenlijke output uit die ik kan printen?
Wat dacht je van een paar extra echo-statements net vóór de echo "</table>"; (ofwel net na de while-lus) waarin je een extra <tr> en diens <td>'s echo'd met daarin de grandtotal_foo en grandtotal_bar variabelen :?

En mocht je niet de code-approach gebruiken maar de query-met-aggregates-approach dan voer je dus net na die while lus (ofwel op dezelfde plek als waar ik het in vorige alinea over had) de query uit en echo je daar de resultaten van.

Maar goed: laat eens zien wat je dan precies al zélf geprobeerd hebt en wat er dan niet werkt? Want we zitten hier niet om handjes te houden en verwachten wel ook enige eigen inzet / moeite ;)

[ Voor 34% gewijzigd door RobIII op 26-01-2016 23:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CIAagentB
  • Registratie: Juni 2014
  • Laatst online: 06-11-2024
RobIII schreef op dinsdag 26 januari 2016 @ 23:09:
[...]

Wat dacht je van een paar extra echo-statements net vóór de echo "</table>"; (ofwel net na de while-lus) waarin je een extra <tr> en diens <td>'s echo'd met daarin de grandtotal_foo en grandtotal_bar variabelen :?
Kun je het gedeelte code toelichten in je eerste reactie wat gaat over grandtotal_foor en grandtotal_bar, ik snap de bedoeling er niet helemaal van. Het maakt me ook niet uit hoe ik tot een resultaat komt, met PHP is het prima maar door een query te gebruiken is het ook goed.

[ Voor 3% gewijzigd door CIAagentB op 26-01-2016 23:44 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Stop nu eens en vergeet even dat je uberhaupt code hebt geschreven. Stel, je hebt ergens een lijstje met aantallen, hoe zou je zelf het totaal daarvan berekenen? Als je daarop antwoord kan geven, kan je dat ook in code oplossen..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1