yanmai
Goto Top

Rechenoperarionen in PHP

Hallo ihr Administratoren,
ich möchte den Durchschnitt einer Bewertung errechen. Dazu brauche ich die Anzahl der Datensätze ($AnzahlDaten) und die Anzahl der Sterne, die pro Datensatz abgegeben wurden ($AnzahlSterne). Um den Durchschnitt zu berechnen, muss ich ja die gesamten Sterne durch die Anzahl der Datensätze dividieren. Meine Umsetzung in PHP:

if($result1) {
						$AnzahlDaten = 0;
						while($row = $result->fetch_assoc()) {
							$AnzahlDaten = $AnzahlDaten + 1;
							$anz = (int)$row["AnzahlSterne"];  
							$AnzahlStarts = $AnzahlStars + $anz;
							$Durchschnitt = $AnzahlStars / $AnzahlDaten;
						}
					}

Wenn ich mir jetzt die Variable $Durchschnitt ausgeben lasse, bekomme ich gar nichts angezeigt. Weder 0 noch irgendwas anderes, einfach gar nichts. Obwohl ich 8 Sterne bei 2 Datensätzen habe. Wo liegt hier der Fehler?

Content-Key: 328605

Url: https://administrator.de/contentid/328605

Printed on: April 19, 2024 at 08:04 o'clock

Member: maretz
maretz Feb 06, 2017 at 16:56:30 (UTC)
Goto Top
Ich vermute mal weil dein $Durchschnitt nur in der Schleife existiert - möchtest du da woanders ne Ausgabe machen dann gibt es diese Variable halt nicht...

Und performancemässig möchtest du dir das sicher auch nochmal überlegen, oder?
Member: Yanmai
Yanmai Feb 06, 2017 at 17:00:42 (UTC)
Goto Top
Ich habe $Durchschnitt jz unter die Schleife gemacht. Aber es funktioniert immer noch nicht. Wie kann man das von der Performance noch optimieren?
Member: em-pie
em-pie Feb 06, 2017 at 18:25:17 (UTC)
Goto Top
Moin,

wäre es ggf. denkbar, dass dein RESULT die Variablen nicht füllt?
Oder kann es sogar sein, dass deine Schleife erst gar nicht "anspringt"?

Was passiert denn, wenn du innhalb der Schleife die Ergebnis mal mit echo $AnzahlStars und echo $AnzahlDaten ausgibst?
Das wäre zunmindest mal ein simples Debugging.


Gruß
em-pie
Mitglied: 132272
132272 Feb 06, 2017 updated at 19:11:40 (UTC)
Goto Top
Fehler liegt hier:
$AnzahlDaten = $AnzahlDaten + 1;
Die Summe aller Datensätze sollte vor der Schleife ermittelt werden und nicht darin face-smile
Machst du ganz einfach: http://php.net/manual/de/mysqli-result.num-rows.php

btw, warum keine einfache SQL-Query um das direkt fertig abzufackeln??:
SELECT AVG(AnzahlSterne) AS Durchschnitt FROM Bewertungen; 
Gruß
Member: Arano
Arano Feb 06, 2017 updated at 20:31:44 (UTC)
Goto Top
Guten Abend.

Zitat von @132272:

Fehler liegt hier:
$AnzahlDaten = $AnzahlDaten + 1;
Blödsinn, ein Fehler ist das absolut nicht !
Es mag andere, für DIESEN Zwecke, bessere Methoden geben aber ein Fehlr ist das nicht.
Die Summe aller Datensätze sollte vor der Schleife ermittelt werden und nicht darin face-smile
Nun... wenn die Summe / eine Summe aber abhändig von einer Eigenschaft der Datensätze ist... kann das doch auch in der Schleife geschehen.
Das würde ich hier auch verwenden. Aber naja, viele Wege führen nach Rom, einige schneller, andere langsamer ;)
btw, warum keine einfache SQL-Query um das direkt fertig abzufackeln??:
> SELECT AVG(AnzahlSterne) AS Durchschnitt FROM Bewertungen; 
> 
Statt nach dem "Warum" zu fragen, mach ihm doch einen freundlichen Verbesserungsvorschlag.
Gruß

So..
1. ich sehe da in Zeile 6 $AnzahlStarts, das ist ein Fehler.
2. Den Durchschnitt erst nach der Schleife berechnen weil du sonst mit jedem weiterem Schleifendurchlauf deinen bereits errechneten Durchschnittswert weiter teilst, da kommt doch kein sinnvoller Wert mehr bei raus.
Das ist ein zeiter Fehler.


~Arano
Mitglied: 132272
132272 Feb 06, 2017 updated at 22:04:49 (UTC)
Goto Top
Blödsinn, ein Fehler ist das absolut nicht !
Mit Fehler meinte ich hier die Position und die Art der umständlichen Ermittlung nicht das syntaktische face-wink. Deswegen auch der Link zur Alternative. Wenn sich die Gesamtanzahl dauernd ändert ist klar das es hier zu falschen Ergebnissen des Durchschnitts kommt,"wenn" die Berechnung fälschlicherweise in der Schleife geschieht statt danach.

Statt nach dem "Warum" zu fragen, mach ihm doch einen freundlichen Verbesserungsvorschlag.
Genau der steht ja drunter face-smile, in Form einer SQL-Query die ihm das Berechnen des Durchschnitts schon in ser SQL-Query abnimmt. Die sollte er nun eigentlich selbst einsetzen können. Denke das er das schaffen sollte zumal er ja vorher auch irgendwo eine Query auf die DB gemacht hat.
Etwas Gehirnjogging schadet ja nicht, zumal das ja nur eine simple Division aus der Grundschule ist.
Ist wohl das berühmte Brett vorm Kopf.

Gruß