Jürgen: Formular- Bei erfolg....

Hallo!

Erstmal bin ich ein Anfänger in PHP.
Ich versuch gerade folgendes:

<?php
if($_POST['submit']) {
 if(!$_POST['name']) {
 echo "Bitte gib deinen Namen ein!";
 }
 if(!$_POST['news']) {
 echo "Nachricht musst schon schreiben!";
 }
}
?>
<FORM ACTION="<?=$PHP_SELF?>" METHOD="POST" NAME="newsentry">
Your name:<BR>
<INPUT TYPE="text" SIZE="30" NAME="name"><BR>
The News:<BR>
<TEXTAREA NAME="news" COLS="40" ROWS="5"></TEXTAREA><BR><BR>
<INPUT TYPE="submit" NAME="submit" VALUE="Post it!"><BR>
</FORM>

Das klappt auch alles wunderbar.
Wo ich aber nicht drauf komme ist wie kann ich bei erfolg folgendes ausgeben
echo "<b>Nachricht hinzugefügt!</b>\n";

Sprich wenn beide Felder ausgefüllt wurden soll er die Nachricht auspucken.
Ok das einzige was mir eingefallen ist wäre exit; zu benutzen, aber das will ich nicht weil da zwing ich den user jedesmal auf den back button zu klicken.

Wie kann ich das machen?

Und noch eine Frage, der User gibt jetzt zb. im news feld einen langen text ein und vergisst seinem Namen einzufügen, wie kann ich dafür sorgen das der von Ihm eingebene Text nicht verloren geht sondern er nur nch seinen Namen einzugeben braucht.

Vielen Dank schon mal im voraus!

Liebe Grüße aus Wien,

Jürgen

  1. hallo ebenfalls,

    Sprich wenn beide Felder ausgefüllt wurden soll er die Nachricht auspucken.

    Lustig. Die Lösung steht nämlich bereits in deinem Script ;-)

    folgendes:
    mit

    if($_POST['submit']) {
    if(!$_POST['name']) {
    echo "Bitte gib deinen Namen ein!";
    }
    if(!$_POST['news']) {
    echo "Nachricht musst schon schreiben!";
    }
    }

    fragst du ab, ob deine Eingabefelder (input und textarea) leer sind und reagierst darauf. Jetzt brauchst du doch bloß abfragen, ob sie gefüllt sind und ebenfalls darauf zu reagieren, gelle ? Das bedeutet, daß du einfach bloß eine weitere if-Abfrage schreiben mußt, bei der das Anführungszeichen in

    if(!$_POST['name']) {

    und

    if(!$_POST['news']) {

    fortgelassen wird. Natürlich mußt du dann noch das korrekte "echo" hinschreiben

    Und noch eine Frage, der User gibt jetzt zb. im news feld einen langen text ein und vergisst seinem Namen einzufügen, wie kann ich dafür sorgen das der von Ihm eingebene Text nicht verloren geht sondern er nur nch seinen Namen einzugeben braucht.

    indem du statt

    echo "Bitte gib deinen Namen ein!";

    ein kleines zusätzliches Anzeigefensterchen öffnen läßt, das den Hinweis auf den vergessenen Namen enthält

    Grüße aus Berlin

    Christoph S.

    1. Hallo auch von mir,

      Und noch eine Frage, der User gibt jetzt zb. im news feld einen langen text ein und vergisst seinem Namen einzufügen, wie kann ich dafür sorgen das der von Ihm eingebene Text nicht verloren geht sondern er nur nch seinen Namen einzugeben braucht.
      indem du statt
      echo "Bitte gib deinen Namen ein!";
      ein kleines zusätzliches Anzeigefensterchen öffnen läßt, das den Hinweis auf den vergessenen Namen enthält

      Das würde ich besser sein lassen, wenn es nur eines unter sehr wenigen JavaScripts ist - _Ich_ müßte dann den Text trotzdem neu eingeben...außer..Du setzt einen Zurück-Link, der als OnClick-Event ein "history.back();" erhält - Mir ist bisher kein Browser untergekommen, der bei einer Zurück-Funktion nicht den Formularinhalt wieder da hätte.
      Diese Lösung würde also wohl schneller gehen, wenn Du aber eine sichere Lösung willst solltest Du dem Formular die Werte zurückgeben:

      • eine Datei mit zufälligem Namen erzeugen, den Text da reintun und dem Form per URL-Parameter den Namen mitteilen
      • einen Cookie setzen
      • allgemein mit Session-Funktionen arbeiten
      • in ein verstecktes Formular die Daten schaufeln und dann mit Grafik-Buttons (oder auch normalen) den Nutzer zum Ursprungs-Formular zurückschicken.

      Viel Erfolg

      Thomas

      1. hi,

        Das würde ich besser sein lassen, wenn es nur eines unter sehr wenigen JavaScripts ist

        wie kommst du denn auf Javascript ? Es geht um PHP ...

        _Ich_ müßte dann den Text trotzdem neu eingeben

        bitte, ein Mann muß tun, was ein Mann tun muß

        wenn Du ... eine sichere Lösung willst solltest Du dem Formular die Werte zurückgeben:

        • eine Datei mit zufälligem Namen erzeugen, den Text da reintun und dem Form per URL-Parameter den Namen mitteilen

        ok. Dann muß bloß noch die "Datei mit zufälligem Namen" bei Nichtbedarf wieder gelöscht bzw. bei tatsächlichem Bedarf in ein neues Fensterchen geladen werden  -  ähm, hatten wir das mit dem neuen Fensterchen nicht schonmal ?

        • einen Cookie setzen

        och na nicht doch, für diese Winzigkeit muß nicht gleich noch ein Keks her

        • allgemein mit Session-Funktionen arbeiten

        guter Rat, aber bei dieser sehr einfachen Konstruktion nicht zwingend nötig und für den Fragesteller (vielleicht) noch zu schwierig

        • in ein verstecktes Formular die Daten schaufeln

        dafür würde auch eine Variable genügen

        ... und dann mit Grafik-Buttons (oder auch normalen) den Nutzer zum Ursprungs-Formular zurückschicken.

        ähm ... aber die Daten sind ja jetzt in einem "versteckten Formular", und der Nutzer sieht sie eben scheinbar nicht mehr. Also muß auch mit den Daten noch was passieren, oder ?

        Christoph S.

        1. Das würde ich besser sein lassen, wenn es nur eines unter sehr wenigen JavaScripts ist
          wie kommst du denn auf Javascript ? Es geht um PHP ...

          Entschuldige falls ich was übersehen habe, aber bisher habe ich neue Fenster eigentlich immer per JavaScript auf sinnvolle Größe getrimmt. Hast Du besser Vorschläge für "kleine Fenster"?

          _Ich_ müßte dann den Text trotzdem neu eingeben
          bitte, ein Mann muß tun, was ein Mann tun muß

          Eben.

          wenn Du ... eine sichere Lösung willst solltest Du dem Formular die Werte zurückgeben:

          • eine Datei mit zufälligem Namen erzeugen, den Text da reintun und dem Form per URL-Parameter den Namen mitteilen
            ok. Dann muß bloß noch die "Datei mit zufälligem Namen" bei Nichtbedarf wieder gelöscht bzw. bei tatsächlichem Bedarf in ein neues Fensterchen geladen werden  -  ähm, hatten wir das mit dem neuen Fensterchen nicht schonmal ?

          Kleiner Denkfehler oder Mißverständniss der Funktion:
          1. Formular wird falsch ausgefüllt.
          2. Überprüfung des Forms, feststellung das falsch.
          3. Ausgabe dieser Info.
          4. Anbieten eines Links um zurück zu gehen.
          5. Ausfüllen, wobei alte Werte übernommen wurden

          Wenn auf Position 4 ein Zufallsstring (Zufallszahl, mit chr() in Zeichen gewandelt und verkettung von 7 oder 8 Zeichen) erzeugt wird, nach überprüfung auf Existenz die Datei angelegt und der Inhalt reingeschrieben wird kann aller Code mehrfach genutzt werden.
          Dann brauch man nämlich nur genau ein Formular und eine Überprüfung desselbigen; das Form muß lediglich überprüfen ob per URL (also mit GET) ein Dateiname übergeben wurde und diese auslesen + löschen (ok, hatte ich vergessen).
          Ein neues Fenster ist nicht wirklich günstig, weil dann das Formular neu erstellt werden muß (ohne sonstiges Seitendesign bzw. ohne Includes), die neue Überprüfung muß dort stattfinden und erzeugt noch ein Fenster ....

          • einen Cookie setzen
            och na nicht doch, für diese Winzigkeit muß nicht gleich noch ein Keks her

          Nö, war nur ein Vorschlag. Ob "Winzigkeit" aber richtig ist ist die Frage - es geht schließlich lt. Originalbeitrag um viel Text. Wenn ich nur 2 Zeilen verliere ist das was anderes als ein Kurzroman...

          • allgemein mit Session-Funktionen arbeiten
            guter Rat, aber bei dieser sehr einfachen Konstruktion nicht zwingend nötig und für den Fragesteller (vielleicht) noch zu schwierig

          Mag sein, wenn aber noch mehr Funktionen benötigt werden kommt man irgendwann meist doch dahin. Und gesammelte Ideen haben noch nie geschadet.

          • in ein verstecktes Formular die Daten schaufeln
            dafür würde auch eine Variable genügen

          Aber nicht in der URL! Die Länge der GET-Variablen hängt ziemlich deutlich vom Browser ab - und wenn für http://www.irgendeinedomain.de/scripts/guestbook.php?text=Hierkommteinlangertextmit%20Urlencodeten%20Sonderzeichen
          nur 2048 Zeichen zur Verfügung stehen sieht es schon bei Gästebüchern oft eng aus. POST ist da wirklich unbeschränkt.

          ... und dann mit Grafik-Buttons (oder auch normalen) den Nutzer zum Ursprungs-Formular zurückschicken.
          ähm ... aber die Daten sind ja jetzt in einem "versteckten Formular", und der Nutzer sieht sie eben scheinbar nicht mehr. Also muß auch mit den Daten noch was passieren, oder ?

          Na sicher - in obigem Punkt 4 wird ein Button angeboten "Go back", wodurch das Formular an das Formularscript übergeben wird, die Daten landen per POST eben dort und können wieder eingefügt werden.

          Alles Klar?

          Thomas

          1. hi,

            bisher habe ich neue Fenster eigentlich immer per JavaScript auf sinnvolle Größe getrimmt. Hast Du besser Vorschläge für "kleine Fenster"?

            "bessere" sicher nicht, aber "andere". Was in Javascript mit "window.open()" möglich ist, geht mit PHP schließlich auch, und mit sehr ähnlichem Code. Für die Kurzmitteilung, daß ein Eintrag vergessen wurde, braucht man allerdings nicht zwingend ein eigenes "kleines Fenster", dafür reicht ein Alert.

            Kleiner Denkfehler oder Mißverständniss der Funktion:

            1. Formular wird falsch ausgefüllt.
            2. Überprüfung des Forms, feststellung das falsch.
            3. Ausgabe dieser Info.
            4. Anbieten eines Links um zurück zu gehen.
            5. Ausfüllen, wobei alte Werte übernommen wurden

            Wenn auf Position 4 ein Zufallsstring (Zufallszahl, mit chr() in Zeichen gewandelt und verkettung von 7 oder 8 Zeichen) erzeugt wird, nach überprüfung auf Existenz die Datei angelegt und der Inhalt reingeschrieben wird kann aller Code mehrfach genutzt werden.
            Dann brauch man nämlich nur genau ein Formular und eine Überprüfung desselbigen; das Form muß lediglich überprüfen ob per URL (also mit GET) ein Dateiname übergeben wurde und diese auslesen + löschen (ok, hatte ich vergessen).

            ahso. Ich hab gesehen, daß da was fehlte, kam aber nicht drauf.

            Ein neues Fenster ist nicht wirklich günstig

            richtig, und das hab ich auch nicht behauptet. Wie oben bereits angeführt, genügt bei etwas niedriger angesetztem Layout-Anspruch ein "alert"

            dafür würde auch eine Variable genügen
            Aber nicht in der URL! Die Länge der GET-Variablen hängt ziemlich deutlich vom Browser ab - und wenn für http://www.irgendeinedomain.de/scripts/guestbook.php?text=Hierkommteinlangertextmit%20Urlencodeten%20Sonderzeichen
            nur 2048 Zeichen zur Verfügung stehen sieht es schon bei Gästebüchern oft eng aus. POST ist da wirklich unbeschränkt.

            Ich bin auch von POST ausgegangen, für GET sehe ich keinen zwingenden Anlaß. Wenn tatsächlich GET genommen wird, hast du recht.

            Alles Klar?

            mir schon *g*

            Christoph S.

            1. Hallo alle zusammen!

              Erstmal vielen herzlichen Dank für die rege Beteiligung und unmengen an tips, tricks etc...

              Ich denke mir mal ich bin euch eine erklärung schuldig.

              Es geht um folgendes:

              Ich könnte hergehen und phpnuke downloaden, hab es innerhalb von 15 minuten laufen (zuhause, sonst dauert es etwas länger wegen dem uploaden) und habe dann ein sehr beeindruckendes CMS das echt was drauf hat. Oder auch nicht...

              Nun ist es aber so das ich wissen möchte wie etwas funktioniert und deshalb hab ich phpnuke wieder gelöscht. Alles.

              Gut, wie lernt man PHP....ich hab gott weiss wo herum gesurft, etliche sogenannte "tutorials" gelesen die in Wirklichkeit keine tutorials sind sondern nur code mit 2 Zeilen erklärung was der komplette code tut ohne das man weiss warum und wieso etc..

              Das einzig wirkliche extrem sinnvolle und wirklich für JEDEN zu empfehlende tutorial ist das von Kevin Yank auf sitepoint.com. (Building a Database-Driven Website Using PHP and MySQL ).

              Nachteil dabei ist nur das das ganze ohne "authentication" gemacht wird.

              Also möchte ich nun selbst ganz klein anfangen und erstmal versuchen ein kleines simples script zu schreiben welches mir ermöglicht news über ein formular zu schreiben dessen inhalt in einer MySQL datenbank gespeichert wird und auf der website dynamisch erstellt wird.

              Wenn ich das mal geschafft habe gehe ich dann zum nächsten schritt indem ich edit und delete links hinzufügen möchte, und dann möchte ich versuchen das ganze zu schützen (davor fürchte ich mich am meisten da es ja in PHP leider nichts gibt was wirklich sicher ist. Wer mir nicht glaubt sollte mal das hier lesen http://www.securereality.com.au/studyinscarlet.txt da kommt einem das pure fürchten.
              Aber egal, man muss ja nicht alles immer so kompliziert machen.

              So ich hoffe nun ist jedem klar was ich erreichen will mit diesem meinem allersten selbst geschriebenen script. (ich weiss für euch sicher nichts besonderes aber jeder muss ja mal irgendwo anfangen :)

              Ich werd jetzt mal versuchen ob irgend eine der vorgeschlagenen Lösungen funktoniert betreffende der ersten Frage, dann widme ich mich dem zweiten.

              Nochmals vielen Dank für Eure Zeit und Hilfe.

              Liebe Grüße aus Wien,

              Jürgen

              1. Moin,

                davor fürchte ich mich am meisten da es ja in PHP leider nichts gibt was wirklich sicher ist. Wer mir nicht glaubt sollte mal das hier lesen http://www.securereality.com.au/studyinscarlet.txt da kommt einem das pure fürchten.

                Das würde ich so nicht sagen. Es ist zwar schon ein bisschen her dass ich den verlinkten Text gelesen haben, aber wenn ich mich recht entsinne war da nichts bei was man nicht durch ein paar einfache Regeln verhindern hätte können:

                • Bei allen Datenbankabfragen die Parameter in Anführungszeichen einschließen und dafür sorgen dass Anführungszeichen innerhalb der Parameter escaped sind (zum Beispiel dadurch dass magic_quotes_gpc eingeschaltet wird) oder reine Zahlenparameter nach (int) casten
                • Alle Variablen die lokal verwendet werden und keine userbestimmten Daten enthalten sollen, korrekt initialisieren. Das heisst der erste Zugriff auf eine Variable sollte ein $bla = ... oder ein unset($bla); sein. (Um solche Fehler zu finden, hilft es den Interpreter auch Fehlermeldungen auf Notice-Level ausgeben zu lassen)
                • Aller userbestimmbare Text wird bei der Ausgabe entweder mit stripslashes() (nicht so gut) oder htmlentities() bearbeitet. Wenn der User wirklich HTML-Code ausgeben können soll, müssen entsprechend andere Vorkehrungen getroffen werden, das ist zugegebenermaßen nicht mehr trivial.
                • Wenn Shellkommandos aufgerufen werden sollen, müssen die Parameter mit escapeshellarg() escaped werden
                • Wenn Fileuploads im Spiel sind, muss is_uploaded_file() verwendet werden.
                • Es versteht sich von selbst, dass fopen($userbestimmbarevariable) in keiner Form aktzeptabel ist. Besser ist da if($bla=="1") fopen("erstedatei"); else if($bla=="2") fopen("zweitedatei") etc. oder wenn schon Userbestimmbar dann bitteschön fopen("einsicheresverzeichnis".basename($bla))

                Das sollte im Prinzip den größten Teil der potentiellen Sicherheitsprobleme abdecken und ist, wenn man es sich erstmal angewöhnt hat, gar nicht so schwer durchzuziehen.

                --
                Henryk Plötz
                Grüße von der Ostsee

  2. Hallo Jürgen

    Das klappt auch alles wunderbar.
    Wo ich aber nicht drauf komme ist wie kann ich bei erfolg folgendes ausgeben
    echo "<b>Nachricht hinzugefügt!</b>\n";

    Du brauchst (ich bleibe bei deinem Code) zum IF-Zweig einen else-Zweig:
    if($_POST['submit']) {
     if(!$_POST['name']) {
     echo "Bitte gib deinen Namen ein!";
     }
     if(!$_POST['news']) {
     echo "Nachricht musst schon schreiben!";
     }
    }
    else {echo "<b>Nachricht hinzugefügt!</b>\n";}

    Und noch eine Frage, der User gibt jetzt zb. im news feld einen langen text ein und vergisst seinem Namen einzufügen, wie kann ich dafür sorgen das der von Ihm eingebene Text nicht verloren geht sondern er nur nch seinen Namen einzugeben braucht.

    Dann mußt du den Inhalt an die andere Datei weitereichen (per Formular, an den URL angehängt (Methode get also http://www.wasauchimmer.com/datei.php?text=blaablbal) oder per Sessionvariablen

    Gruss Sven

    1. hi,

      Du brauchst (ich bleibe bei deinem Code) zum IF-Zweig einen else-Zweig:

      das kann er zwar machen, aber nicht so, wie du es vorschlägst, sondern so:

      if($_POST['submit']) {
       if(!$_POST['name']) {
       echo "Bitte gib deinen Namen ein!";
       }
       if(!$_POST['news']) {
       echo "Nachricht musst schon auch noch schreiben ;-)";
       }
      else {
       if($_POST['name']) {
       echo "danke $name, deine Nachricht wurde ...";
       }
       if (irgendwas) {
       }
      }

      Christoph S.

      1. Hallo Christoph,

        das kann er zwar machen, aber nicht so, wie du es vorschlägst, sondern so:

        [...]
        Yep - da hast du wohl recht - das war wohl nix ;) - sorry!

        Manchmal sollte man vor dem Tippen etwas mehr überlegen oder zweimal draufschauen.

        Sven