Gleiches Formular aus zwei Arten erreichen

elbino

Grünschnabel
Guten Morgen alle zusammen,

ich hab da ein kleines Problem. Und zwar möchte ich ein Formular von zwei Seiten aus erreichen. Einmal muss ich aus einer bestehenden Tabelle von Daten (Abfrageergebnis) einen Datensatz wählen können, um diesen im genannten Formular zu bearbeiten. Und dann muss das Formular auch noch über einen Button "Neuer Datensatz" zu erreichen sein. Wichtig dabei: Wenn ich über "Neuer Datensatz" gehe, dann soll zwar ein neuer Datensatz angelegt werden, dieser soll jedoch erst in der Datenbank gespeichert werden, wenn alle erforderlichen Daten eingetragen wurden und der Button "Speichern" gedrückt wurde.

Ich denke mal, dass ich dafür nicht zweimal das gleiche Formular hinterlegen muss, oder? Müsste doch gehen, dass man dieses einmal mit und einmal ohne vorgefüllte Daten verwenden kann.

Für jede Hilfe bin ich sehr dankbar!

Viele Grüße,
Thomas

EDIT: Hups, sorry für den Tippfehler im Betreff!
 
Du kannst das selbe Formular, jedoch nicht die selbe Verarbeitung benutzen. Folgendes fällt mir spontan ein:

1) Du übergibst dem Formular die ID des zu ändernden Datensatzes, für einen neuen Datensatz lässt du diese weg.
2) Du definierst für jedes Formularfeld eine Variable mit leerem Inhalt.
3) Du lädst den Datensatz mit der übergebenen ID (falls vorhanden) und überschreibst die zuvor definierten Variablen entsprechend.
4) Du passt die Action des Formulars an (z.B. insert.php für einen neuen Datensatz oder update.php für einen bestehenden Datensatz - kann natürlich auch ein Script sein, das nach Existenz eines Datensatzes mit einer übergebenen ID prüft)
5) Die Formularfelder erhalten als Standardwerte die Werte der Variablen.
 
Mh, kannste alled in einer einzigen datei sogar abhandeln... brauchst nur ein paar IF-Abfragen, eine While-Schleife, ein paar SQL-Abfragen und GET sowie POST Parameter... Fertig iss der gemische Salat. Ich schreib dir ma, wie ich ungefähr vorgehen würde... Das iss aber nur eine Grundidee, und nicht fertig, nur die wichtigsten Stellen gebe ich weitere Tipps/Denkanstöße, aber keine wirklich tiefergreifenden Infos. Schlichtweg aus dem Grunde, weil das Basiswissen ist.


Dateiname: script.php


Normaler Aufruf der Datei:
- Liste alle Elemente aus der Datenbank auf

Lösung: MySQL-Query + While-Schleife (MySQL-Query würd ich immer auf ne gewisse Anzahl an abfragen limitieren). In der While-Schleife gibst du die Datensätze aus und packst zu jedem Datensatz einen Link mit der Datensatz-ID. Der könnte so aussehen:

Code:
<a href="script.php?action=edit&id=1">Editieren</a>
- Am Ende der Liste soll ein Button "Neuer Datensatz" erscheinen.
Lösung: Gib hinter der While-Schleife einfach:
PHP:
while(...) {
     ...
}

echo '<form action="script.php" method="post">
      <input type="submit" name="new_data" value="Neuer Datensatz" />
      </form>
      ';


Seitenaufruf für Datensatz editieren:
- hole Daten aus der Datenbank, stelle das Formular dar und fülle das Formular mit Bestandsdaten

Lösung: Checken, ob GET-Parameter vorhanden sind:

PHP:
...
if(!empty($_GET['id']) && $_GET['action'] == edit):
     ...sql-anweisung-daten-holen;
     ...formular darstellen;
     printFormular();
else:
      echo 'Kein Datensatz angegeben!';
endif;
...


Seitenaufruf für neuen Datensatz:
- checke, ob neuer datensatz erstellt werden soll
- checke, ob schon ein neuer Datensatz zum speichern übergeben wurde
- stelle formular dar


Lösung: Checke, ob $_POST['new_data'] nicht leer ist (ich selbst hab oft probleme mit isset();, nehme stattdessen immer !empty(); ). $_POST['new_data'] ist der Name für den "Neuer Datensatz" button!

PHP:
...
if(!empty($_POST['new_data']) && $_GET['action'] == save):
     ...checken-ob-nötige-daten-vorhanden;
     ...sql-anweisung-daten-schreiben;
     ...message-ausgeben-ob-speichern-erfolgreich;
elseif(!empty($_POST['new_data']) && $_GET['action'] != save):
     ...nur-formular-darstellen;
     printFormular();
endif;
...


Was wird noch benötigt?
- Das Formular an sich.

PHP:
function printFormular()
{
     global $data;
     echo ' ...
          Data 1:<br/>
          <input type="text" value="'.$data['data1'].'" name="data1" class="bla" />
          ...';
}



So könnte es dann also innerhalb einer einzigen Datei aussehen:

PHP:
//___Formular in einer Funktion______
function printFormular()
{
     global $data;
     echo ' ...
          Data 1:<br/>
          <input type="text" value="'.$data['data1'].'" name="data1" class="bla" />
          ...';
}

//___Soll ein Datensatz editiert werden?_______
if($_GET['action'] == edit):
     if(!empty($_GET['id'])):
          ...sql-anweisung-daten-holen;
          ...formular darstellen;
     printFormular();
     else:
          echo 'keine ID übergeben!';
     endif;

//___Falls Neuer Datensatz geschrieben werden soll______
elseif(!empty($_POST['new_data'])):
     //___Checken, ob Formular schon gesendet wurde______
     if($_GET['action'] == save):
          ...checken-ob-nötige-daten-vorhanden;
          ...sql-anweisung-daten-schreiben;
          ...message-ausgeben-ob-speichern-erfolgreich;
     //___Wenn Formular nicht gesendet wurde______
     else:
          //___Falls Neuer Datensatz erstellt werden soll aber keine Daten übergeben wurden
          printFormular();
     endif;

//___Falls weder editiert noch neuer Datensatz hinzugefügt werden soll_______
else:
     while(...) {
          ...datensätze ausgeben...<a href="script.php?action=edit&id='.$data['id'].'">Editieren</a>
     }
     
     echo '<form action="script.php" method="post">
           <input type="submit" name="new_data" value="Neuer Datensatz" />
           </form>
     ';
endif;
 
Wow, vielen vielen Dank Also das war mal hilfreich. :) Ich denke, jetzt komm ich klar, zumal ich das alles ja nur beispielhaft beschreiben muss. Dann mach ich mich mal ans Werk. Danke schön noch mal!

Liebe Grüße,
Thomas
 
joh, kein problem, ich hoff nur dasses hilft hehe :D ich geb keine garantie, dass meine Beispiele oben so funktionieren, iss ja nich getestet^^ aber so in der Art und Weise könnt mans mache denk ich ma...

Viel Spass damit ;)
 
Zurück