Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] unset $_GET['submit'] >-- geht das?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] unset $_GET['submit'] >-- geht das?

    hallo leute,

    also ich habe ein Formular, in das Werte eingetragen werden können. Drückt man den "ok"-button, werden die Werte in eine mysql-Tabelle eingetragen und gleichzeitig alle in der Tabelle befindlichen Einträge zeilenweise ausgegeben.
    Problem ist jetzt: Drückt man ok werden die Einträge eingetragen und ausgegeben- aber wenn man den reload button des browsers drückt, dann werden die Werte erneut eingetragen, weil ich ja die url nicht von den GET variablen befreit habe.
    Das habe ich mit unset submit probiert, aber klappt nicht. Wie mach ich das?

    Vielen Dank
    Hier noch der code:
    PHP-Code:
    <html>
        <form action="<?= $_SERVER['REQUEST_URI']; ?>" method="get">
            <p>
                <label for="Vorname">Vorname:</label>
                <input type="text" name="Vorname">
            </p>
            <p>  
                <label for="Nachname">Nachname:</label>
                <input type="text" name="Nachname">

            </p>
            
            <input type="submit" name="submit" value="eintragen" class="submit">
        </form>
    <?php

    // Wenn Submit gedrückt, Werte in DB und submit reset: --------------------------------------


    $host ="localhost";
    $user "root";
    $pass "xxxx";
    $db "db_test";
    $connect=mysql_connect("{$host}","{$user}","{$pass}");
    $db_connect mysql_select_db($db);


    if (isset(
    $_GET['submit'])){
    $insert"
     INSERT INTO `db_test`.`tabelle_1` (`ID`, `Vorname`, `Nachname`) Values (NULL, '
    {$_GET["Vorname"]}', '{$_GET["Nachname"]}');
               "
    ;
    mysql_query($insert);
                               }
                             
    // ----------- submit resetten

    if (isset($_GET['submit'])){
    unset (
    $_GET['submit']); }

    // ---------- Einträge auflisten und zeilenweise ausgeben ---------------------


    if(!$connect){
    echo 
    "NO CONNECTION !!!";}
    else{
        
        if(!
    $db_connect){
        echo 
    "NO DB CONNECTION !!!";}
        else{
            
            
    $abfrage mysql_query("SELECT * FROM tabelle_1");
            if(
    $num_rows mysql_num_rows($abfrage)==0){
            echo 
    "Keine Einträge";}
            else{
                while(
    $ergebnis mysql_fetch_assoc($abfrage)){
                echo 
    $ergebnis['Vorname']." ".$ergebnis['Nachname']."<br />";
                                                              }
                }
            }
        }




    ?>

    </html>


  • #2
    Du hast da ne falsche Vorstellung. unset("$foo") löscht die Variable aus deinem Scope, mit dem Formular abschicken hat das nichts zu tun. Das ist wiederum ein Browser Feature.

    Um das zu verhindern musst du entweder weiterleiten (z.b. mit header: location) oder du liest dich in Sessions ein.
    I like cooking my family and my pets.
    Use commas. Don't be a psycho.
    Blog - CoverflowJS

    Kommentar


    • #3
      wohin soll ich ihn denn redirecten?

      Kommentar


      • #4
        [OT]

        rockscientist01
        Heißt das nicht rocketscience? LOL.


        [ON-T]

        Um das zu verhindern musst du entweder weiterleiten (z.b. mit header: location) oder du liest dich in Sessions ein.
        Dafür darfst Du Dich dann auch gleich in EVA einlesen (brandneuer Wikiartikel hier: EVA-Prinzip (Standardverfahren) - PHP.de Wiki )
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Leute wie funktioniert der redirect grundsätzlich?
          Wird die "form-action" dann zum php-redirect umgeschrieben, also etwa so:
          Code:
          <form action="<?= header('Location'); ?>" method="get">
          wobei 'LOCATION' dann die php-seite mit dem form-Auswertungscode und dem sql query ist?
          Ist das so gemeint?

          Bitte um kurze konzeptionelle Erklärung, wie header redirect funktioniert.

          Vielen Dank
          AO

          Kommentar


          • #6
            header('Location: ...'); hat nichts mit HTML zu tun.
            Das ist ein HTTP-Header.

            Um zu verstehen, wie HTTP genau funktioniert kann ich dir nur empfehlen, mal ein paar Webseitenaufrufe mit Wireshark zu protokollieren und anzugucken

            Kommentar


            • #7
              ja gut ich weiß doch, dass das niks mit html zu tun hat. Jemand hat hier den tip gegeben, "...kannste mit header redirect machen..." und jetzt möchte ich nur mal eine grobe Skizze bekommen, wie das mit header redirect funktioniert. Also so was in der Art:

              Also der header redirect macht, dass... und dadurch wird dann... was wiederum dazu führt, das... .

              Dadurch bekomme ich ein paar Anhaltspunkte, nach denen ich mir das dann selbst erarbeiten kann.
              Wenn ich so nach header redirect google dann bekomme ich natürlich tausend Seiten, die erklären, was der Header redirect macht.
              Und soweit habe ich ja auch verstanden, dass ich damit meine Seite umleiten kann. Das habe ich ja auch schon gemacht: meine Seite erfolgreich umgeleitet. Nur ist dabei leider garnichts passiert, was mit der Auswertung meines Formulars zu tun hat.
              Zu googlen nach "header redirect" in Verbindung mit meinem Problem "Formular wird bei refresh mehrfach eingetragen" brachte mich leider nicht weiter. Und deswegen frage ich ja auch hier im Anfänger Forum nach. Der Tip "mit Header redirect kannste dein Problem umgehen" ist ja super! Bitte erkläre mir noch jemand wie der header redirect prinzipiell mein Problem löst. Denn das verstehe ich nicht, weil nach meinen Recherchen bis jetzt der header redirect doch nur meine Seite umleitet??? Wo ist da die Verbindung zu meinem Problem des mehrfachen abarbeitens meines Formulares beim reload der seite?

              Danke

              Vielen Dank
              AO

              Kommentar


              • #8
                nniiiiccceeeeee ich habs hinbekommen, und freu mich wien Keks

                An alle, die das gleiche Problem haben:

                Die Lösung liegt in folgendem:

                Der Unterschied zu meiner ersten Variante ganz vorne im Thread besteht darin, dass man nun 2 Seiten hat, um das Gästebuch zu verwirklichen. Vorher war der Funktionsablauf so:
                Gästebuchaufruf -- Eintrag -- Verarbeitung auf gleicher Seite -- Anzeige der Einträge.

                Jetzt ist der Ablauf dieser:

                Gästebuchaufruf zu Seite1 -- Eintrag-- Sprung zur Seite 2--Verarbeitung auf S.2--auf S2 ein redirect zu S1--S1 Anzeige von Einträgen

                Man hat also eien Aufsplittung vom code auf 2 Seiten, wobei auf S.1 das steht:

                PHP-Code:
                <html>
                    <form action="query.php" method="get">
                        <p>
                            <label for="Vorname">Vorname:</label>
                            <input type="text" name="Vorname">
                        </p>
                        <p>  
                            <label for="Nachname">Nachname:</label>
                            <input type="text" name="Nachname">

                        </p>
                        
                        <input type="submit" name="submit" value="eintragen" class="submit">
                    </form>
                <?php

                // ---------- Einträge auflisten und zeilenweise ausgeben ---------------------

                $host ="localhost";
                $user "root";
                $pass "xxxx";
                $db "db_test";
                $connect=mysql_connect("{$host}","{$user}","{$pass}");
                $db_connect mysql_select_db($db);

                if(!
                $connect){
                echo 
                "NO CONNECTION !!!";}
                else{
                    
                    if(!
                $db_connect){
                    echo 
                "NO DB CONNECTION !!!";}
                    else{
                        
                        
                $abfrage mysql_query("SELECT * FROM tabelle_1");
                        if(
                $num_rows mysql_num_rows($abfrage)==0){
                        echo 
                "Keine Einträge";}
                        else{
                            while(
                $ergebnis mysql_fetch_assoc($abfrage)){
                            echo 
                $ergebnis['Vorname']." ".$ergebnis['Nachname']."<br />";
                                                                          }
                            }
                        }
                    }




                ?>

                </html>
                und auf Seite 2 das:

                PHP-Code:
                <?php
                $host 
                ="localhost";
                $user "root";
                $pass "xxxxx";
                $db "db_test";
                $connect=mysql_connect("{$host}","{$user}","{$pass}");
                $db_connect mysql_select_db($db);


                if (isset(
                $_GET['submit'])){
                $insert"
                 INSERT INTO `db_test`.`tabelle_1` (`ID`, `Vorname`, `Nachname`) Values (NULL, '
                {$_GET["Vorname"]}', '{$_GET["Nachname"]}');
                           "
                ;
                mysql_query($insert);        }
                header("Location: http://localhost/php_uebung/insert/form.php"); 
                ?>
                Geschafft

                Danke an alle helfenden!!!

                AO

                Kommentar


                • #9
                  Zitat von rockscientist01 Beitrag anzeigen
                  Wo ist da die Verbindung zu meinem Problem des mehrfachen abarbeitens meines Formulares beim reload der seite?
                  Variante ohne Redirect:

                  Browser sendet "POST /webapp/method.php HTTP/1.1" "Host: www.example.com" + Formulardaten

                  Server antwortet "HTTP/1.1 200 OK" + HTML

                  Wenn man im Browser jetzt die Seite aktualisiert, dann wird der letzte HTTP-Request vom Browser gesendet. In dem Fall wird das Formular also ein zweites mal abgesendet.


                  Variante mit Redirect:

                  Browser sendet "POST /webapp/method.php HTTP/1.1" "Host: www.example.com" + Formulardaten

                  Server antwortet "HTTP/1.1 302 Found" "Location: http://www.example.com/webapp/method.php"

                  Browser sendet "GET /webapp/method.php HTTP/1.1" "Host: www.example.com"

                  Server antwortet "HTTP/1.1 200 OK" + HTML

                  Wenn man im Browser jetzt die Seite aktualisiert, dann wird der letzte HTTP-Request vom Browser gesendet. In dem Fall aber ist es der HTTP-GET-Request und das Formular wird kein zweites mal abgesendet.


                  PS: Aber die Variante mit dem Redirect ist eben nur eine Variante das doppelte Eintragen zu verhindern. Und nicht unbedingt die beste.

                  Kommentar


                  • #10
                    Noch ein Hinweis: vermeide Short-Tags:
                    Zitat von php.net
                    Hinweis: Die Verwendung der Short-Tags sollten Sie vermeiden, wenn Sie Applikationen oder Bibliotheken entwickeln, die für die Weitergabe oder den Einsatz auf nicht Ihrer Kontrolle unterstehenden PHP-Servern bestimmt sind, da es sein kann, dass Short-Tags auf dem Zielsystem nicht unterstützt werden. Um portablen, weiterverteilbaren Code zu haben, verwenden Sie keine Short-Tags.
                    Zitat von php.net
                    Hinweis: Beachten Sie auch, dass Sie, wenn Sie PHP in XML oder XHTML einbinden wollen, die <?php ?>-Tags verwenden müssen, um keine Parserfehler aufgrund vermischter Standards zu provozieren.
                    http://hallophp.de

                    Kommentar


                    • #11
                      Und 2 Scripte braucht man auch nicht.
                      EVA-Prinzip (Standardverfahren) - PHP.de Wiki
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        komisch... bei deinem Link (von dem ich nicht so genau weiß, ober er im Anfängerforum sinnvoll platziert ist) wird doch auch auf ein script auf einer externen seite verwiesen:

                        PHP-Code:
                        <?php if ($_POST['Name'] == 'geheim') {
                               
                        header('Location: http://www.example.com/success.php');
                               exit;
                           } else { 
                               
                        ?>Die Anmeldung war leider falsch.<?php
                        Ich bin mir fast sicher, dass ich das als Anfänger nur nicht richtig verstehe, aber es kommt mir so vor, als gäbst du mir auf die Frage, wie ich die Bremse an meinem Auto entlüfte die Antwort, ich solle mich mit den Newtonschen Grundsetzen der Bewegung vertraut machen???

                        Jedenfalls danke für den tip, der ist sicher gut gemeint

                        Danke
                        AO

                        Kommentar


                        • #13
                          Lesen hilft.

                          1. Das zitierte Beispiel ist im Text als "Anfängerfehler" beschrieben
                          2. header-location verlangt immer eine vollständige URI. Das steht im Manual. Ganz gleich, ob example.com nun Deine oder eine fremde Domain ist.

                          von dem ich nicht so genau weiß, ober er im Anfängerforum sinnvoll platziert ist
                          Ich habe ihn extra für Einsteiger geschrieben. EVA ist jetzt nicht gerade Rocket Science. Und Programmierung ist eben mehr als Hallo Welt. Auch wenn Webprogrammierung nicht diesen Ruf hat, wirds auch hier schnell komplex.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Hallo nochmal,

                            also
                            1)bei meinem code-Zitat war der Kern der Frage doch deine Aussage zu 1 vs. 2 scripten. Du hast doch geschrieben "und 2 scripte braucht man auch nicht".
                            - Habe ich das falsch verstanden? Im Beispiel auf deinem Link gibt es doch auch 2 scripte, oder? Nämlich einmal das script "if ('Name' == 'geheim'){success.php}" und als zweites die success.php selbst? Sind doch dann 2 scripte, oder nicht? Ich dachte 1 script = eine seite.... ist das so gedacht falsch?

                            2)
                            wieder was gelernt . Danke, dass du mich darauf hingewiesen hast, werd ich ab jetzt so machen!

                            Bzgl. EVA:

                            Verstehe ich es richtig, dass es dabei darum geht, code so zu strukturieren, dass zuerst alles vollständig eingegeben - danach vollständig verarbeitet - und dann erst ausgegeben wird, um einem "Verarbeiten-Ausgeben-Widerspruch" zu vermeiden? Kann ich das so zusammenfassen?


                            Bzgl. meines eigenen codes:

                            Wenn meine Annahmen unter 'Bzgl. EVA' stimmen, dann müsste ich meinen eigenen code um den Richtlinien der EVA zu entsprechen so umschreiben, dass z.B. die Fehlermeldungen "NO CONNECTION" und "NO DB CONNECTION" - die ja im Moment bei Fehler sofort ausgegeben werden - zuerst in Variablen zwischengespeichert werden. Dann würde das script weiter ablaufen, queries verarbeiten usw. - und anders als bisher SOFORT - würde die Fehlerausgabe erst zum SCHLUß des gesamten scripts abgerufen werden. |<--- stimmt die Annahme so?


                            DANKE
                            AO

                            Kommentar


                            • #15
                              Absolut richtig. Was die Weiterleitung anbelangt. Statt success.php (der Artikel behandelt ja ein anderes Thema) könnte man genauso das akuelle Script angeben. Was allerdings recht umständlich wäre. Genauso gut tuts ein Include oder eben zwei mögliche Ausgaben, die je nach Status ausgegeben werden - Form / Erfolgsmeldung. Einige Infos dazu findest Du auch unter dem Stichwort Affenformular.
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X