Andreas: Formularauswertung

Hallo,
stehe total auf dem Schlauch und komme nicht weiter.
Folgendes Problem:
Datei index.php, über Tabelle aufgeteilt in oben, links und rechts.
In der Zelle "rechts" frage ich über if($action='') die Aktionen ab,
und lade dann die entsprechende Datei in den rechten Bereich: require_once("Datei.php);
Soweit klappt alles, nur bei der einen Aktion nicht.

Bei Aktion = Profil lade ich profil.php:
print "<FORM ACTION="index.php?action=profilsave" METHOD="POST" ENCTYPE="MULTIPART/FORM-DATA">\n";
...
print "<INPUT TYPE="SUBMIT" CLASS="ibut" name="action" VALUE="&Auml;ndern">\n";

in der index.php habe ich dann wieder die action-Abfrage stehen:
if($action=='profilsave'){
echo "test";
}

Doch genau dieser Schritt klappt nicht.
es wird nichts ausgegeben, der rechte Bereich bleibt leer.

Was mache ich falsch?

Gruß Andreas

  1. Hello Andreas,

    Bei Aktion = Profil lade ich profil.php:
    print "<FORM ACTION="index.php?action=profilsave" METHOD="POST" ENCTYPE="MULTIPART/FORM-DATA">\n";
    ...
    print "<INPUT TYPE="SUBMIT" CLASS="ibut" name="action" VALUE="&Auml;ndern">\n";

    in der index.php habe ich dann wieder die action-Abfrage stehen:
    if($action=='profilsave'){
    echo "test";
    }

    Doch genau dieser Schritt klappt nicht.
    es wird nichts ausgegeben, der rechte Bereich bleibt leer.

    Was mache ich falsch?

    Danke für dieses tolle Beispiel für den Nutzen von "regsister_globals = off"!

    Ich musste erst stutzen, was Du da wohl gebastelt hast, aber auf den zweiten Blick wurde es klar.

    1. Du hast entgegen jeder Empfehlung register_globals auf on
    2. Du arbeitest mit den Script-"Kurzvariablen"
    3. Du hast zwei Wege, auf denen deine Parameter in das Script gelangen,
       gleichzeitig benutzt: im <form>-tag die GET-Methode und im
       <input>-Tag die Post-Methode.
    4. Du hast einen Parameternamen doppelt vergeben. (siehe 3. )
       - <form action="... action=profilsave" ...>
       - <input name="action" value="...

    Abhilfe:
    1. Stell deinen Host auf register_globals = off
    2. Nutze im Script nur die $_GET, $_POST, $_COOKIE,... Vraiablen
    3. Vergib eindeutige Parameter- / Vraiablennamen.

    Viel Erfolg

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hallo Tom

      Danke für dieses tolle Beispiel für den Nutzen von "register_globals = off"!

      Bitte, habe ich gern getan ;-)
      doch ich habe nicht die Möglichkeit was einzustellen, PHP läuft außerdem im Safe-Mode.

      1. Du hast entgegen jeder Empfehlung register_globals auf on

      hab ich nicht, macht der von selbst

      1. Du arbeitest mit den Script-"Kurzvariablen"

      als Unwissender kenne ich keine Alternativen

      gleichzeitig benutzt: im <form>-tag die GET-Methode und im
         <input>-Tag die Post-Methode.

      verstehe ich nicht, habe doch im form-Tag method = post angegeben?

      1. Du hast einen Parameternamen doppelt vergeben. (siehe 3. )
           - <form action="... action=profilsave" ...>
           - <input name="action" value="...

      genau das war der Fehler, jetzt wird die action erkannt.

      Abhilfe:
      2. Nutze im Script nur die $_GET, $_POST, $_COOKIE,... Vraiablen
      3. Vergib eindeutige Parameter- / Vraiablennamen.

      werde ich zukünftig so machen.

      Gruß Andreas

      1. Hallo,

        doch ich habe nicht die Möglichkeit was einzustellen, PHP läuft außerdem im Safe-Mode.

        Quatsch.

        1. Das hat mit dem Safe-Mode nichts zu tun.
        http://www.dclp-faq.de/q/q-konfiguration-safe-mode.html

        2. Den Wert von register_globals kann man auch
        selbst aendern in der .htaccess Datei:

        php_flag register_globals off

        register_globals hat in neuen PHP-Installationen (ab 4.2.0)
        den Default-Wert "0" bzw. "off".
        Dein Provider hat ihn offenbar aus Gefaelligkeit gegenueber
        bequemen Skript-Kiddies oder alten Kunden wieder auf "1"/"on"
        gesetzt. Oder er benutzt eine total veraltete PHP-Version.

        1. Du arbeitest mit den Script-"Kurzvariablen"
          als Unwissender kenne ich keine Alternativen

        Dann hast Du PHP mit einer schlechten bzw. veralteten
        Anleitung gelernt.
        Lies lieber das:
        http://www.dclp-faq.de/ch/ch-webvariablen.html
        http://www.php.net/manual/de/security.registerglobals.php

        Korrekt, stabil und "modern" sind die Variablen
        $_GET, $_POST, $_REQUEST u.s.w.

        PHP-Manual: Predefined Variables (englisch, die deutsche Uebersetzung ist unvollstaendig/veraltet)
        http://www.php.net/manual/en/language.variables.predefined.php und
        http://www.php.net/manual/en/reserved.variables.php

        gleichzeitig benutzt: im <form>-tag die GET-Methode und im
           <input>-Tag die Post-Methode.
        verstehe ich nicht, habe doch im form-Tag method = post angegeben?

        Aber Du haengst Parameter an die URL im ACTION-Attribut.
        Das halte ich - wie erwaehnt - nicht fuer schlau.
        Auch wenn gewisse Leute behaupten, es sei erlaubt.

        Gruesse,

        Thomas

        1. Hello,

          gleichzeitig benutzt: im <form>-tag die GET-Methode und im
             <input>-Tag die Post-Methode.
          verstehe ich nicht, habe doch im form-Tag method = post angegeben?

          Ja, darum ist die Übertragungsmethode POST aktiviert. Die Parameter in der URi werden aber trotzdem im $_GET-Array abgelegt. Und wenn man nun die normale reihenfolge für die Übertragung der Werte aus den Arrays in die "Kurzen" eingestellt hat (GPC = Get Post Cookie), dann werden die Gets mit den gleichnamigen Posts und dann mit den gleichnamigen Cookies überschrieben. Das war ja Dein Problem.

          Aber Du haengst Parameter an die URL im ACTION-Attribut.
          Das halte ich - wie erwaehnt - nicht fuer schlau.
          Auch wenn gewisse Leute behaupten, es sei erlaubt.

          Das ist auch erlaubt. Als Fabian mir das mal untergejubelt hat, habe ich gleich recherchiert. Leider finde ich den Thread nicht mehr, in dem mir ein "Wissender des Forums" die passende Hinweise gab.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Hallo,
            sorry dass ich mich erst jetzt wieder melde.
            Wie gesagt, weiß ich nur dass ich nicht viel weiss. Aber das weiss ich sicher.
            Werde mich nach den Klausuren mal näher mit der Materie befassen.
            Werde mal die Links in die Favoriten kopieren damit ich sie nicht verlier.

            Gruß Andreas

  2. Hallo,

    print "<FORM ACTION="index.php?action=profilsave" METHOD="POST

    ^^^^^^^^^^^^^^^^^^
    Ich halte es nicht fuer schlau, URL-Parameter
    und die POST-Methode zu kombinieren.

    Wenn der Benutzer diesen Button klickt:

    "<INPUT TYPE="SUBMIT" CLASS="ibut" name="action" VALUE="&Auml;ndern">\n";

    dann hat
    $_POST['action'] den Wert "Aendern"
    und vermutlich
    $_GET['action'] den Wert "profilsave".

    Was (wenn ueberhaupt) in $action steht, haengt von
    der Reihenfolge in variables_order ab.
    http://www.php.net/manual/en/configuration.directives.php#ini.variables-order

    Lass Dir doch vor der Entscheidung

    if($action=='profilsave'){

    mal anzeigen, was in $action steht.

    Statt $action solltest Du sowieso
    $_GET['action'], $_POST['action'] oder $_REQUEST['action']
    verwenden, wobei bei $_REQUEST wieder nicht klar ist, aus
    welchem "Raum" (GET/POST) der Parameter kommt.

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. Danke für die Tipps,
      werde versuchen mich zukünftig daran zu halten.

      Gruß Andreas