Kalle: Zähler $i++ $i--

Hallo zusammen,
ich bin zwar kein IT-Spezi, habe aber als Techniker schon so manch kleine Routine erfolgreich geschrieben. (Assembler, Fortran, Pascal, VB, usw.). Dieses PHP treibt mich zum Wahnsinn, hier läuft nichts "normal"... ;-).
Ich will nur eine kleinen Zähler bauen, den ich mit Auf und Ab Buttons zum Zählen bewege...
Auch mit $i = $i + 1  läuft er nicht.

Bitte um Unterstützung - Danke!

<form name="" action="tool.php" method="POST">
  <?php
   $Auf = $_POST["Auf"];
   if (isset($Auf)) {$i++;}

$Ab = $_POST["Ab"];
   if (isset($Ab)) {$i--;}

echo $i;
  ?>
   <input type="submit" name="Auf" value=" > ">
   <input type="submit" name="Ab" value=" < ">
</form>

  1. Servus,

    $Auf = $_POST["Auf"];
       if (isset($Auf)) {$i++;}

    Die Bedingung ist natürlich immer wahr. Du initalisierst ja explizit $Auf, dabei spielt es keine Rolle welchen Wert $_POST['Auf'] hat, ausser dass du eine Warning erhaeltst, wenn der Index 'Auf' nicht existiert. Selbiges gilt natuerlich fuer 'Ab'.

    Warum prüfst du nicht einfach direkt, ob $_POST[x] gesetzt ist?

    Gruss
    Patrick

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
    1. Hallo an Alle, die mir so schnell mit guten Informationen weitergeholfen haben.
      Ich habe Eure Hinweise aufgegriffen und damit ein funktionierendes Script gebaut!

      Vielen Dank
      und
      Euch ein schönes Wochenende,
      Kalle

      <form name="" action="tool.php" method="POST">
       <?php
        $Wert = $_POST["Wert"];
        $i = $Wert;
        if ($_POST["Auf"]) {$i++;}
        if ($_POST["Ab"]) {$i--;}

      echo $i;
       ?>
        <input type="hidden" name="Wert" size="10" maxlength="10" value="<?PHP echo $i; ?>">
         <input type="submit" name="Auf" value=" > ">
         <input type="submit" name="Ab" value=" < ">
      </form>

      1. echo $begrüßung;

        $Wert = $_POST["Wert"];
          $i = $Wert;
          if ($_POST["Auf"]) {$i++;}
          if ($_POST["Ab"]) {$i--;}

        echo $i;
        ?>
          <input type="hidden" name="Wert" size="10" maxlength="10" value="<?PHP echo $i; ?>">

        Du brauchst weder $i noch $Wert. Prinzipiell kannst du auf $_POST und $_GET-Werte direkt zugreifen. Es ist nicht notwendig, die Werte aus $_POST oder $_GET "abzuholen" (wie es oft von Anfängern formuliert wird). $_POST und $_GET verhalten sich (bis auf ihre superglobale Zugiffsfähigkeit) haargenau so wie ein PHP-Array, und ein einzelner Wert aus einem Array ist mit einer Variablen gleichwertig. Das heißt, auch Werte in $_POST und $_GET lassen sich im Script verändern.

        Wenn das die einzige Stelle im gesamten Script ist, an der du auf $_POST["Wert"] zugreifst, sehe ich auch keine Notwendigkeit, auf einen Schreibzugriff darauf zu verzichten. Du kannst also die beiden Zuweisungen $Wert = ... und $i = ... streichen und im weiteren Verlauf statt auf $i auf $_POST["Wert"] zugreifen.

        Wenn du den Originalwert jedoch noch an anderen Stellen brauchst, solltest du dir für den obigen Anwendungsfall _eine_ Kopie erstellen, also gleich $i = $_POST["Wert"]; notieren.

        echo "$verabschiedung $name";

        1. gudn tach!

          Wenn das die einzige Stelle im gesamten Script ist, an der du auf $_POST["Wert"] zugreifst, sehe ich auch keine Notwendigkeit, auf einen Schreibzugriff darauf zu verzichten. Du kannst also die beiden Zuweisungen $Wert = ... und $i = ... streichen und im weiteren Verlauf statt auf $i auf $_POST["Wert"] zugreifen.

          also z.b.
            $_POST['Wert']+=isset($_POST['Auf'])-isset($_POST['Ab']);

          Wenn du den Originalwert jedoch noch an anderen Stellen brauchst, solltest du dir für den obigen Anwendungsfall _eine_ Kopie erstellen, also gleich $i = $_POST["Wert"]; notieren.

          also z.b.
            $i = $_POST['Wert']+isset($_POST['Auf'])-isset($_POST['Ab']);

          prost
          seth

          1. echo $begrüßung;

            $_POST['Wert']+=isset($_POST['Auf'])-isset($_POST['Ab']);

            isset() liefert ein boolesches Ergebnis. Damit würde ich ohne Not und Typecast keine arithmetischen Berechnungen anstellen. Den Missbrauch von Funktionsergebnissen, auch wenn es technisch funktioniert, finde ich keine gute Idee. Das macht das Verstehen des Quelltextes nicht einfacher.

            Erst prüfen, ob $_POST["Wert"] überhaupt vorhanden ist, oder z.B. mit intval() vorbehandeln. Dann so manipulieren, dass man die Intention dahinter direkt erkennt.

            echo "$verabschiedung $name";

            1. gudn tach!

              $_POST['Wert']+=isset($_POST['Auf'])-isset($_POST['Ab']);

              isset() liefert ein boolesches Ergebnis. Damit würde ich ohne Not und Typecast keine arithmetischen Berechnungen anstellen.

              false-true==-1. da braucht man weder NOT noch einen expliziten typecast.

              Den Missbrauch von Funktionsergebnissen, auch wenn es technisch funktioniert, finde ich keine gute Idee. Das macht das Verstehen des Quelltextes nicht einfacher.

              imho eine frage der gewoehnung.

              Erst prüfen, ob $_POST["Wert"] überhaupt vorhanden ist, oder z.B. mit intval() vorbehandeln.

              ack.

              Dann so manipulieren, dass man die Intention dahinter direkt erkennt.

              das waere imho gegeben.

              prost
              seth

              1. Hi seth,

                $_POST['Wert']+=isset($_POST['Auf'])-isset($_POST['Ab']);

                isset() liefert ein boolesches Ergebnis. Damit würde ich ohne Not und Typecast keine arithmetischen Berechnungen anstellen.

                false-true==-1.

                sogar === -1. Aber dass das in o.a. Code so gewollt ist, ist für Dritte, die den Quelltext zum ersten Mal zu sehen bekommen, schwer zu lesen IMHO.

                da braucht man weder NOT noch einen expliziten typecast.

                ich glaube, dedlfix meinte eher die Not. Wie auch immer - die Intention des Skriptes ist es doch, bei Vorhandensein eines "Auf"-Parameters
                eine Addition durchzuführen und analog dazu eine Subtraktion bei Vorhandensein des Parameters "Ab". Diese Intention sollte auch so übersetzt werden:

                Wenn Paramter "Auf" vorhanden
                  addiere
                Wenn Paramter "Ab" vorhanden
                  subtrahiere

                dein Code fuehrt immer eine Addition aus, auch wenn keiner der beiden Parameter vorhanden ist, wenn auch mit 0. Man sieht also nicht auf den ersten Blick: falls keiner der Parameter vorhanden, wird keine Addition ausgeführt. Stattdessen sieht man: da wird immer etwas auf den Parameter "Wert" aufaddiert.

                Außerdem ist er schlechter erweiterbar: möglicherweise möchte man die Parameter "Auf" und "Ab" mal irgendwann dazu verwenden, die Werte zu übergeben, die auf den/vom Parameter "Wert" addiert/subtrahiert werden sollen. Dann musst du deinen Code doch verwerfen.

                Den Missbrauch von Funktionsergebnissen, auch wenn es technisch funktioniert, finde ich keine gute Idee. Das macht das Verstehen des Quelltextes nicht einfacher.

                ACK.

                imho eine frage der gewoehnung.

                auch ACK, trotz meiner generellen Ablehnung ;-)

                Gruß,
                Andreas.

                1. gudn tach!

                  $_POST['Wert']+=isset($_POST['Auf'])-isset($_POST['Ab']);

                  isset() liefert ein boolesches Ergebnis. Damit würde ich ohne Not und Typecast keine arithmetischen Berechnungen anstellen.

                  [...] da braucht man weder NOT noch einen expliziten typecast.

                  ich glaube, dedlfix meinte eher die Not.

                  ah, ok.

                  im uebrigen bleibe ich dabei, dass es eine gewohnungssache ist. man kann
                    $v = bool1 - bool2
                  genauso intepretieren, wie man es bei den explizit ausformulierten bedingungen machen wuerde (schliesslich ist das ergebnis ja auch das gleiche).
                  aber ich will auch nicht bestreiten, dass die kompakte schreibweise z.b. fuer anfaenger schwieriger verstaendlich ist.

                  Außerdem ist er schlechter erweiterbar: möglicherweise möchte man die Parameter "Auf" und "Ab" mal irgendwann dazu verwenden, die Werte zu übergeben, die auf den/vom Parameter "Wert" addiert/subtrahiert werden sollen. Dann musst du deinen Code doch verwerfen.

                  je nachdem, wie das ablaufen soll, nimmt man dann einfach die isset-aufrufe raus. ein voriges ueberpruefen der post-variablen sollte dann so oder so stattfinden.
                  aber erweiterbarkeits-spekulationen sollte wenn ueberhaupt ohnehin nur jemand von sich geben, der Kalles projekt kennt, also nicht wir. ;-)

                  prost
                  seth

  2. Moin!

    <form name="" action="tool.php" method="POST">
      <?php
       $Auf = $_POST["Auf"];
       if (isset($Auf)) {$i++;}

    $Ab = $_POST["Ab"];
       if (isset($Ab)) {$i--;}

    echo $i;
      ?>
       <input type="submit" name="Auf" value=" > ">
       <input type="submit" name="Ab" value=" < ">
    </form>

    Wo wird $i denn überhaupt initialisiert?

    Viele Grüße vom Længlich

  3. hi,

    ich bin zwar kein IT-Spezi, habe aber als Techniker schon so manch kleine Routine erfolgreich geschrieben. (Assembler, Fortran, Pascal, VB, usw.). Dieses PHP treibt mich zum Wahnsinn, hier läuft nichts "normal"... ;-).

    Zum Glück können "Techniker" Rechner nicht zum Wahnsinn treiben, weil die sowas gar nicht kennen.

    Ich will nur eine kleinen Zähler bauen, den ich mit Auf und Ab Buttons zum Zählen bewege...
    Auch mit $i = $i + 1  läuft er nicht.

    In deinem Code befindet sich nirgendwo eine Initialisierung von $i - wie willst du dann bitte davon etwas abziehen oder draufaddieren?

    Stelle bitte dein error_reporting auf E_ALL - dann hat PHP eine Chance dir mitzuteilen, wo dein Vorgehen fehlerhaft ist.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Hi Kalle,

    Dieses PHP treibt mich zum Wahnsinn, hier läuft nichts "normal"... ;-).

    naja, manches ist ein wenig eigenartig. Dein größter Denkfehler steckt aber wohl nicht in irgendwelchen PHP-Eigenheiten, sondern im Verständnis des Ablaufs.

    Zunächst: Wo kommt deine Variable $i her, die du auf- oder abwärts zählen lässt? Die wird doch wahrscheinlich im Script selbst initialisiert. Also hat $i jedesmal, wenn das Formular aufgerufen wird, denselben Wert. Von diesem Wert aus zählst du also einen Tick aufwärts oder abwärts. Beim nächsten Aufruf des Formulars beginnt das Spiel von neuem, weil der Wert von $i ja nirgends gespeichert wird.

    Bitte um Unterstützung - Danke!

    Du musst dafür sorgen, dass der aktuelle Wert von $i von einem Scriptaufruf zum nächsten erhalten bleibt. Das kann serverseitig mit einer Session sein; einfacher ist IMHO aber, den aktuellen Wert in einem hidden-Field im Formular mitzuschleifen.
    Dann wird der neue von $i nämlich beim Abschicken des Formulars mitgeschickt, und dein Script kann diesen Wert nach dem Incrementieren oder Decrementieren in der Antwort, die zum Browser geht, wieder als aktuellen Wert in das hidden input einsetzen.

    $Auf = $_POST["Auf"];
       if (isset($Auf)) {$i++;}

    Hierzu hat Patrick schon einen wichtigen Hinweis gegeben.

    So long,
     Martin

    --
    Kleine Geschenke erhalten die Freundschaft.
    Große verderben sie aber meist auch nicht.