Wo liegt der Fehler in der If - Anweisung?

Hallo,

ich bin dabei PHP zu lernen und bin im Moment bei den Verzweigungen, also den If – Anweisungen. Am meisten lerne ich wenn ich mir selber Aufgaben stelle und an einer verzweifel ich gerade.

Folgendes hatte ich mir vorgenommen:

Ich gebe über die Formularfunktion 3 Zahlen ein. PHP soll 3 Zufallszahlen erzeugen und diese Zufallszahlen mit den eingegeben Zahlen vergleichen. Dann soll ein Text ausgegeben werden ob die Zahl richtig getippt wurde oder verkehrt. Zum Schluß soll angezeigt werden wieviel Zahlen insgesamt richtig getippt wurden.

Das Problem ist, dass immer ausgegeben wird, dass die Zahlen richtig getippt wurden obwohl sie nicht richtig getippt sind.

Hier ist der PHP Code:

    <form method="post" action="index.php">
    <input  type="text" name="getipptezahl1" class="zahlen"/>
    <input  type="text" name="getipptezahl2" class="zahlen"/>
    <input  type="text" name="getipptezahl3" class="zahlen"/><br />
    <input  type="submit" />
</form>

<p>
    <?php
    $getipptezahl1 = filter_input(INPUT_POST, 'getipptezahl1', FILTER_SANITIZE_NUMBER_INT);
    $getipptezahl2 = filter_input(INPUT_POST, 'getipptezahl2', FILTER_SANITIZE_NUMBER_INT);
    $getipptezahl3 = filter_input(INPUT_POST, 'getipptezahl3', FILTER_SANITIZE_NUMBER_INT);

    echo "Die getippten Zahlen sind:<br />
    <b>$getipptezahl1</b> <b>$getipptezahl2</b> <b>$getipptezahl3</b><br />";

    $zufallszahl1 = rand(1, 10);
    $zufallszahl2 = rand(1, 10);
    $zufallszahl3 = rand(1, 10);


    echo "Die Zufallszahlen sind:<br />
        <b>$zufallszahl1</b> <b>$zufallszahl2</b> <b>$zufallszahl3</b><br />";

    $ergebnis = 0;

    if($getipptezahl1 == $zufallszahl1 || $zufallszahl2 || $zufallszahl3) {
        $ergebnis++;
        echo "Die erste Zahl ist richtig<br />";
    } else {
        echo "Die erste Zahl ist falsch<br />";
    }

    if($getipptezahl2 == $zufallszahl1 || $zufallszahl2 || $zufallszahl3) {
        $ergebnis++;
        echo "Die zweite Zahl ist richtig<br />";
    } else {
        echo "Die zweite Zahl ist falsch<br />";
    }

    if($getipptezahl3 == $zufallszahl1 || $zufallszahl2 || $zufallszahl3) {
        $ergebnis++;
        echo "Die dritte Zahl ist richtig<br />";
    } else {
        echo "Die dritte Zahl ist falsch<br />";
    }

    echo "Es sind <b>$ergebnis</b> Zahlen richtig";
 ?>
</p>

Vielleicht ist jemand so nett und erklärt mir meinen Fehler.

Danke für’s Lesen

musst du in
if($getipptezahl1 == $zufallszahl1 || $getipptezahl1 == $zufallszahl2 || $getipptezahl1 == $zufallszahl3)
ändern. Die anderen analog.
Ich habe keine Lust, jetzt so viel zu schreiben, aber so wie du das zuerst geschrieben hast, ist der Ausdruck immer wahr, sofern eine der Zufallszahlen mit einem Wert belegt ist. Typischer Anfängerfehler. :wink:

2 Like

Hallo!

@Christa hat dir die korrekte Antwort gegeben, das Verhalten deines Codes hat sie nicht ganz korrekt erklärt.

Grundsätzlich gibt es eine Reihenfolge, in der Operatoren ausgeführt werden, sozusagen fortgeschrittenes Punkt-vor-Strich für Informatiker. Hier eine Liste für C, sie ist aber so ziemlich auf alle anderen Sprachen übertragbar. Die Priorität des Gleichheitsoperators == ist deutlich höher als die des logischen Oders ||.

Das heißt, dein Code

if( a == b || c || d )

ist gleichbedeutend mit

if( ( a == b) || c || d )

oder eigentlich

if( ( a == b ) || ( c != 0 ) || ( d != 0 ) )

In Worten: Wenn a gleich b ODER c ungleich 0 ODER d ungleich 0

Wie bereits geschrieben, möchtest du eigentlich

if( ( a == b )  || ( a == c )  || ( a == d ) )

wobei du die inneren Klammern weg lassen kannst:

if( a == b  ||  a == c  ||  a == d )
2 Like

Ich breche ins Essen, schon wieder wird die Antwort nicht gespeichert!

Ich hatte es nicht ausprobiert, und auf die Idee, dass es auch bei =0 nicht geht, wäre ich zugegebenermaßen nicht gekommen. Ich habe jetzt nochmal direkt getestet.

und für Zahlen trifft das zwar zu, genauso trifft es aber auch für leere Zeichenketten zu, also c!="" z. B.

So, diesmal speichere ich die Antwort auch zwischen, für alle Fälle. Vielleicht kann ich sie ja erst morgen posten. :roll_eyes: Vielleicht erscheinen auch beide Beiträge, der Geier weiß das bestimmt!

Richtig. Aber gerade Anfängern sei empfohlen, eine logische Verknüpfung in Klammern zu setzen, wenn deren Ergebnis für eine weitere Verknüpfung benötigt wird.
Damit wird der Code leichter lesbar und es passieren weniger Fehler.
Im Automobilbereich programmiert man nach den MISRA-Regeln, die schreiben das aus genau diesem Grund sogar vor.

Gruß,

Kannitverstan

Hallo,

und vielen Dank an alle die geantwortet haben.

Ganz besonderen Dank an sweber. Du hast es sehr verständlich erklärt was da vor sich geht. Denn nur wenn man auch versteht was da passiert kann man selbstständig arbeiten.

Mein nächsten Projekt wird sein, dass keine Zufallszahl doppelt gezogen wird. Wenn ich das nicht kapiere ist das wohl die nächste Frage, die ich stellen werde. Aber ich probiere es erstmal selber.

Vielen dank nochmal