• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Übungsskript ignoriert eingegebene Variablen - wo liegt der Fehler?

bigvik

Neues Mitglied
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"
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))
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))
Hier das gesamt Skript:
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Adieren und Subtrahieren</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  </head>
  <body>
  <br><h2>Bitte w&auml;hlen Sie den Operator:</h2><br><br>
      <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
        <table>
          <tr>
            <th><p>Auswahl</p></th>
            <th><p>Operator</p></th>
          </tr>
            <td><p><br>Addieren</p></td>
            <td><br><input type="radio" name="add"></td>
          <tr>
            <td><p>Subtrahieren</p></td>
            <td><input type="radio" name="sub"></td>
          </tr>
          <tr>
            <td><input type="submit" value="Auswahl"></td><td></td>
          </tr>
        </table>
      </form>
        <br>
<?  
    /* Check ob Operator "add" gesetzt, dann erste Rechnentabelle */
    if (isset($_POST['add'])) {
        ?>
        <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
          <table>
            <tr>
              <td>Erste Zahl: </td>
              <td><input type="text" name="zahl_1"></td>
            </tr>
            <tr>
              <td>Zweite Zahl: </td>
              <td><input type="text" name="zahl_2"></td>
            </tr>
            <tr>
              <td><input type="submit" value="Addieren"></td><td></td>
            </tr>
          </table>
        </form>
          <?
          /* 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 "<br><p>Das Ergebnis ist " .$ergebnis_1. ".</p>";
} else {
    echo "<br><p>Die Variablen m&uuml;ssen numerisch und positiv sein!</p>";
      } 
      /* Check ob Operator "sub" gesetzt, dann zweite Rechnentabelle  */
 } elseif (isset($_POST['sub'])) {
      ?>
      <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
          <table>
            <tr>
              <td>Erste Zahl: </td>
              <td><input type="text" name="zahl_a"></td>
            </tr>
            <tr>
              <td>Zweite Zahl: </td>
              <td><input type="text" name="zahl_b"></td>
            </tr>
            <tr>
              <td><input type="submit" value="Subtrahieren"></td><td></td>
            </tr>
          </table>
        </form>
      <? 
          /* 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 "<br><p>Das Ergebnis ist " .$ergebnis_2. ".</p>";
          } else {
            echo "<br><p>Die Variablen m&uuml;ssen numerisch und positiv sein!</p>";
          }
        }  else {
      echo "<br><p>Bitte w&auml;hlen Sie einen Operator!</p>";
    }
?>      
  </body>
</html>
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 :-)
 
Zuletzt bearbeitet:
Zum ersten Problem:
Du hast

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

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

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

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

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

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:
Code:
if (isset($_POST['zahl_1']) && isset($_POST['zahl_2']) && [COLOR="red"](int)[/COLOR]$_POST['zahl_1'] > 0 && [COLOR="red"](int)[/COLOR]$_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:
<input type="radio" name="operator" value="1">
HTML:
<input type="radio" name="operator" value="2">
und den PHP Code [Zeile 29 und 58] so angepasst:

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

Ich harre immernoch Eurer Hilfe! :-)
 
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:
<input type="radio" name="sub" value="1"<? if($_POST['sub'] == 1){ ?> checked<? } ?>>
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:
<form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
        <table>
          <tr>
            <th><p>Auswahl</p></th>
            <th><p>Operator</p></th>
          </tr>
            <td><p><br>Addieren</p></td>
            <td><br><input type="radio" name="add" value="1"<? if($_POST['add'] == 1){ ?> checked<? } ?>></td>
          <tr>
            <td><p>Subtrahieren</p></td>
            <td><input type="radio" name="sub" value="1"<? if($_POST['sub'] == 1){ ?> checked<? } ?>></td>
          </tr>
          <tr>
            <td><input type="submit" value="Auswahl"></td><td></td>
          </tr>
        </table>
      </form>
        <br>
<?  
    /* Check ob Operator "add" gesetzt, dann erste Rechnentabelle */
    if (isset($_POST['add'])) {
        ?>
kann es sein dass dieser Teil

PHP:
<? if($_POST['add'] == 1){ ?> checked<? } ?>
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.
 
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.

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:

<br /> <b>Notice</b>: Undefined index: zahl_1 in <b>C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php</b> on line <b>35</b><br />
<br /> <b>Notice</b>: Undefined index: zahl_2 in <b>C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php</b> on line <b>39</b><br />
[...] 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.

Das habe ich jetzt angepasst.


Ich kopiere nochmal den gesamten Code hier hinein:

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Adieren und Subtrahieren</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  </head>
  <body>
  <br><h2>Bitte w&auml;hlen Sie den Operator:</h2><br><br>
      <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
        <table>
          <tr>
            <th><p>Auswahl</p></th>
            <th><p>Operator</p></th>
          </tr>
            <td><p><br>Addieren</p></td>
            <td><br><input type="radio" name="operator" value="1"<? if($_POST['operator'] == 1){ ?> checked<? } ?>></td>
          <tr>
            <td><p>Subtrahieren</p></td>
            <td><input type="radio" name="operator" value="2"<? if($_POST['operator'] == 2){ ?> checked<? } ?>></td>
          </tr>
          <tr>
            <td><input type="submit" value="Auswahl"></td><td></td>
          </tr>
        </table>
      </form>
        <br>
<?  
    /* Check ob Operator gesetzt, dann erste Rechentabelle */
    if (isset($_POST['operator']) && $_POST['operator'] == 1 ) {
        ?>
        <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
          <table>
            <tr>
              <td>Erste Zahl: </td>
              <td><input type="text" name="zahl_1" value="<? $_POST['zahl_1'] ?>"></td>
            </tr>
            <tr>
              <td>Zweite Zahl: </td>
              <td><input type="text" name="zahl_2" value="<? $_POST['zahl_2'] ?>"></td>
            </tr>
            <tr>
              <td><input type="submit" value="Addieren"></td><td></td>
            </tr>
          </table>
        </form>
          <?
          /* 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 "<br><p>Das Ergebnis ist " .$ergebnis_1. ".</p>";
} else {
    echo "<br><p>Die Variablen m&uuml;ssen numerisch und positiv sein!</p>";
      } 
      /* Check ob Operator gesetzt, dann zweite Rechentabelle */
 } elseif (isset($_POST['operator']) && $_POST['operator'] == 2 ) {
      ?>
      <form action="<? $_SERVER['PHP_SELF'] ?>" method="post">
          <table>
            <tr>
              <td>Erste Zahl: </td>
              <td><input type="text" name="zahl_a" value="<? $_POST['zahl_a'] ?>"></td>
            </tr>
            <tr>
              <td>Zweite Zahl: </td>
              <td><input type="text" name="zahl_b" value="<? $_POST['zahl_b'] ?>"></td>
            </tr>
            <tr>
              <td><input type="submit" value="Subtrahieren"></td><td></td>
            </tr>
          </table>
        </form>
      <? 
          /* 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 "<br><p>Das Ergebnis ist " .$ergebnis_2. ".</p>";
          } else {
            echo "<br><p>Die Variablen m&uuml;ssen numerisch und positiv sein!</p>";
          }
        }  else {
      echo "<br><p>Bitte w&auml;hlen Sie einen Operator!</p>";
    }
?>      
  </body>
</html>
Ich bin natürlich weiterhin für jede Hilfe dankbar, kann aber evtl. heute nicht mehr ins Netz schauen.

Gruß

bigvik
 
Dann schreib

Code:
<? 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:

<br /> <b>Notice</b>: Undefined index: zahl_1 in <b>C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php</b> on line <b>35</b><br />
und

<br /> <b>Notice</b>: Undefined index: zahl_2 in <b>C:\xampp\htdocs\php-kurs\rechenformular\plus_minus.php</b> on line <b>39</b><br />
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 :-)
 
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;
}
 

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
 

Neueste Beiträge

Zurück
Oben