[PHP] Punkte werden falsch berechnet - komme nicht weiter *solved*

Hotwave

Multitalent
ID: 132230
L
24 April 2006
3.210
301
PHP:
$handle_txt = fopen('points.txt', 'r');
$content_txt = fgets($handle_txt, 4096);
$content = explode("|", $content_txt);
$actual_points = $cpunkte-$content[0];
$highest_points = explode(",", $content[2]);
$lowest_points = explode(",", $content[3]);
$today = date("d.m.y");
$day = date("d");
fclose($handle_txt);
/* 
Schema der Textdatei:
Punktestand des Vortages|Punkte gestern|höchste Punktzahl,Datum|niedrigste Punktzahl,Datum|Tag
$content[0]              $content[1]    $content[2]             $content[3]                $content[4]
*/
function write($data) {
    $handle = fopen('points.txt', 'w');
    fwrite($handle, $data);
    fclose($handle);
}

if($day > $content[4] || $day < $content[4] && $content[4] == 1) {  
if($actual_points < $lowest_points) {
    $to_write = "$cpunkte|$actual_points|$content[2]|$actual_points,$today|$day";
    write($to_write);
}
elseif($actual_points > $highest_points) {
    $to_write = "$cpunkte|$actual_points|$actual_points,$today|$content[3]|$day";
    write($to_write);
}
else {
    $to_write = "$cpunkte|$actual_points|$content[2]|$content[3]|$day";
    write($to_write);
}
}
Zeile 20 ist dafür zuständig, dass in die Textdatei nur bei einem Wechsel das Tages geschrieben wird, manuell herbeiführbar durch ändern des Tages in der Textdatei.
Ich sitze nun schon eine halbe Ewigkeit daran den Fehler zu finden. Ich weiß nicht was schief läuft, aber funktionieren tut es überhaupt nicht wie es soll.
Gegeben wird $cpunkte (wird vorher von einer Webseite ausgelesen), der Rest berechnet sich aus dem Inhalt der Textdatei (siehe Aufbau der Textdatei).
Ausgegeben wird das ganze dann so:
PHP:
echo "Punkte heute: $actual_points<br>";
echo "Punkte gestern: $content[1]<br>";
echo "Höchste Punktzahl ($highest_points[0]) am $highest_points[1]<br>";
echo "Niedrigste Punktzahl ($lowest_points[0]) am $lowest_points[1]<br>";
Ich hoffe ihr könnt meinen Code nachvollziehen :( bin noch nicht so sehr PHP-bewandt.
Über Verbesserungsvorschläge bin ich natürlich auch sehr dankbar!
 
Zuletzt bearbeitet:
Ich verstehe gar nicht so ganz, was du als Ergebnis haben willst bzw. wo etwas berechnet wird.. Aber ein Tipp der in solchen Fällen meistens wirkt: Schau dir doch einfach mal den Inhalt der Variablen an, bevor du etwas mit ihnen tust also einfach mal dirverse print_r() benutzen, um einfach mal zu sehen, mit was dann gerechnet wird.
 
Ich weiß jetzt zwar nicht, was du genau willst (fehlerbeschreibung fehlt?), aber etwas ist mir aufgefallen:

$day = date("d");
d ==> Tag des Monats, 2-stellig mit führender Null ==>01 bis 31

$day < $content[4] && $content[4] == 1

D.h. Wenn $content[4] nicht 1 ist, schlägt die bedingung fehl!
Wenn $content[4] eins ist, ist auf der rechten seite wahr. Die && verknüpfung fordert, dass der linke teil auch war sein muss, damit die bedingung wahr ist. $day < 1 ==> kann nie auftreten, da $day von 01 - 31 geht und somit nie kleiner 1 sein kann!
Daraus folgt, dass die oben genannte bedingung immer fehl schlägt und somit überflüssig ist?!?! (oder hab ich was übersehen?)
 
Ich weiß jetzt zwar nicht, was du genau willst (fehlerbeschreibung fehlt?), aber etwas ist mir aufgefallen:

$day = date("d");
d ==> Tag des Monats, 2-stellig mit führender Null ==>01 bis 31

$day < $content[4] && $content[4] == 1

D.h. Wenn $content[4] nicht 1 ist, schlägt die bedingung fehl!
Wenn $content[4] eins ist, ist auf der rechten seite wahr. Die && verknüpfung fordert, dass der linke teil auch war sein muss, damit die bedingung wahr ist. $day < 1 ==> kann nie auftreten, da $day von 01 - 31 geht und somit nie kleiner 1 sein kann!
Daraus folgt, dass die oben genannte bedingung immer fehl schlägt und somit überflüssig ist?!?! (oder hab ich was übersehen?)
|| <<< das hast du übersehen (ODER)

der Inhalt der Variablen ist korrekt. Irgendwo habe ich aber offenbar einen logischen Fehler eingebaut oder einen Fehler in der Zuordnung, oder...Jedenfalls wird der höchste Punktestand einfach nicht berechnet (Fehler mit den IF-Anweisungen?...), der Rest scheint soweit jedenfalls in Ordnung zu sein, die Fehler die auftraten sind wohl auf den anfangs fehlenden Inhalt der Textdatei zurückzuführen.
 
Soweit ich das überblicke stimmen die if() nicht
PHP:
if($actual_points < $lowest_points)
explode liefert einen array meines wissens zurück das heist du müsstest so checken
PHP:
if($actual_points[0] < $lowest_points[0])
[1] == Datum
[0] == Punkte

Anmerkung: ich halte für den ersten fopen der point.txt die funktion file-get-contents()
besser und wenn du unbedingt einen array als return brauchst dann kannst du auch file() benutzen
 
Oh man, VIELEN DANK! So offensichtlich und doch hab' ich's immer wieder übersehen :doh:Bei $actual_points kommt kein explode zum Einsatz, aber bei $highest und $lowest_points...beim ausgeben unten habe ich das aber richtig gemacht, omg...
Bist mein persönlicher Held :mrgreen:
 
https://www.php.net/manual/de/language.operators.php#language.operators.precedence
Laut Liste hat der && Operator eine höhere Priorität als der || Operator und wird somit zuerst ausgeführt.

Auch wenn du die Klammersetzung für || machst, ist der Teil "$day < $content[4]" überflüssig(bzw. Fehler in Bedingung?). Grund: derselbe wie oben schon beschrieben. $day kann nie kleiner 1 sein.
- es gibt keinen Tag, der kleiner 1 ist
- da die && bedingung ja fordert, dass $content[4] den wert 1 hat
 
Achso, das wusste ich nicht @Moloc.
Hab' grad gemerkt, if($day > $content[4] || $day < $content[4]) reicht ja auch.
 
Zuletzt bearbeitet:
Wenn ich was bemerken darf, dann reicht auch entweder gar kein if weil es immer true ist oder einer der folgenden if statements
PHP:
if(isset($content) && !empty($content[4]))
oder
PHP:
if(TRUE)

aber ich würde das !empty nehmen.
 
Nein, es ist nur true, wenn sich der Tag geändert hat. Wenn der aktuelle Tag der gleiche ist wie in der Textdatei wird ja nichts geändert.