Formulardatenbank - wie realisieren?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Formulardatenbank - wie realisieren?

    Hallo zusammen,

    was ich mit dem Titel meine ist folgendes:

    Alle meine Formulare sind in einer Datenbank abgespeichert. Eine Datenbankstrucktur habe ich mir bsiher so überlegt:

    Datenbank 1 "formulare":

    id | name | empfaenger_type | empfaenger | aktiv | login

    Datenbank 2 "formular_felder":

    id | formular_id | anzeige_name | pflicht | type | laenge | value

    Die Datenbank wird vorallem auf der seite "[...]/formular.php" gebraucht, da hier eine auflistung aller Formulare angezeigt wird:
    Wenn aktiv = 1 und login = 1 und man eingeloggt (oder login = 0 gehts auch ohne eingeloggt sein) ist, dann wird das Formular mit dessen Namen und einem Link zu "[...]/formular.php?id=$id" angezeigt.
    Klickt man auf den Link, wird das Formular angezeigt.

    Wenn es noch nicht abgeschickt wurde, steht es "ganz normal" da, und wird folgendermaßen aus der datenbank abgerufen:
    Es werden alle Zeilen mit dem Inhalt $_GET['id'] bei formular_id gesucht, und mit einer while-schleife dann wiedergegeben.
    Type steht hierfür, was es ist: Ein textfeld, radio-felder, checkboxen, textarea's oder auswahllisten. (Bei radio-felder und auswahllisten stehen die angezeigten elemente dafür in der spalte value).

    Das ist imer vergleich jetzt eigentlich noch relativ einfach, ebenso wie empfaenger_type (ob per E-Mail, private nachricht, o. ä.) zuzuordnen.

    Das Problem ist jetzt, wie ich das hinbekomme, dass dann jedes feld einen eigenen namen erhält und diese dann nach dem versenden auf ihren Inhalt (bei pflicht = 1 muss etwas angegeben sein) überprüft werden.

    Kann mir jemand sagen, wie sowas "leicht" zu realisieren ist? Hat schonmal jemand so nen Code gemacht?

    Danke schonmal

    LG

    Fipsi
  • Es gibt verschiedene Arten der Feldvalidierung. Zum Einen kannst Du das Clientseitig lösen (bei Dir im Browser) per Java Script zum anderen Serverseitig durch PHP.
    Ich empfehle Dir das per PHP zu machen. Beim Versenden des Formulars würde ich einfach einen Selbstaufruf dürchführen (mit $_SERVER['PHP_SELF'] bekommst Du den Namen der aktuellen Datei, die Du beim Submit aufrufen kannst).

    Und dann überprüfst Du ob alles wie gewünscht gesetzt ist.

    Ein kleines Beispiel:

    Quellcode

    1. if (empty($_POST['vorname']) || empty($_POST['name']) || empty($_POST['beschreibung'])) {
    2. echo "Bitte alle Felder ausfüllen.";
    3. } else {
    4. $sql = sprintf("
    5. INSERT INTO
    6. benutzer (vorname, name, beschreibung)
    7. VALUES
    8. ('%s', '%s', '%s')",
    9. mysql_real_escape_string($_POST['vorname']),
    10. mysql_real_escape_string($_POST['name']),
    11. mysql_real_escape_string($_POST['beschreibung'])
    12. );
    13. mysql_query($sql);
    14. echo "Vielen Dank!!";
    15. }
    Alles anzeigen
  • Sorry war etwas spät gestern und da habe ich einiges überlesen :) Hier aber nun Deine Lösung.

    Hmm Du solltest Deine Datenbank echt anders anordnen und auch normalisieren. Aber ich hab mal ein PHP-Script für Deine Zwecke gebaut.
    So in etwa sollte es aussehen:

    Quellcode

    1. <?php
    2. $db = new mysqli('localhost', 'Benutzer', 'Passwort', 'Datenbankname');
    3. // Select des Formulars
    4. $stmt = $db->prepare("SELECT form_id, name, login FROM php.formulare WHERE name='public' && aktiv='1';");
    5. $stmt->execute();
    6. $stmt->bind_result($form_id, $form_name, $form_login);
    7. $stmt->fetch();
    8. $stmt->close();
    9. // Select der Formular-Felder
    10. $stmt = $db->prepare("SELECT anzeige_name, pflicht, type, value FROM php.formular_felder WHERE formular_id='" . $form_id . "'");
    11. $stmt->execute();
    12. $stmt->bind_result($feld_name, $feld_pflicht, $feld_type, $feld_value);
    13. // Wenn die Requestmethode === Post ist, dann ist die validierung bisher okay
    14. // Sonst nicht
    15. if ($_SERVER['REQUEST_METHOD'] === "POST") {
    16. $validateOkay = true;
    17. }else {
    18. $validateOkay = false;
    19. }
    20. // Formulargrundgerüst aufbauen
    21. $formular = '<form method="post" action="' . $_SERVER['PHP_SELF'] . '">';
    22. // Solange es Felder in der Datenbank gibt
    23. while ($stmt->fetch()) {
    24. // Wenn das Feld als Pflichtfeld markiert ist und es im POST keinen Wert gibt
    25. if ($feld_pflicht === 1 && empty($_POST[$feld_name])){
    26. // Dann ist die Validierung nicht okay
    27. $validateOkay = false;
    28. // Wenn das Formular grundsätzlich schon einmal abgeschickt wurde
    29. // wird davon ausgegangen, dass der Benutzer das Feld übersehen hat
    30. if ($_SERVER['REQUEST_METHOD'] === "POST") {
    31. // Füge dem Formular eine Fehlermeldung hinzu
    32. $formular .= "<b>Bitte füllen Sie das Feld $feld_name aus</b><br />";
    33. }
    34. }
    35. // Erstelle das Formularfeld aus dem Datenbankresult
    36. $formular .= $feld_name . ' <input type="' . $feld_type . '" name="' . $feld_name . '"';
    37. // Wenn der POST-Wert des Feldes nicht leer ist, dann wurde es bereits ausgefüllt
    38. // in diesem Fall wird der Wert übernommen und muss nicht noch einmal ausgefüllt werden
    39. if (!empty($_POST[$feld_name])){
    40. $formular .= ' value="' . $_POST[$feld_name] . '"><br /><br />';
    41. // Wenn er noch nicht ausgefüllt wurde gibt es keinen value-Wert im Formular
    42. }else {
    43. $formular .= '><br /><br />';
    44. }
    45. }
    46. // Das abschließende Formular
    47. $formular .= '<input type="submit" name="Button" value="Abschicken"></form>';
    48. // Wenn die Validierung nicht erfolgreich war
    49. if ($validateOkay === false){
    50. // Zeige das Formular an
    51. echo $formular;
    52. // Wenn es erfolgreich war
    53. } elseif ($validateOkay === true){
    54. // TODO Insert-Logik
    55. // Und nett winken :)
    56. echo 'Vielen Dank! <3';
    57. }
    58. ?>
    Alles anzeigen


    Ich denke das sollte alle elementaren Wünsche abdecken ;)

    Grüße
    Heppner
  • Also ich hab jetzt das Formular selber samt Datenbank eigentlich fertig, ein Formular steht bereits in der db, udn wird Problemlos angezeigt.

    Der Code:

    Quellcode

    1. $id = $_GET['id'];
    2. if (!empty($id))
    3. {
    4. // Select des Formulars
    5. $stmt = $mysqli->prepare("SELECT form_id, name, login, empfaenger_type, empfaenger FROM formulare WHERE form_id=? && aktiv='1'");
    6. $stmt->bind_param('i', $mysqli->real_escape_string($id));
    7. $stmt->execute();
    8. $stmt->bind_result($form_id, $form_name, $form_login, $from_empfaenger, $from_empfaenger_type);
    9. $stmt->fetch();
    10. $stmt->close();
    11. // Wenn das Formular existiert,
    12. // man, wenn nötig eingeloggt ist
    13. // und es aktiv ist,
    14. // dann werden die Felder gesucht
    15. if ((isset($form_id))&&((($form_login == 1)&&($_SESSEION['eingeloggt'] == 1))||($form_login == 0)))
    16. {
    17. // Select der Formular-Felder
    18. $stmt = $mysqli->prepare("SELECT id, anzeige_name, pflicht, type, value, laenge FROM formular_felder WHERE form_id=?");
    19. $stmt->bind_param('i', $mysqli->real_escape_string($form_id));
    20. $stmt->execute();
    21. $stmt->bind_result($feld_id, $feld_name, $feld_pflicht, $feld_type, $feld_value, $feld_laenge);
    22. // Wenn die Requestmethode === Post ist, dann ist die validierung bisher okay
    23. // Sonst nicht
    24. if ($_SERVER['REQUEST_METHOD'] === "POST")
    25. {
    26. $validateOkay = true;
    27. }
    28. else
    29. {
    30. $validateOkay = false;
    31. }
    32. // Formulargrundgerüst aufbauen
    33. $formular = "<form method=\"post\" action=\"\">";
    34. $formular .= "<table width=\"100%\">\n";
    35. // Solange es Felder in der Datenbank gibt
    36. while ($stmt->fetch())
    37. {
    38. // Nach dem Feldtyp suchen und überprüfen, ob die Eingaben in Ordnung sind
    39. switch ($feld_type)
    40. {
    41. case "1":
    42. $feld_id = text_input_check($_POST['feld_id']);
    43. break;
    44. case "2":
    45. $feld_id = email_input_check($_POST['feld_id']);
    46. if(($feld_id == FALSE)&&(!empty($feld_id))&&($_SERVER['REQUEST_METHOD'] === "POST"))
    47. {
    48. $validateOkay = false;
    49. $error_text .= "<b>Bitte füllen Sie das Feld \"".$feld_name."\" mit einer korrekten E-Mail-Adresse aus.</b><br />";
    50. }
    51. break;
    52. case "3":
    53. $feld_id = text_input_check($_POST['feld_id']);
    54. break;
    55. }
    56. // Überprüfen, ob Pflichtfelder leer sind
    57. if ($feld_pflicht == 1 && empty($_POST[$feld_id]))
    58. {
    59. // Dann ist die Validierung nicht okay
    60. $validateOkay = false;
    61. // Wenn das Formular grundsätzlich schon einmal abgeschickt wurde
    62. // wird davon ausgegangen, dass der Benutzer das Feld übersehen hat
    63. if ($_SERVER['REQUEST_METHOD'] === "POST")
    64. {
    65. // Füge dem Formular eine Fehlermeldung hinzu
    66. $error_text .= "<b>Bitte füllen Sie das Feld \"".$feld_name."\" aus</b><br />";
    67. }
    68. }
    69. // Erstelle das Formularfeld aus dem Datenbankresult
    70. $formular .= "<tr><td>".$feld_name;
    71. if ($feld_pflicht == 1)
    72. {
    73. $formular .= "*";
    74. }
    75. $formular .= "</td>\n";
    76. $formular .= "<td>";
    77. // Typabhängig die Felder erstellen
    78. switch ($feld_type)
    79. {
    80. case "1":
    81. $formular .= "<input type=\"text\" maxlenght=\"".$feld_laenge."\" name=\"".$feld_id."\"";
    82. // Wenn er noch nicht ausgefüllt wurde gibt es keinen value-Wert im Formular
    83. if (!empty($_POST[$feld_name]))
    84. {
    85. $formular .= " value=\"".$_POST[$feld_id]."\">";
    86. }
    87. else
    88. {
    89. $formular .= ">";
    90. }
    91. break;
    92. case "2";
    93. $formular .= "<input type=\"text\" maxlenght=\"".$feld_laenge."\" name=\"".$feld_id."\"";
    94. // Wenn er noch nicht ausgefüllt wurde gibt es keinen value-Wert im Formular
    95. if (!empty($_POST[$feld_name]))
    96. {
    97. $formular .= " value=\"".$_POST[$feld_id]."\">";
    98. }
    99. else
    100. {
    101. $formular .= ">";
    102. }
    103. break;
    104. case "3":
    105. $formular .= "<textarea name=\"".$feld_id."\" maxlenght=\"".$feld_laenge."\" rows=\"10\" cols=\"50\">";
    106. // Wenn er noch nicht ausgefüllt wurde gibt es keinen value-Wert im Formular
    107. if (!empty($_POST[$feld_name]))
    108. {
    109. $formular .= $feld_id;
    110. }
    111. $formular .= "</textarea>";
    112. break;
    113. }
    114. $formular .= "</td></tr>\n";
    115. }
    116. // Das abschließende Formular
    117. $formular .= "<tr><td><input type=\"hidden\" name=\"send\" value=\"1\"></td>\n<td>";
    118. $formular .= "<input type=\"submit\" value=\"Abschicken\"></td></tr>\n</table>\n</form>\n";
    119. // Wenn die Validierung nicht erfolgreich war
    120. if ($validateOkay === true)
    121. {
    122. $ip = $_SERVER['REMOTE_ADDR'];
    123. $datum = date("d.m.Y");
    124. $zeit = date("H:i:s");
    125. switch ($form_empfaenger_type)
    126. {
    127. // E-Mail versenden
    128. case "1":
    129. break;
    130. // PN versenden
    131. case "2":
    132. break;
    133. // In Datenbank eintragen
    134. case "3":
    135. break;
    136. }
    137. }
    138. else
    139. {
    140. $seiten_inhalt = "<center>".$error_text."</center><br /><br />\n".$formular."<div id=\"groese_10\">* = Pflichtfeld</div><br /><div id=\"rechts\"><a href=\"".ROOT_PATH.$_SERVER['PHP_SELF']."\">Zurück zur Formularliste</a></div>";
    141. }
    142. $stmt->close();
    143. $seitentitel = $form_name;
    144. $tab_titel = $form_name;
    145. }
    146. else
    147. {
    148. $seiten_inhalt .= "<center>Entschuldigung, aber dieses Formular existiert nicht.<br /><a href=\"".ROOT_PATH."formular.php\">Klicken Sie hier, um zur Formularliste zurück zu kehren,</a><br /><a href=\"".ROOT_PATH."\">oder klicken Sie hier, zum zur Startseite zurück zu kehren.</a></center>";
    149. $seitentitel = "Fehler: Formular existiert nicht";
    150. $tab_titel = "Fehler: Formular existiert nicht";
    151. }
    152. }
    153. else
    154. {
    155. $seiten_inhalt = "<center>Bitte wählen Sie ein Formular:<br /><br /><ul>\n";
    156. // Liste aller aktiven Formulare laden
    157. $abfrage = $mysqli->query("SELECT form_id, name, login FROM formulare WHERE aktiv = '1'");
    158. while ($result = $abfrage->fetch_object())
    159. {
    160. if(($result->login == 0)||(($result->login == 1)&&($_SESSION['eingeloggt'] == TRUE)))
    161. {
    162. $seiten_inhalt .= "<li><a href=\"".ROOT_PATH."formular.php?id=".$result->form_id."\">".$result->name."</a></li>\n";
    163. }
    164. }
    165. $seiten_inhalt .= "<li><a href=\"".ROOT_PATH."formular.php?type=bug\">Fehler melden</a></li>\n";
    166. $seiten_inhalt .= "</ul></center>";
    167. $seitentitel = "Formulare";
    168. $tab_titel = "Formulare";
    169. }
    Alles anzeigen


    Alledings weiß ich jetzt nicht, wie ich das mit den Formularfelder auswerten machen soll. Es haben ja alle felder ne eigene Variable und keinen Array.
    Kann mir jemand sagen, wie das am geschicktesten geht?
  • Du kannst auch so ein Array über html aufbauen:

    <input type="text" name="values[test]" />

    Würde in PHP erzeugen: $_POST["values"]["test"]

    Ansonsten kannst du auch folgendes machen:
    $varName = "test";
    echo $_POST[$varName];

    ..
    Naja und dann gehst du eben alle durch, oder hab ich dich falsch verstanden?
    Jan Thurau
    Software and Systems Engineer
    janthurau.de

    [IMG:http://www.pageheroes.com/media/image/pageheroes_logo.png] - We get your page working!
  • du hast es richtig verstanden
    Ich habe deine vorschläge auch verstanden, glaube ich zumindest, aber da ich nciht weiß, wieviel felder, und deren namen mir ja auch unbekannt sind, ich habe, hab ich mir überlegt, ob nicht gleich der Text "zusammen" gesetzt werden soll.

    Sieht dann so aus:

    Quellcode

    1. if ($validateOkay == TRUE)
    2. {
    3. $nachircht_text .= $feld_name.": ".$_POST['feld_id']."\r\n";
    4. }


    Ich habe das einfach in die while-Schleife mit eingebaut.
    Ich bin noch nicht zum testen gekommen, aber das sollte so funktionieren, oder?