Übungsskript ignoriert eingegebene Variablen - wo liegt der Fehler?

Hallo Gemeinde,

ich bin blutiger Programmier- und PHP-Anfänger. Ich schreibe zur Zeit immer mal wieder Miniskripte um PHP besser zu verstehen. Jetzt habe ich ein Skript zum addieren bzw. subtrahieren von zwei Zahlen gebastelt, aber es will einfach nicht funktionieren.

Folgendes sind die Fehlfunktionen:

  • Radiobuttons verlieren Auswahl nach Submit.

  • Ergebnis wird nicht angezeigt.

  • Nach Eingabe von zwei Zahlen und erneuter Auswahl des Operators kommt die von mir gewollte Fehlermeldung die nur kommen dürfte, wenn KEINE Zahl eingegeben wurde oder die Zahl nicht größer als Null ist. Auch wenn noch keine Zahlen eingegeben wurden.

Eigentlich sollte das Ergebnis ausgerechnet werden, und der Hinweis
erst kommen, wenn Variablen „falsch“ (also nicht gesetzt und/oder negativ und/oder nicht numerisch) eingegeben wurden.

Dass ich mit [PHP]checked=„checked“[/PHP] bei den Radiobuttons etwas tun muss ist mir schon klargeworden - aber WO und WIE wird es eingebaut?

Ich vermute den Hauptfehler im Skript bei diesen Abschnitten:

Zeile 48
[PHP]if (isset($_POST[‚zahl_1‘]) && isset($_POST[‚zahl_2‘]) && is_numeric($_POST[‚zahl_1‘]) && is_numeric($_POST[‚zahl_2‘]) && ($_POST[‚zahl_1‘] > 0) && ($_POST[‚zahl_1‘] > 0))[/PHP]bzw. Zeile 74
[PHP]if (isset($_POST[‚zahl_a‘]) && isset($_POST[‚zahl_b‘]) && is_numeric($_POST[‚zahl_a‘]) && is_numeric($_POST[‚zahl_b‘]) && ($_POST[‚zahl_a‘] > 0) && ($_POST[‚zahl_b‘] > 0))[/PHP]
Hier das gesamt Skript:
[PHP]

Adieren und Subtrahieren

Bitte wählen Sie den Operator:



Auswahl

Operator


Addieren


Subtrahieren


<? /* Check ob Operator "add" gesetzt, dann erste Rechnentabelle */ if (isset($_POST['add'])) { ?>
Erste Zahl:
Zweite Zahl:
<? /* Check ob alle Variablen gesetzt, numerisch und positiv */ if (isset($_POST['zahl_1']) && isset($_POST['zahl_2']) && is_numeric($_POST['zahl_1']) && is_numeric($_POST['zahl_2']) && ($_POST['zahl_1'] > 0) && ($_POST['zahl_1'] > 0)) { /* Berechnung der Addition */ $zahl_1 = $_POST['zahl_1']; $zahl_2 = $_POST['zahl_2']; $ergebnis_1 = $zahl_1 + $zahl_2; echo "

Das Ergebnis ist " .$ergebnis_1. ".

"; } else { echo "

Die Variablen müssen numerisch und positiv sein!

"; } /* Check ob Operator "sub" gesetzt, dann zweite Rechnentabelle */ } elseif (isset($_POST['sub'])) { ?>
Erste Zahl:
Zweite Zahl:
<? /* Check ob Variablen gesetzt, positiv und numerisch */ if (isset($_POST['zahl_a']) && isset($_POST['zahl_b']) && is_numeric($_POST['zahl_a']) && is_numeric($_POST['zahl_b']) && ($_POST['zahl_a'] > 0) && ($_POST['zahl_b'] > 0)) { /* eigentliche Subtraktion: */ $zahl_a = $_POST['zahl_a']; $zahl_b = $_POST['zahl_b']; $ergebnis_2 = $zahl_a - $zahl_b; echo "

Das Ergebnis ist " .$ergebnis_2. ".

"; } else { echo "

Die Variablen müssen numerisch und positiv sein!

"; } } else { echo "

Bitte wählen Sie einen Operator!

"; } ?> [/PHP]Danke für jede Hilfe - ich bin nämlich von Seiten wie phpbox.de und dem Knowware Heft "PHP 5, leicht und verständlich" bei diesem o.g. Problem überfordert.

Gruß

bigvik :slight_smile:

Zum ersten Problem:
Du hast

<input type="radio" name="add">

im HTML-Code stehen. Den musst Du anpassen. Und zwar an 2 stellen:
a) value-Attribut ergänzen

<input type="radio" name="add"[COLOR="red"] value="1">

b) php-Code zur Prüfung der Variable ergänzen und wenn diese den Wert von value angenommen hat „checked“ setzen.

<input type="radio" name="add" value="1"[COLOR="red"]<?php if( $_POST["add"] == 1){ ?> checked<?php } ?>>

Das selbe selbstverständlich auch bei den anderen radio-Buttons einfügen. Bei input-Text musst Du hingegen nur den Wert aus $_POST[„variablenname“] ins value-Attribut eintragen.

Zum zweiten Problem:
Verzichte auf die Funktion is_numeric(). Der aus einem input-Feld übergebene Wert ist nicht numerisch, folglich kommt da auch nie das richtige raus. Schreib die Bedingung mal so:

if (isset($_POST['zahl_1']) && isset($_POST['zahl_2']) && [COLOR="red"](int)$_POST['zahl_1'] > 0 && [COLOR="red"](int)$_POST['zahl_1'] > 0)

Das was ich hier rot markiert habe wandelt den Wert der dahinterstehenden Variable in einen Integer-Wert um.

EDIT:
@ Threadi: Jetzt haben sich unsere Einträge überschnitten - ich arbeite Deinen Beitrag jetzt durch. Schonmal danke für die Antwort!
/EDIT

Ich habe die Input-Tags [Zeile 16 und 19] testweise so geändert:

[HTML][/HTML][HTML][/HTML]und den PHP Code [Zeile 29 und 58] so angepasst:

[PHP]if (isset($_POST[‚operator‘]) && ($_POST[‚operator‘] = 1))[/PHP][PHP]elseif (isset($_POST[‚operator‘]) && ($_POST[‚operator‘] = 2))[/PHP]aber auch das hat das Skript nicht zum Laufen gebracht.

Ich harre immernoch Eurer Hilfe! :slight_smile:

Dann lies meinen Beitrag nochmal aufmerksam durch.

Hallo threadi,

danke für Deine ausführliche Antwort! Unsere Beiträge hatten sich überschnitten, aber jetzt habe ich Deinen Beitrag durchgearbeitet.

Ich habe die Input-Tags wie von Dir beschrieben verändert:

[PHP]
<input type=„radio“ name=„add“ value=„1“<? if($_POST['add'] == 1){ ?> checked<? } ?>>
[/PHP][PHP]
<input type=„radio“ name=„sub“ value=„1“<? if($_POST['sub'] == 1){ ?> checked<? } ?>>
[/PHP]Es wird jetzt folgende Fehlermeldung produziert:

Notice: Undefined index: add in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 16

Notice: Undefined index: sub in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 19
Hast Du eine Idee wo der Fehler liegt? Dass $_POST[‚add‘] und $_POST[‚sub‘] wohl noch nicht definiert sind habe ich verstanden, aber wie sollte ich den PHP Code sonst einbauen?

Ich setze nochmal den PHP Code vom Operator-Wahl-Formular bis zur Prüfung des ersten Radio-Buttons ein:

[PHP]















Auswahl

Operator


Addieren


<input type=„radio“ name=„add“ value=„1“<? if($_POST['add'] == 1){ ?> checked<? } ?>>

Subtrahieren

<input type=„radio“ name=„sub“ value=„1“<? if($_POST['sub'] == 1){ ?> checked<? } ?>>



<? /* Check ob Operator "add" gesetzt, dann erste Rechnentabelle */ if (isset($_POST['add'])) { ?>[/PHP]kann es sein dass dieser Teil

[PHP]<? if($_POST['add'] == 1){ ?> checked<? } ?>[/PHP]am falschen Platz ist?

Ich danke Dir und allen potentiellen anderen Helfern für die Mühe!

Gruß

bigvik

Hintergrund der Meldung ist, dass „add“ nicht im Array von $_POST enthalten zu sein scheint. Diese Meldung kannst Du mit einer zusätzlichen Prüfung mit der Funktion isset() unterdrücken (hast Du ja bereits an anderer Stelle verwendet).

Frage dabei ist jedoch wieso die Meldung überhaupt kommt. Du hast ja das Formular mit dem Radio-Button per POST abgeschickt. Folglich müsste „add“ auch im Index des Arrays $_POST enthalten sein.

Dabei fällt mir noch auf, dass Du die radio-Buttons ungünstig benannt hast. Das soll doch eine entweder-oder-Entscheidung sein? So wie es jetzt aussieht, könntest Du beide Radio-Buttons gleichzeitig setzen. Du müsstest folglich den Variablennamen für beide (!) Radio-Buttons ändern - einheitlich, so das beide den selben Eintrag im name-Attribut haben. Dafür müssen sie sich beim value-Wert unterscheiden.

Die Fehlermeldung kommt beim Aufrufen des Skriptes im Browser, noch bevor ich das „Formular“ abschicken konnte.

Wenn das Formular dann „submitted“ wird, stehen in den Textfeldern folgende Fehlermeldungen:


Notice: Undefined index: zahl_1 in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 35


Notice: Undefined index: zahl_2 in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 39

Das habe ich jetzt angepasst.

Ich kopiere nochmal den gesamten Code hier hinein:

[PHP]

Adieren und Subtrahieren

Bitte wählen Sie den Operator:



Auswahl

Operator


Addieren


checked<? } ?>>

Subtrahieren

checked<? } ?>>

<? /* Check ob Operator gesetzt, dann erste Rechentabelle */ if (isset($_POST['operator']) && $_POST['operator'] == 1 ) { ?>
Erste Zahl:
Zweite Zahl:
<? /* Check ob alle Variablen gesetzt, numerisch und positiv */ if (isset($_POST['zahl_1']) && isset($_POST['zahl_2']) && (int)$_POST['zahl_1'] > 0 && (int)$_POST['zahl_2'] > 0) { /* Berechnung der Addition */ $zahl_1 = $_POST['zahl_1']; $zahl_2 = $_POST['zahl_2']; $ergebnis_1 = $zahl_1 + $zahl_2; echo "

Das Ergebnis ist " .$ergebnis_1. ".

"; } else { echo "

Die Variablen müssen numerisch und positiv sein!

"; } /* Check ob Operator gesetzt, dann zweite Rechentabelle */ } elseif (isset($_POST['operator']) && $_POST['operator'] == 2 ) { ?>
Erste Zahl:
Zweite Zahl:
<? /* Check ob Variablen gesetzt, positiv und numerisch */ if (isset($_POST['zahl_a']) && isset($_POST['zahl_b']) && (int)$_POST['zahl_1'] > 0 && (int)$_POST['zahl_2'] > 0) { /* eigentliche Subtraktion: */ $zahl_a = $_POST['zahl_a']; $zahl_b = $_POST['zahl_b']; $ergebnis_2 = $zahl_a - $zahl_b; echo "

Das Ergebnis ist " .$ergebnis_2. ".

"; } else { echo "

Die Variablen müssen numerisch und positiv sein!

"; } } else { echo "

Bitte wählen Sie einen Operator!

"; } ?> [/PHP]Ich bin natürlich weiterhin für jede Hilfe dankbar, kann aber evtl. heute nicht mehr ins Netz schauen.

Gruß

bigvik

Dann schreib

<? if(isset($_POST['operator']) && $_POST['operator'] == 1)

und bei dem zweiten if auch so.

Ich habe das jetzt so ergänzt wie Du vorgeschlagen hast.

Der Fehler bleibt leider:

Wenn ich den Radio „Addieren“ auswähle (bei „subtrahieren“ kommt ein ähnlicher Fehler mit entsprechend anderen Zeilen-Nummern) kommt die Eingabemaske für Zahl Eins und Zahl Zwei, aber IN DER MASKE (im Input-Feld) stehen folgende Fehlermeldungen:


Notice: Undefined index: zahl_1 in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 35

und


Notice: Undefined index: zahl_2 in C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php on line 39

Außerdem kommt die Fehlermeldung (die hier noch gar nicht abgerufen werden sollte):

Die Variablen müssen numerisch und positiv sein!

Wenn ich jetzt normale Zahlen eingebe und submitte, kommt die Fehlermeldung:

Bitte wählen Sie einen Operator

Wenn Du (oder auch jemand anders) nicht mehr Zeit und/oder Nerven für diesen Fall hast (es ist ja auch nicht wirklich wichtig - ich übe halt nur), dann ist das kein Problem. Ich werde ein vergleichbares mini-Rechenskript statt mit if, else, etc. einfach mal mit der switch Anweisung probieren. Ich will schließlich keine spezielle Anwendung schreiben sondern nur lernen.

Wie auch immer, ich danke Dir für Deine Zeit und Geduld und werde mich in Zukunft bei Problemen wieder hier melden!

Gruß

bigvik :slight_smile:

Versuche nachzuvollziehen, was die Ursache dieser Fehlernotiz ist.

Dein Script greift auf einen Index des $_POST-Arrays zu, der nicht gesetzt ist. Er ist entweder nicht gesetzt, weil das Formular aufgerufen wurde, ohne einen POST-Request abzusetzen (etwa beim initialen Laden der Seite) oder weil der entsprechende Index keine Entsprechung in einem gleichnamigen Formularelement hat, also beim Absenden der POST-Daten nicht gesetzt wurde.

Ich würde empfehlen, die Reihenfolge Eingabe-Verarbeitung-Ausgabe zu beachten und bei Scriptbeginn sicherzustellen, dass alle benötigten Variablen einen Wert – und sei es ein Standardwert – bekommen.

Zum Beispiel:

[php]if (!isset($_POST[‚zahl_1‘])) {
$_POST[‚zahl_1‘] = 0;
}[/php]

Danke für Deinen Tipp. Ich bin aber zur Zeit mit meinem eigenen Skript überfordert… :oops:

Jetzt habe ich mir ein paar Skript-Schnipsel in meinen Editor copy-pasted und probiere mich daran aus.

Wenn meine Skills etwas gewachsen sind (bin nicht nur PHP sondern auch allgemein Programmier Anfänger) schaue ich mir die Problematik nochmal an.

Gruß

bigvik