HTML/PHP Formular

  • Hallo & schönen 1.Mai!

    Vielleicht (hoffentlich) kann mir heute noch jemand hier behilflich sein. Die Aufgabe ist einfach:

    ich möchte ein html bzw php formular mit werten füllen, und auf einen button weiter klicken - und komme auf die nächste seite.

    aber nur

    wenn die werte im formular nicht leer sind.

    dann

    soll jeweils unter der textbox ein hinweis stehen "bitte wert eingeben!"

    das problem ist, ich weiß nicht, wie ich ein

    <input type="submit" value="OK">

    abhängig von input werten mache. also wenn er den button drückt, passiert irgendwas und zwar: <form action="seite2.php" method="post"> ok - aber wie kann ich diese aktion "aufhalten" und vorher überprüfen, ob die werte überhaupt gefüllt sind?

    bin ein php-newbe (kann aber java und etwas C)

    vielleicht hab ich auch ein prinzipielles verständnis problem. bin für JEDE hilfe dankbar!

    lg alex

  • step1.php:

    In step2.php steht halt dann drinnen, was im zweiten Schritt passieren soll.

  • ..könntest du mir bitte kurz erklären, was hier passiert? ;)

    1.

    if($_POST &amp;&amp; $_POST['input']!="") {
    header("Location: step2.php");
    exit

    2.
    <?php if($_POST) echo "Bitte geben Sie was ein"; ?>
    <form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>

    ad 1. kann ich zuerst ignorrieren. interessant ist action _Server[PHP_SELF]

    also: php ruft sich selbst [die aktuelle Seite] auf (PHP_Self) wenn einträge vorhanden sind, gehts weiter, ansonsten 1

    wenn ich diese programmlogik aber auch auf sessions erweitern möchte, komme ich so nicht weiter, oder?

    heisst if($_Post) das selbe wie if (isset($_Post))?
    danke...

  • PHP
    if($_POST && $_POST['input']!="") {
        header("Location: step2.php");
        exit;
    }

    Sobald du auf den Button klickst, wird ein sogenannter POST-Request an den Server geschickt. In diesem Fall hat $_POST einen Wert ungleich 0, was mit if($_POST) überprüft werden kann.

    Nur wenn $_POST eben ungleich 0 ist, dann wird auch der zweite Teilausdruck ausgewertet: $_POST ist ein assoziatives Array, das alle Werte enthält, die ins Formular eingegeben wurden. Die Namen der einzelnen Arrayelemente entsprechen den Namen, die du den Formularelementen mit dem name-Attribut gegeben hast.

    Ist diese Eingabe ungleich der leeren Zeichenkette, so wird an den Browser ein HTTP-Header geschickt, der diesen zu step2.php weiterleitet. Die Ausführung von step2.php endet hier.

    Ist das nicht so, dann wird das Formular von Schritt 1 wieder angezeigt.

    PHP
    if($_POST) echo "Bitte geben Sie was ein";

    Wurde ein POST-Request abgeschickt, so kommen wir in der Ausführung nur dann an diese Stelle, wenn das Textfeld leer ist. Also wird eine entsprechende Meldung dargestellt. Bei komplexeren Eingabeformularen muss man natürlich überprüfen, in welcher Form die Formulareingaben unvollständig sind.

    HTML
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

    Das Array $_SERVER ist in PHP vordefiniert und enthält einige Daten, die in Skripts immer wieder benötigt werden. $_SERVER['PHP_SELF'] enthält beispielsweise den Namen des Skripts. Man könnte diesen natürlich hardcoden, was allerdings spätestens bei Umbenennen der Datei zu Problemen führen wird.

    Zitat von sommeralex

    wenn ich diese programmlogik aber auch auf sessions erweitern möchte, komme ich so nicht weiter, oder?

    Ich wüsste nicht, inwieweit sich Sessions auf diesen Teil der Programmlogik auswirken würden.

    Zitat von sommeralex

    heisst if($_Post) das selbe wie if (isset($_Post))?

    Nein; ersteres überprüft, ob $_POST einen Wert ungleich 0 hat (d.h. ob ein POST-Request vorliegt). Zweiteres überprüft, ob die Variable $_POST überhaupt existiert; das ist aber bei PHP immer der Fall, d.h. isset($_POST) wertet immer zu wahr aus.

    Abgesehen davon würd ich bei PHP immer auf korrekte Groß- und Kleinschreibung achten. Soweit ich weiß, gibt es Versionen, die case sensitive sind und solche, die nicht case sensitive sind; da erlebt man schon mal ein blaues Wunder, wenn dann mal nichts geht.

    Zitat von sommeralex

    danke...

    Kein Problem.

  • wenn ich auf jeder seite ein überprüfendes if($_POST && $_POST["input"]!="") habe, behindert doch spätestens bei der zweite seite dies die funktion des programmes.

    -> du hast recht, das ist kein problem - ich muss nur statt "input" die jeweiligen <input type="text" name="input"> namen ersetzen. also auf meiner seite2.php hab ich dann input2 je nach dem..


    ad programmlogik, idee: ich möchte mit sessions arbeiten (hast du dafür vielleicht auch ein extra-simpel beispiel? es gibt zwar ein paar links, aber keines ist so, wie ich es mir vorstelle: "wunsch" (oder ähnliches):

    seite1.php
    zwei formularfelder
    button weiter (seite1)

    seite 2.php
    zwei formularfelder
    button weiter(seite2)
    button zurück(seite1)

    seite3.php
    zwei formularfelder
    button zurück (seite2)

    und jetzt will ich irgendwo ein paar einträge machen und herumklicken (vor und zurück) und meine daten sollen erhalten bleiben. bzw wie du es eben gezeigt hast, wenn einträge fehlen, kommt ein textueller hinweis..

    nächste ungereimtheit:
    hab auch über XAMPP alles eingerichtet, phpeclipse zum laufen gebracht und sogar in der php.ini ein zusätzliches "directory" gesetzt. alles funktioniert. auch mein zweit pc (läuft über analog-proxy) kann mit Eingabe meiner IP Adresse im Browser auf meinen "Apache Server" zugreifen. - wenn ich aber extern (internet) jemanden bitte, spaßhalber zu prüfen, ob mein Server läuft, existiert meine seite nicht. habe ich das falsch verstanden? oder müsste das schon funktionieren? wenn apache läuft, hab ich einen server (solange mein pc läuft *g*), über den andere mittels ip zugreifen können. [http://128.131.214.86/xampp/]

    hm.. bin schon auf die antwort gespannt! ps: gibt es auch so etwas ähnliches wie eine php-api? vergleichbar mit java? also links alle befehle/Klassen und rechts alle varianten, konstruktoren und methoden?


  • Zitat von sommeralex

    -> du hast recht, das ist kein problem - ich muss nur statt "input" die jeweiligen <input type="text" name="input"> namen ersetzen. also auf meiner seite2.php hab ich dann input2 je nach dem..

    Das brauchst du gar nicht; sobald du mit header() weiterleitest, wird kein POST-Request, sondern ein GET-Request ausgeführt, daher evaluiert $_POST zu falsch.

    Zitat von sommeralex

    ad programmlogik, idee: ich möchte mit sessions arbeiten (hast du dafür vielleicht auch ein extra-simpel beispiel? es gibt zwar ein paar links, aber keines ist so, wie ich es mir vorstelle: "wunsch" (oder ähnliches):

    Hm, ich hab so etwas noch nie gemacht, müsst ich mal drüber nachdenken, wie man das machen könnte. Eventuell die Werte Session-Variablen speichern oder in einer Datenbank gemeinsam mit der Session-ID.

    Session-Verwaltung geht grundsätzlich ganz einfach:

    Erste Datei:

    PHP
    session_start();
    session_register("bla");
    $_SESSION['bla']="blub";

    Zweite Datei:

    PHP
    session_start();
    echo $_SESSION['bla'];

    Das sollte, wenn zuerst die erste Datei und dann die zweite Datei verarbeitet werden, "blub" ausgeben.

    Zitat von sommeralex

    hab auch über XAMPP alles eingerichtet, phpeclipse zum laufen gebracht und sogar in der php.ini ein zusätzliches "directory" gesetzt. alles funktioniert. auch mein zweit pc (läuft über analog-proxy) kann mit Eingabe meiner IP Adresse im Browser auf meinen "Apache Server" zugreifen. - wenn ich aber extern (internet) jemanden bitte, spaßhalber zu prüfen, ob mein Server läuft, existiert meine seite nicht. habe ich das falsch verstanden? oder müsste das schon funktionieren? wenn apache läuft, hab ich einen server (solange mein pc läuft *g*), über den andere mittels ip zugreifen können. [http://128.131.214.86/xampp/]


    Deine IP-Adresse hat den Hostnamen v214-086.vps.tuwien.ac.at, ich nehme mal an, du hast TU-ADSL. Bei TU-ADSL blockiert die ZID-Firewall alle eingehenden Verbindungen, die von außerhalb des TUNET kommen. Ich hab eine IP-Adresse innerhalb des TUNET und kann daher problemlos auf deinen Webserver zugreifen (wenn ich in der URL %5D entferne). Von außerhalb des TUNET ist dein Webserver nicht erreichbar.

    Davon abgesehen ist dein XAMPP ein riesiges Sicherheitsloch; der Benutzer "root" hat beispielsweise in deiner Datenbank kein Passwort, ich kann problemlos auf dein phpMyAdmin und damit deine MySQL-Datenbank zugreifen.

    Zitat von sommeralex

    hm.. bin schon auf die antwort gespannt! ps: gibt es auch so etwas ähnliches wie eine php-api? vergleichbar mit java? also links alle befehle/Klassen und rechts alle varianten, konstruktoren und methoden?

    Ich verwende immer die PHP-Dokumentation auf http://www.php.net/manual/en/, reicht für meine Zwecke völlig aus.

  • cool :verycool:, dass heisst, mein server läuft - prinzipiell. danke fürs nachschauen und den sicherheitshinweis.

    sessions sind anscheinend wirklich sehr einfach - wobei in meinem beispiel auf die session_register verzichtet wurde (?).
    [http://at.php.net/function.session-start]

    jetzt bleibt nur mehr eine frage, für mein beispiel. wie kann ich die werte "zurückschreiben" und zwar direkt in das form. also beispiel:

    befinde mich auf seite2 und gehe zurück auf seite1. jetzt sollten in den forms die alten daten stehen. (ich bedanke mich zwar jetzt schon für deine antwort) aber ich glaube, ich hab noch ein grundlegendes verständnis problem, dessen antwort auch sehr hilfreich wäre:

    wie "trenne" bzw "verbinde" ich html und php?

    ich habe ein html mit einer inputbox (input) und nun muss ich auf value zugreifen. abstrakt gefragt: "kann ich von außen auf html elemente zugreifen, oder muss ich im php quelltext eine eigene inputbox erstellen und diese dann mit einem value setzen? (von "innen" zugreifen?)"

    von außen:

    <?
    sessionval = $_Session[x];
    ?>

    <form action="seite1.php" method="post">
    <input type="text" size="17" name="Inhalt" value="sessionval">
    <input type="text" size="17" name="Inhalt2">
    von innen:

    <?

    sessionval = $_Session[x];

    echo

    <form action="seite1.php" method="post" value="sessionval">
    <input type="text" size="17" name="Inhalt">
    <input type="text" size="17" name="Inhalt2">


    ?>

  • Das schaut dann ungefähr so aus:

    HTML
    <input type="text" value="<?php echo $_SESSION['bla']; ?>">

    Oder

    HTML
    <?php $bla=$_SESSION['bla']; ?>
    <!-- ... -->
    <input type="text" value="<?php echo $bla; ?>">

    PHP-Code kann irgendwo mitten im HTML stehen, sobald <?php kommt, weiß der PHP-Interpreter, was er zu tun hat :)

    Ganz schön gehts natürlich mit Templates (z.B. Smarty), dadurch kann man HTML und PHP mehr oder weniger komplett trennen:

    bla.php:

    PHP
    /* ... */
    include("lib/Smarty.php");
    $smarty=new Smarty;
    $smarty->assign("bla",$_SESSION['bla']);
    $smarty->display("bla.tpl");
    /* ... */

    bla.tpl:

    HTML
    <!-- ... -->
    <input type="text" value="{$bla}">
    <!-- ... -->

    Wobei ich jedoch anmerken möchte, dass Templates bei deinem Wissensstand wahrscheinlich der ultimative Overkill sind, dazu wirst du noch ein wenig Erfahrung brauchen. :)

  • jetzt ist es mir doch etwas klarer. aber, ist

    <input type="text" value="<?php echo $_SESSION["bla"]; ?>">
    das eine gute lösung? - was, wenn die session variable unset ist?

  • Zitat von sommeralex

    was, wenn die session variable unset ist?

    Das kannst du natürlich vorher prüfen und eine entsprechende Aktion setzen.

  • Zitat von sommeralex

    das heisst, ich setze nach value=

    einfach eine php abfrage (pseudo)

    Ja, kannst du so machen, oder halt schon früher (wenn dus ein wenig übersichtlicher haben und daher derartige PHP-Konstruktionen nicht mitten im HTML stehen haben willst).

  • ok, dann komme ich vorerst zur letzten frage, beveor ich mich nun in die bibi setze und mich in php (von allein *g*) vertiefe:

    nach

    session_start()
    gibts session_register() - in manchen beispielen wird darauf aber verzichtet. warum? http://at.php.net/function.session-start%5D

    und jetzt eine nicht-informatik frage, wenn ich bitten darf ;)

    -> hat man als moderator einfach eine soziale ader anderen zu helfen, und/oder ist man einfach mit herz und seele tutor mit ausblick zum professor (didaktische motivation) ? ich helfe auch gerne, aber eher in nicht-virtuellen-welt. letztens hatte sich einen freund 4 tage bei mir verschanzt (eprog) - doch war das mitunter sehr anstrengend. darum würde ich gerne die philosophie hinter jenen menschen verstehen, die hier so aktiv anderen helfen.

  • Zitat von sommeralex

    nach

    session_start()
    gibts session_register() - in manchen beispielen wird darauf aber verzichtet. warum? http://at.php.net/function.session-start%5D

    Muss ich zugeben - keine Ahnung, ich habs bis jetzt immer verwendet; vielleicht ist das der Grund, warum meine PHP-Skripte nicht immer das machen, was ich von ihnen will :distur:

    Zitat von sommeralex

    -> hat man als moderator einfach eine soziale ader anderen zu helfen, und/oder ist man einfach mit herz und seele tutor mit ausblick zum professor (didaktische motivation) ? ich helfe auch gerne, aber eher in nicht-virtuellen-welt. letztens hatte sich einen freund 4 tage bei mir verschanzt (eprog) - doch war das mitunter sehr anstrengend. darum würde ich gerne die philosophie hinter jenen menschen verstehen, die hier so aktiv anderen helfen.

    Als Moderator in einem Forum wie dem Informatik-Forum hat man den Trieb, in einem gewissen Rahmen für Zucht und Ordnung zu sagen. Wenn du mich fragst, warum ich hier gerne anderen Leuten helfe, muss ich dir sagen, ich weiß es selbst nicht so genau. Vielleicht möchte ich einfach andere an dem Wissen und den Informationen, die ich mit mir herumschleppe, teilhaben lassen.

    Das hat aber genau nichts damit zu tun, ob man Tutor ist oder nicht (ich bins nicht, bis jetzt hat mich noch kein Institut, das ich belästigt habe, genommen).

  • also folgendes:

    session_register() mach man zum beispiel nur nach erfolgreichem login in einem shopsystem oder einfach in einer administration.

    beispiel:

    jemand loggt sich mit usernamen und passwort ein - vorausgesetzt das ganze is richtig (abgleich mit werten aus einer datenbank) wird aus dem usernamen und dessen userid (aus der datenbank) einfach eine session registriert und auf dem server gespeichert. so lang die jetz registriert ist kann er sich im "geschützten bereich" bewegen, beim logout wird die session zerstört und beim schließen des browsers is sie glaub ich auch nicht wieder "herzustellen" - sprich du brauchst ein erneutes login.

    das gilt aber nur wenn du $_SESSION nicht sowieso verwendest.

    kurzversion:
    session_register() macht die session "global" ist relativ alt und macht eigentlich nix anderes als $_SESSION, dafür is aber $_SESSION sicherer.


    in dem fall empfehl ich dir das manual von php
    http://at.php.net/manual/de/function.session-register.php
    (erster codeblock - dort wirds auch nochmal erklärt)

    lg, Phil

    ach ja, wegen der hilfe.... wenn man sich wo auskennt, isses doch eh kein problem zu helfen. und dafür nimmt man sich halt manchmal auch 5 minuten zeit. das hat nix mit sozialer ader oder sonstwas zu tun find ich... ich freu mich eher wenn jemand versteht was ich da so verzapfe. *lach*

    Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders!
    http://www.chuckbronson.net/

  • jetzt versuche ich, die werte aus einer session (falls sie gesetzt sind, direkt in das inputfeld zurückzuschreiben; wenn der benutzer wieder auf die seite kommt, sollen die werte/daten enthalten sein)

    dennoch kommt es bei mir zu folgender fehlermeldung:

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at F:\apachefriends\xampp\xampp\htdocs\Hyper\session_1.php:10) in F:\apachefriends\xampp\xampp\htdocs\Hyper\session_1.php on line 11

    CODE

    <html>
    <head>
    <body>

    <?php
    session_start();
    ?>

    <form method="post" action="<?php

    $_SESSION['input'] = $_POST['input'];
    //echo $_SERVER['PHP_SELF'];

    ?>">
    <input type="text" name="input" value="

    <?php

    if (isset($_SESSION['input'])){
    echo $_SESSION['input'];
    }
    else{
    echo "";
    }


    ?>

    ">
    <input name="Next" type="submit">
    </form>

    </body>
    </html>

  • Der Apache sagt dir eh ganz genau, was nicht passt - die Textausgabe darf vor dem Senden von Sessioninformationen noch nicht gestartet worden sein. Das bedeutet, dass du session_start() ganz an den Anfang deines Skripts verfrachten musst (noch vor <html>), eventuell auch schreibende Zugriffe auf $_SESSION, da bin ich mir aber nicht sicher.

  • jetzt gehts..! aber.. ich kämpfe leider mit einem weiteren problem: (hab schon gegoogelt & tutorials angesehen -> keine lösung gefunden)

    darum wieder hier ;) also: warum funktioniert der rot-unterlegte befehl nicht? idee: ich möchte zwei buttons haben. der eine ist ein normaler submit button. die aktion ist in action (grün) festgelegt. der andere button ist ein normaler button (violett) bei onclick soll er einen php befehl ausführen.

    ich erhalte keine fehlermeldung beim drücken dieses buttons aber die aktion funktioniert nicht.

    <html>
    <head>
    <body>


    <form method="post" action="<?php

    $_SESSION['input'] = $_POST['input'];
    //echo $_SERVER['PHP_SELF'];

    ?>">
    <p>
    <input type="text" name="input" value="

    <?php

    if (isset($_SESSION['input'])){
    echo $_SESSION['input'] . "cool";
    }
    else{
    echo "";
    }


    ?>

    ">
    <input name="Next" type="submit" value =";-)">
    <input type="button" value="Fenster oeffnen" name="button1"
    onClick="<?php echo 'klick'; ?>">
    </form>

    </body>
    </html>

    habe die lösung gerade gefunden:

    http://www.thescripts.com/forum/thread5572.html

    frage: gibt es eine andere möglichkeit, einen zweiten button festzulegen und dann php auszuführen? ich denke, es MUSS ja gehen, denn es gibt doch viele seiten mit mehreren buttons (und jeder hat eine bestimmte [code=php]funktion.

    ad Lösung:
    Also Argument warum onClick="<?php.." nicht geht, ist, weil serverseitiges mit clientseitigem verwechselt wird. wie ist das zu verstehen? gibt es irgendwo ein "diagramm" in dem ersichtlich ist, wann wie und warum php anforderungen vom client zurück an den server geschickt werden - und wann nicht?

    also wenn ich es halbwegs richtig verstehe, dann macht ein html-form-action eine "serveranfrage" irgendwas soll passierten - und am client wird, nachdem *irgendwas* passiert ist, eine seite (die alte oder neue) neu-geladen.

    Wenn ich jetzt onClick="<php..." answeise, ist nach "HTML" spezifikation alles so ausgelegt, dass die aktionen auf meinem "client" sind. (darum kann man auch java-skript für onClick verwenden. ABER: kann ich nicht javascript auch mit meinem server kombinieren? Oder anders: habe ich hier etwas grundsätzlich nicht verstanden, oder ist es einfach "formsache", dass onClick kein Php verträgt? Gibt es jetzt eine möglichkeit, mehrere Buttons zu verwenden, wobei jeder button eine eigene PHP funktion führt? Oder kann ich, (hintertür) wenn das form-action geschieht, in meinem PHP Script überprüfen, welcher Button(-Name) diesen befehl ausgeführt hat?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!