woodfighter: Durchschnittsberechnung aus Datenbankeinträgen läuft schief

Beitrag lesen

Tach,

So habe ich für die erste Woche 25 Wochenstunden, für die zweite Woche 19 Wochenstunden eingetragen, was ja eigentlich eine durchschnittliche Wochenstundenanzahl von 22 ergeben müsste... die Datenbank spuckt mir aber 12.5 Stunden aus...?

das ergibt sich aus deinem Code nicht; ich würde vermuten, das die Datensätze in deiner Datenbank anders aussehen, als du glaubst.

<?php
$con = mysqli_connect(...);
$res = mysqli_query($con, "SELECT woche, gesamtstundenanzahl FROM Stundendaten ORDER BY woche DESC LIMIT 1");
		while ($dsatz = mysqli_fetch_assoc($res)) {
			if ($dsatz["woche"] === NULL) {
			$dsatz["woche"] = 1;
			}
			if ($dsatz["gesamtstundenanzahl"] === NULL) {
			$dsatz["gesamtstundenanzahl"] = 0;
			}
			$neue_gesamtstundenanzahl = $dsatz["gesamtstundenanzahl"] + $_POST["wochenstundenanzahl"];
			$aktuelle_Woche = $dsatz["woche"];
			$neuer_durchschnitt = $neue_gesamtstundenanzahl / $aktuelle_Woche;
		}
mysqli_query($con, "INSERT INTO Stundendaten (wochenstundenanzahl, gesamtstundenanzahl, durchschnitt) VALUES ('".$_POST['wochenstundenanzahl']."', '$neue_gesamtstundenanzahl', '$neuer_durchschnitt') ");
  1. Der Durchschnitt hat in der Datenbank nichts zu suchen, den kann die Datenbank beim Abfragen berechnen.
  2. Die Gesamtstundenzahl hat in der Datenbank nichts zu suchen, den kann die Datenbank beim Abfragen berechnen.
  3. Du vergisst die kontextgerechte Behandlung der Werte, die du aus dem Request übernimmst; ich sehe hier zwar keinen direkten Exploit, aber das heißt nicht, dass es keinen gibt und selbst wenn es keinen gibt, sollte man sich angewöhnen es immer zu tun, dann kann man sich bei der Einschätzung, ob es einen gibt nie irren.
  4. Du verläßt dich darauf dass deine IDs fortlaufend lückenlos sind, das ist keine gute Idee auf längere Sicht; IDs sind ausschließlich dazu da einen Datensatz zu identifizieren. Wenn du zählen willst wie viele Wochen eingetragen sind, kann das die Datenbank für dich erledigen.
  5. Die Fehlerbehandlung beim Eintragen fehlt, aber ich vermute mal, die hast du wegreduziert. In der geposteten Version würde der Insert ausgeführt werden, obwohl der vorherige Select fehlgeschlagen ist.
  6. Warum ist da eine Schleife, wenn du doch weißt, dass es nur maximal ein Ergebnis geben kann?
  7. Du trägst deine Zahlenwerte als Strings in die Datenbank ein.

1. 2. und 4. in einer Abfrage zusammen sollte so aussehen:

SELECT COUNT(id) AS wochenanzahl, SUM(wochenstundenanzahl) AS wochenstundenanzahl_gesamt, AVG(wochenstundenanzahl) AS durchschnitt_wochenstundenanzahl FROM Stundendaten;

mfg
Woodfighter