Input Felder einem Formular zuweisen

  • Hallo zusammen,


    ich habe zwei Formulare hintereinander auf einer Seite. Im zweiten Formular habe ich Input Felder vom Typ Text.
    Wenn ich eine Eingabe ins Inputfeld mache, und es mit einem Klick auf die Wiederholungstaste der Webseite machen sind die Feldinhalte futsch!.
    Wenn ich die Eingabe mit Return abschließe, weiß die Seite wohl nicht was Sie machen soll, und nimmt sich das erste Inputfeld was es findet, hier aus dem ersten Formular, und setzt mir den Inhalt der Seite um, und die Eingaben sind futsch.


    Hat einer eine Idee, wie man das umgehen kann? ;( ;( ;(

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von willi356 ()

  • Na dann mal wie von Basi gefordert der Code!




    UNd damit man es ganz versteht auch noch die Funktion status_detail






    Wie im oberen Code zu sehen, folgen zwei Form -tag aufeinander. Wenn ich es so laufen lasse, kann ich zwar Daten in die Inputfelder eingeben, aber sie werden bei Wiederaufruf de Seite nicht wieder angezeigt, obwohl bei Ausgabe des $_POST die Variablen gefüllt sind.


    Desweiteren: Beende ich die Eingabe eines Inputfeldes mit <RETURN> dann wird der Status auf Anzeige gesetzt. So weit ich es schon ermittelt habe, wird das erste Inputfeld des ersten Formulars angesprochen, und das ist der Schaltbutton mit dem der Status (so nenne ich es) auf Anzeige gesetzt wird.(damit schalte ich zwischen ANZEIGEN, SUCHEN, BEARBEITEN, NEU, SICHERN und LÖSCHEN hin und her; Diese Buttons sind Eingabefelder type= image, und da sie in einem Formular sind, rufen Sie die Seite neu auf, und ändern bei klick die $_SESSION['status'] auf anz(ANZEIGEN), suc(SUCHEN), bea(BEARBEITEN), neu(NEU - ANLGE), sic(SICHERN), loe(LÖSCHEN) .




    So und das ist mein Problem



    Habe noch zwei Screens angefügt:
    1. Oben die Statusbuttons (blau/grün/grau/rot) und darunter die Eingabefelder als Beispiel.
    2. Nach der Eingabe mit <RETURN> seht ihr das Ergebnis. Der Status ist auf Anzeigen gewechselt. Die Eingabeseite ist weg, aber das Array $_POST enthält den Wert der Eingabe im Feld Stichwort.

    Dateien

    • bild1.png

      (28,63 kB, 31 Mal heruntergeladen, zuletzt: )
    • bild2.png

      (16,49 kB, 37 Mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von willi356 ()

  • Ich sehe keinen Submit Button oO?
    Das Problem verstehe ich auch nicht.


    Aber btw:
    Du schreibst oft NULL in den "leeren Raum".

    PHP
    1. //Bsp
    2. empty($_POST['tm_datum_von'])
    3. ? $_POST['tm_datum_von'] = ""
    4. : NULL;
    5. // oder
    6. case 'no' : NULL; break;


    Weiß nicht mehr, wie man das nannte, ist aber nicht empfohlen.
    Besser wäre:

    PHP
    1. //wenn es kurz sein muss
    2. empty($_POST['tm_datum_von']) and $_POST['tm_datum_von'] = "";
    3. // oder
    4. !empty($_POST['tm_datum_von']) or $_POST['tm_datum_von'] = "";
    5. // und
    6. case 'no' : break;


    EDIT:
    wobei empty hier wieder unerwünschte Ergebnisse bringen kann!
    0, '0', NULL, '', array(), und einiges mehr sindt empty.
    Würde das hier empfehlen:

    PHP
    1. $tmDatumVon = isset($_POST['tm_datum_von']) ? $_POST['tm_datum_von'] : "";


    Und dann die var weiterhin nutzen.
    /EDIT


    Was das Ganze hier schwirig macht, ist, dass Du HTML und PHP so sehr vermischst.
    Du schreibst auch IF Bedingungen in eine Zeile. Wer soll das lesen? =)


    Funktion:

    PHP
    1. status_detail($anz='gru',$suc='bla',$bea='bla',$neu='bla',$sic_bea='gra',$sic_neu='no',$loe='rot');


    Du musst nicht die Variablen setzen, wenn Du sie später nicht benötigst.
    Die Werte in die Funktion zu schicken reicht völlig aus:

    PHP
    1. status_detail('gru', 'bla', 'bla', 'bla', 'gra', 'no','rot');


    Und wenn es mal viele Parameter sind, sollte man ein Array übergeben:

    PHP
    1. $params = array(
    2. 'gru', // anz
    3. 'bla', // suc
    4. 'bla', // bea
    5. 'bla', // neu
    6. 'gra', // sic_bea
    7. 'no', // sic_neu
    8. 'rot', // loe
    9. );
    10. status_detail($params);


    Evtl liegt hier der(?) Fehler:
    Siehe Kommentare

    PHP
    1. echo "<td> <input type="date" name="tm_datum_von" class="feldinhalt" value="".clearstring($_POST['tm_datum_von']).""></td></tr>";
    2. // echo " -- startet den String
    3. // <td> <input type="date" -- kaputt! " muss maskiert werden


    Besser:

    PHP
    1. echo '<td> <input type="date" name="tm_datum_von" class="feldinhalt" value="' . clearstring($_POST['tm_datum_von']) . '"></td></tr>';


    Ich sage (mir) immer: PHP string immer mit einfachen Anführungszeichen. HTML und JS und SQL mit doppelten.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton ()

  • @cotton: Erst mal danke für die hilfreichen Tipps.


    Angenommen und schon eingebaut. Man lernt nie aus.


    Ich das Problem nochmals versuchen zu Verdeutlichen:


    1. Form:
    Schaltbuttons für anz, suc, bea, neu, sic, loe


    2. Form:
    Formular für Eingabe der Daten.


    Obwohl die beiden Formulare hintereinander stehen, und mit </form> jeweils abgeschlossen sind, und beide auch unterschiedliche Namensbezeichnungen haben, beeinflussen Sie sich anscheinend gegenseitig.


    Wenn ich im 2, Formular Daten eingebe, dann und abschließe mit Return oder klick auf den obigen 'Status' Button, dann weis die Seite nicht von welchem Feld der Neuaufbau der Seite gestartet wurde, und findet in den Formularen als erstes Eingabefeld den Button für die Änderung auf ANSICHT. Damit wechselt die Seite dann immer automatisch auf ANSICHT und die Eingaben sind verloren.


    Test halber habe ich das erste Formular entfernt, und habe dann im zweiten Formular die Daten eingegeben. Ich habe den Wert des Arrays $_SESSION['status'] fest auf 'neu' gesetzt, damit ich nicht wieder die Ansicht bekomme. Und dann funktioniert die Dateneingabe. Die Werte bleiben durch das Attribut value im Eingabefeld erhalten.


    Nur wie bekomme ich es weg, dass sich die beiden Formulare beeinflussen?

  • Ich sehe Du hast da Images als Submit Button, oder?
    hab keine Ahnung, wie die reagieren. Evtl ist das das Problem?


    Probier mal mit nomalen "submit" Buttons

    HTML
    1. <imput type="submit" ... name="..." ...


    EDIT: lass Dir mal vom Browser den Quellcode anzeigen (wenn Seite neu aufgebaut ist - ohne Dateneingabe)
    und poste den HTML code mal.
    Oft sieht man dann eherwo der Fehler steck.

  • @cotton:


    Hab mal kopiert, und so gut es geht in Form zu bringen. War alles beim kopieren an einem Stück geschrieben. Hoffe findest dich zurecht.




    Hab rumprobiert, mal das eine Form weg, mal das andere. Dann klappt alles. Wenn ich allerdings beide Forms hintereinander schreibe, dann geht gar nix mehr. Bei Chrom Browser noch die Schaltung von anz auf neu usw. Im Firefox geht gar nix mehr.
    Du fragtest ob das mit den Input=image funktioniert, weil ähnlich wie Submit Button. Kann dir sagen, das klappt einwandfrei. Nur halt wenn nur ein Form da ist.

  • Yap, da stimmt einiges nicht:

  • @cotton


    Also bin deine Anmerkungen durchgegangen!
    bei <img> einen value und ein name zu vergeben ist natürlich Blödsinn. Ist geändert! Danke
    Aber du möchtest bei jedem Input (IMAGE) allso einen anderen name vergeben! OK dann erhälst du die Möglichkeit 6 verschiedene $_POST['...'] zu erhalten.
    Nämlich:
    $_POST['anz'] mit dem Wert "anz" wenn der Input geklickt wird.
    $_POST['suc'] mit dem Wert "suc" wenn der Input geklickt wird.
    $_POST['bea'] mit dem Wert "bea" wenn der Input geklickt wird.
    $_POST['neu'] mit dem Wert "neu" wenn der Input geklickt wird.
    $_POST['sic_bea'] mit dem Wert "sic_bea" wenn der Input geklickt wird.
    $_POST['sic_neu'] mit dem Wert "sic_neu" wenn der Input geklickt wird.
    $_POST['loe'] mit dem Wert "loe" wenn der Input geklickt wird.


    Dann muss ich auch 7 $_POST[''] abfragen ob ein Wert enthalten ist.
    Da kam mir die Idee die Input Felder alle status zu nennen, da sowieso immer nur eines geklickt wird. Danach wird die Seite neu aufgebaut, da ja Formular mit action="".
    Somit erhalte ich dann nur ein $_POST['status'], wobei die Variable die Werte anz, suc, bea, neu, sic_bea, sic_neu, loe annehmen kann. Somit brauch dann auch nur eine Variable zu prüfen, nämlich $_POST['status'] und mach es mir dadurch einfacher.


    Spricht Programmiertechnisch da was gegen?



    Die Bemerkungen zum textarea: Vielen Dank! Sind schon geändert.



    Als INFO-> nach den Änderungen hat sich nix getan. Seite wird immer noch nach auslösen des 2.Fomulars (also durch Inputfelder mit type text) auf Anzeige umgeschaltet.


    Gibt es eine Möglichkeit das anders zu Programmieren?


    Der Upload ist leider zu klein, sonst hätte ich ein Screenvideo gemacht und hochgeladen, dann kann man das Verhalten besser sehen.

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von willi356 ()

  • So langsam klingelts. Verstehe es nicht ganz, aber verstehe den Sinn hinter den "status" inputs.
    Macht Sinn.


    Probiers mal mit hidden fields.
    In jede Form ein

    HTML
    1. <input type="hidden" name="form_submitted" value="status">


    "staus" wäre hier die erste Form, denk ich.
    Mit PHP kannst Du dann mit $_POST['form_submitted'] checken, welche Form abgesandt wurde.

  • Also Hidden Inputs reingesetzt, und wenn ich wie ich hoffe den Gedanken richtig weiterverfolge möchtest du eine if Abfrage machen, die dann das eine oder das andere Formular anzeigt. Richtig?


    Wenn ich das richtig interpretiere, dann der Hinweis, es müssen immer beide Formulare angezeigt werden.


    1. Formular steht für folgenden Sachverhalt:
    Normalerweise würde man ein Menü machen mit links, würde für anz, suc, bea, neu, sic_bea, sic_neu, loe einen eigene Webseite machen, und darin dann wiederrum das jetzige 2. Formular benutzen um die Daten eingeben zu können.


    Da ich es aber möglichst kompakt halten möchte, will ich über das erste Formular einen status ermitteln indem $_SESSION['status'] umgesetzte wird.
    Dann wird in der status benutzt um zu sagen
    if
    $_SESSION['status'] = anz -> 2. Formular = Anzeige Bild
    elseif
    $_SESSION['status'] = bea -> 2. Formular = Bearbeitungs Bild
    elseif
    $_SESSION['status'] = suc -> 2. Formular = Suchmaske


    usw.


    Damit hätte ich eine kompakte Struktur mit Auswahlmöglichkeit innerhalb einer Webseite.
    Kann es auch daran liegen, das meine Entwicklungsumgebung XAMPP ist, und diese das nicht kann, und ein Webserver es richtig machen würde?




    + Apache 2.4.17
    + MariaDB 10.1.10
    + PHP 5.6.19 (VC11 X86 32bit thread safe) + PEAR
    + phpMyAdmin 4.5.1
    + OpenSSL 1.0.2d
    + ADOdb 518a
    + Mercury Mail Transport System v4.62 (nicht in der Portable Version)
    + FileZilla FTP Server 0.9.41 (nicht in der Portable Version)
    + Webalizer 2.23-04 (nicht in der Portable Version)
    + Strawberry Perl 5.16.1.1 Portable
    + Tomcat 7.0.56
    + XAMPP Control Panel Version 3.2.2 von hackattack142 (Ein großes Danke Schön!)

  • Nein nein, ich meinte, dass Du im Script besser und übersichtlicher unterscheiden kannst, welche Form gerade rein kommt.
    In etwa:

    PHP
    1. if (isset($_POST['hiddenfield_form_1'])) {
    2. // hier alles um die eingaben für form "eins" zu behandeln
    3. } elseif (isset($_POST['hiddenfield_form_2'])) {
    4. // hier alles um die eingaben für form "zwei" zu behandeln
    5. } else {
    6. // keine der beiden wurde abgesandt
    7. }


    An XAMPP liegt das glaub ich nicht.
    Es ist evtl ein Schusselfehler, vtl was simples, was man aber bei der "Kompaktheit" nicht sieht =)


    Kurze Namen/Keys und alles auf einer Zeile ist schlecht, gerade beim Fehler finden.
    Besser ist immer aussagekräftige Namen zu nutzen.


    Wenn es um die URL geht, dann kann man ja Kürzel nutzen. Also Besser "uname" statt "user_name" oder "something_too_long_for_the_url".
    Dann sollte man aber im PHP Code mit aussagekräftigen Variablen arbeiten, wie zB:

    PHP
    1. // HTML imput feld heißt zB name="tm_datum"
    2. $terminDatum = isset($_POST['tm_datum'])
    3. ? $_POST['tm_datum']
    4. : null;


    Hier am Bsp siehst Du sofort, welches Feld erwartet wird, und was damit passiert (weil auf 3 Zeilen - meiner Meinung nach übersichtlich)

  • cottton


    Soweit habe ich die Schaltung verstanden. Nur etwas ist mir nicht klar:
    Soll die <form>
    1. innerhlab des if und elseif stehen?
    2. außerhalb des if und elseif stehen? (also die <form> umklammert das if und elseif)?
    3. Soll die if und elseif vor den <form> stehen um die Weiterverarbeitung zu steuern -> also Ansicht der Daten, oder speichern der Daten, oder löschen der Daten?


    Im Falle 3. ist kar, ich stelle die Bedingung voran, und lasse die Daten anzeigen, löschen, speichern.
    Bei Fall 1. und 2. bin ich mir noch nicht so sicher wie es damit weitergeht, und wie ich damit was genau steuern kann.


    also die Kürzel der variablen gebe ich dir recht sind grundsätzlich unübersichtlich, zumindest wenn man die Kürzel nicht kennt. Ich habe mir für die Datenbank da praktisch nur eine Eselsbrücke gebaut. tm steht wie du richtig erkannt hast für Termine. Also werden Sie in der Datenbank auf dem Tabellenblatt Termine gespeichert. So haben Variablen für Kunden das Kürzel kd_xxxxx und kontakte kt_xxxxx und so weiter und so weiter. ich hätte die Namen für die Variablen auch ausschreiben können, stimmt schon, aber man ist ja faul.... Und ich geb dir recht, damit muss man sich ne ganze Menge merken.


    Bin auch deiner Meinung was die Übersichtlichkeit der Programmierung angeht. Doch mit der Zeit kann man das auch lesen, wenn es sich um relativ einfache Sachen handelt, wie oben beschrieben. So halte ich dies was oben steht eigentlich einzeilig, sollte der 1. Teil in der If Bedingung allerdings komplexer werden, so folge ich schon jetzt deinem Rat. Natürlich auch, wenn es im 2. Teil der If Bedingung komplexer wird.


    Allerdings was ich von jetzt an bedingungslos übernehmen werde, ist die $_POST etc. in eine ausgeschriebene Variable zu übernehmen wie in deinem Beispiel gezeigt. Egal ob die Variable aus einem $_POST kommt, oder aus einer Datenbank, so werde ich ab jetzt Sie immer in eine klar lesbare Variable übergeben.



    ZUM SCHUSEL-FEHLER: Kann sein, kann nicht sein, habe jetzt alles in ein Form gepackt, und es funktioniert alles !!!. ich darf nur die Eingabe der Felder nicht mit <RETURN> abschließen, dann wechselt er wieder die Ansicht auf anz, und ich bin wieder in de Ansicht der Seite.
    Hallo cottton,



    So reagiert die Programmierung, wenn ich alles in eine <form> setze.
    hab jetzt noch mal eine Screen Serie hochgeladen um die Reaktion der Seite aufzuzeigen:


    1. Startbild -> Status ist auf Anzeige. Button ANZ ist grün


    2. Auf Button 'neu' geklickt, Button NEU ist jetzt grün, ANZ ist blau. Habe die Daten eingegeben, aber noch nix geklickt.


    3. Habe auf den Button 'NEU' geklickt. Die $_POST sind gefüllt. Ich bin immer noch auf der Seite 'NEU' (Button ''NEU' ist grün).


    4. Ausgangszustand: Bin auf Seite NEU geklickt. Button 'NEU' ist grün. Die Daten sind eingegeben habe aber noch nicht <RETURN> gedrückt.


    5. <RETURN> ist gedrückt, $_POST sind gefüllt, aber ich bin jetzt auf der Ansicht. (Button anz ist grün, Button neu ist blau)



    Ein Freund meint, durch das auslösen des Formulars durch <RETURN> weiß der Browser / Apache nicht aus welchem Formular die Eingaben kommen, und reagiert dann bei dem ersten INPUT-Feld an dem er vorbeikommt, und setzt damit die $_SESSION['status'] auf 'anz'. denn dies ist das erste Inputfeld, an dem er er im Ablauf vorbei kommt.
    Also da sich keiner mehr zu diesem Thema äußert, denke ich mal das ich da wieder mal alleine durch muß.


    Schade eigentlich.

  • Sorry, aber bin gerade etwas kurz angebunden.


    Zur ersten Frage meinte ich 3. Das Steuern der abläufe wie zB Speichern, bereits eingegebenen Daten in Vars stecken und dann "unten" im Formular ausgeben.

    Vermutung:
    Du nutzt ja eine Form, um die Seite (Buttons) zu wechseln.
    Wenn Du also zB auf neuen Termin klickst, dann bekommst Du ja die 2te Form angezeigt, die die Inputfelder ausgibt.


    Wenn Du nun diese 2te Form ausfüllst und absendest,
    dann wird der Button (die Seite ) nicht mitgegeben.
    Heißt: im PHP script landest Du für Form 1 auf der ersten Seite,
    bekommst aber Daten für die (?) dritte.


    Die Lösung könnte sein, in der 2ten Form die aktuelle Seite mit zu geben.


    Das hast Du glaub ich momentan per SESSION gemacht. Da ist evtl ein Fehler drin?

  • Hi cottton:


    Also erstmal hast du mich auf eine tolle Idee gebracht:
    Deine Beschreibung von oben stimmt soweit.
    So da ich jetzt weis, von welcher Form die Eingabe kommt, habe ich das umsetzen der $_SESSION['status'] nur erlaubt, wenn die Eingabe aus dem ersten Form kommt.




    bei if($_POST['form_submitted']=="status" ) wird dies geschaltet. Das fuktioniert jetzt soweit auch schon.
    ABER!!!!:
    Wenn ich es jetzt so lasse, wird die Eingabemaske wieder aufgerufen, und die schon eingegebenen Daten bleiben auch stehen.



    ALSO: KLASSE! GENAU SO WOLLTE ICH'S JA HABEN.


    ABER die Buttons wechseln jetzt noch auf die von der Ansichtsseite.


    Also Seite die angezeigt wird ist die von NEU. Aber die Buttons die Angezeigt werden sind die von ANZ.
    Muss noch suchen warum Sie wechseln, aber dann sollte es eigentlich hinhauen.



    Und du siehst, werden die If Anweisungen komplizierter und verschachtelt, schreibe ich Sie ausführlich in mehrere Zeilen, sonst findet sich ja da keiner mehr zurecht.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von willi356 ()

  • Schön, wenn es funktioniert.


    Ich denke das größte Problem ist, dass Du ja ein eigtl schon fertiges Tool hast.
    Selbst für Dich als Ersteller wird es dann schwierig kleine Fehler zu finden.


    Wenn Du vor lauter Code nicht mehr durchsiehst, oder den Fehler einfach nicht finden kannst,
    dann (so mach ich es oft) kopiere das Projekt (Backup) und fang von vorne an.


    Soll heißen: alles raus (Grundstruktur bleibt bestehen),
    und dann Stück für Stück alles wieder zusammen bauen.


    zB die Leiste oben mit den Buttons (was ja denke ich die Nav ist) einbauen und als Content lässt Du nur den Namen ausgeben.
    Dann weißt Du, ob die Nav korrekt läuft.


    Dann Stück für Stück die Inhalte wieder einsetzen.
    Dabei findest Du evtl Gemeinsamkeiten, die man wiederverwenden kann.
    Dann ab damit in eine Funktion.


    Und die Funktion als nächstes testen.
    Hier zB die Funktion status_detail(). Machst sie in jedem Fall das, was sie soll?


    BTW: status_detail würde ich umbenennen UND die Funktion das HTML zurückgeben lassen, anstatt per echo direkt auszugeben.
    Bsp:


    Die Funktion würdest Du dann per require_once einbinden, damit sie nicht immer "im Wege steht" und/oder mehrfach kopiert wird.

  • Hey,


    was macht denn da die funktion status_detail(); ?


    Stef

    Die Funktion status_detail gibt die Icons aus! Sonst nix. Die Icons sind aber Inputfelder mit der die Variable $_POST['statsu'] gefüllt wird, und über die dann den angezeigten Inhalt der Seite Schaltet.


    Die Funktion status_detail ist weiter oben aber auch abgebildet!

  • zB die Leiste oben mit den Buttons (was ja denke ich die Nav ist) einbauen und als Content lässt Du nur den Namen ausgeben.


    Also, wenn du von Nav spricht, hast du sicher recht.
    Aber das besondere dieses Nav ist ja, das ich innerhalb einer Seite bleibe.
    Ein 'normales' Nav ruft ja andere Seiten auf. Diese nicht. Es bleibt innerhalb der selben Seite, und sorgt doch für andere Ansichten. Somit brauche ich dann nicht immer sieben php Seiten zu bearbeiten, und verbrauche somit auch nicht soviel Platz beim Provider. (Obwohl der Platz beim Provider ist heute wohl eher kein Problem mehr.)