Bitte um Kritik: Formulareingaben in Datenbank übertragen

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

  • Bitte um Kritik: Formulareingaben in Datenbank übertragen

    Hallo liebe Codinggemeinde,

    Wir ihr vielleicht erkennen wird, bin ich ziemlich neu hier. Und ebenso bin ich ein Neuling im php.
    Da ich mich ein wenig an die Sprache heran wagen möchte, hab ich mir ein paar Tutorials durchgelesen, wenn auch mit vielen "Fragezeichen über den Kopf".

    Ich bin eher Typ, der aus Fehlern lernt, als meine Nase durchgehend in Bücher zu stecken. Und beim Basteln von Quellcodes tauchten bei mir viele Fehler auf. ;)
    Ich bin der Meinung, dass ich alle Fehler bereinigt habe. Vielleicht findet ihr dennoch parse-errors.

    Anhand des angehängten Quellcodes erkennt ihr, dass ich versuche Formulareingaben in die Datenbank zu übertragen. Ich habe es getestet und es funktioniert.
    Meine Frage an euch ist, gibt es etwas, was ich besser machen hätte können. Was vielleicht einfacher gegangen wäre. Oder ist vielleicht alles Mist, was ich zusammen gebastelt habe?
    Ich bitte euch um Kritik, damit ich besser werden kann. :) Vorschläge für Erweiterungen des Quellcodes sind ebenfalls erwünscht.

    Außerdem bitte ich euch meinen Neulingstatus zu respektieren :)

    Vielen Dank schonmal.

    newman

    Quellcode

    1. <?php
    2. // Quellcode
    3. /* Error-Reporting*/
    4. error_reporting(E_ALL);
    5. ini_set('display_errors',1);
    6. /* Datenbank - Login */
    7. $db_host = "localhost";
    8. $db_name= "test";
    9. $db_login = "root";
    10. $db_pass = "****";
    11. /* Datenbank - Verbindung */
    12. $db = mysql_connect($db_host,$db_login,$db_pass, $db_name) ;
    13. mysql_select_db($db_name, $db);
    14. /* Formular*/
    15. echo '
    16. <form action="formular.php" method="post">
    17. Vorname:
    18. <input type="text" name="vorname">
    19. Nachname:
    20. <input type="text" name="nachname">
    21. <input type="submit" value="ok">
    22. </form>';
    23. /* Variablen */
    24. $vname = (isset($_POST['vorname']));
    25. $nname = (isset($_POST['nachname']));
    26. /* Formularcode */
    27. if($vname == '' and $nname == '')
    28. {
    29. echo ' Bitte fülle erst alle Felder aus!'; // Felderüberprüfung
    30. }
    31. else
    32. {
    33. $sql = "INSERT INTO
    34. formular
    35. SET
    36. Vorname = '".$_POST['vorname']."',
    37. Nachname = '".$_POST['nachname']."'";
    38. mysql_query($sql) or die (mysql_error());
    39. }
    40. ?>
    Alles anzeigen
  • new man schrieb:


    Quellcode

    1. $vname = (isset($_POST['vorname']));
    2. $nname = (isset($_POST['nachname']));
    3. if($vname == '' and $nname == '')


    Das funktioniert zwar, ist aber nicht sonderbar logisch. isset() liefert bereits einen booleschen Wert, da ist ein Vergleich mit dem Leerstring weder notwendig noch sinnvoll. Folgende Codes sind gleichbedeutend:

    Quellcode

    1. # ! ist der Negationsoperator
    2. if(!isset($_POST['vorname']) and !isset($_POST['nachname']))
    3. # Alternativ
    4. if(!(isset($_POST['vorname']) or isset($_POST['nachname'])))


    Übrigens ist es allgemein geläufiger »&&« und »||« statt »and« und »or« zu verwenden.
  • Pion schrieb:

    Es ist geläufig && dann zu nehmen wenn man && braucht, AND dann zu nehmen wenn man AND braucht, ist ja nicht dasselbe

    Abgesehen von der Rangfolge sind die Operatoren gleich - demnach macht das hier keinen Unterschied, er wird aber öfter auf »&&« treffen. Ich halte die Verwendung von Klammern allerdings für übersichtlicher als ein Vermischen der Operatoren.
  • Da es sich um Namen handelt ist es noch einfacher das mit ctype_alpha zu prüfen, dann hast du auch gleich das MySQL-Injection "Problem" gelöst.

    Quellcode

    1. if(ctype_alpha($_POST['vorname']) && ctype_alpha($_POST['nachname'])) { ... //insert


    Du solltest dich auch an Konventionen halten und die Variablenbenennung vereinheitlichen. Ich rate dir von Anfang an, konsequent alles auf englisch zu machen (egal ob schlecht übersetzt, immernoch besser als denglisch. Im Notfall hilft leo) und entweder die Variablen CamelCase ($dbHost,$firstname,$whatElseThisIsAGreatVar) oder alles mit underscore ($db_host,$firstname,$what_else_this_is_a_great_var) zu schreiben.

    Pion schrieb:

    Es ist geläufig && dann zu nehmen wenn man && braucht, AND dann zu nehmen wenn man AND braucht, ist ja nicht dasselbe

    doch es ist dasselbe. Nicht bit Bit-Operatoren verwechseln !
  • Florian schrieb:

    new man schrieb:


    Quellcode

    1. $vname = (isset($_POST['vorname']));
    2. $nname = (isset($_POST['nachname']));
    3. if($vname == '' and $nname == '')


    Das funktioniert zwar, ist aber nicht sonderbar logisch. isset() liefert bereits einen booleschen Wert, da ist ein Vergleich mit dem Leerstring weder notwendig noch sinnvoll. Folgende Codes sind gleichbedeutend:

    Quellcode

    1. # ! ist der Negationsoperator
    2. if(!isset($_POST['vorname']) and !isset($_POST['nachname']))
    3. # Alternativ
    4. if(!(isset($_POST['vorname']) or isset($_POST['nachname'])))


    Übrigens ist es allgemein geläufiger »&&« und »||« statt »and« und »or« zu verwenden.


    Also soll ich das Variablen deklarieren weg lassen und die $_POST['var'] gleich in die If schleife per isset prüfen? Hab ich das richtig verstanden?

    Vielen Dank für die Verbesserungen ;). Leider bin ich noch nicht dazu zu kommen mir alles genau durchzulesen. Wird noch gemacht ^^.

    @vince: Ja ans English hab ich auch schon gedacht. Nur in erste Linie ging es mir darum den Quellcode zu verstehen. ;) das mit vereinheitlichen hätte ich mir für später aufgehoben.
    aber ich glaube, ich gewöhne es mir lieber jetzt an als zum schluss. :)
  • newman schrieb:

    Also soll ich das Variablen deklarieren weg lassen und die $_POST['var'] gleich in die If schleife per isset prüfen? Hab ich das richtig verstanden?

    in erster Linie ging es mir um den unnötigen Vergleich mit dem Leerstring. So sparst du dir aber auch zwei überflüssige Variablen, ja. »If Schleife« ist übrigens eine wirklich hässliche Bezeichnung. ;)
  • in erster Linie ging es mir um den unnötigen Vergleich mit dem Leerstring. So sparst du dir aber auch zwei überflüssige Variablen, ja. »If Schleife« ist übrigens eine wirklich hässliche Bezeichnung. ;)



    Stimmt. Jetzt wo du es sagt. Ist mir gar nicht aufgefallen. :) if schleife :D
  • Ich erdreiste mich an dieser Stelle mal zusammenzufassen:

    Quellcode

    1. <?php
    2. // Quellcode
    3. /* Error-Reporting*/
    4. //wenn alles läuft auskommentieren!
    5. error_reporting(E_ALL);
    6. ini_set('display_errors',1);
    7. /* Datenbank - Login */
    8. $db_host = "localhost";
    9. $db_name= "test";
    10. $db_login = "root";
    11. $db_pass = "****";
    12. /* Datenbank - Verbindung */
    13. $db = mysql_connect($db_host,$db_login,$db_pass, $db_name) ;
    14. mysql_select_db($db_name, $db);
    15. if(isset($_POST["submit"])) //Wenn das Formular abgeschieckt wurde
    16. {
    17. if(isset($_POST["firstName"]) && isset($_POST["lastName"]) && !empty($_POST["firstName"]) && !empty($_POST["lastName"]))
    18. //Erst prüfen ob die $_POST Daten existieren und dann prüfen ob sie leer sind
    19. {
    20. /* An dieser Stelle gibt es mehrere Möglichkeiten:
    21. ** 1. Man schreibt ein Suchmuster das prüft, ob die eingabe gültig ist. Nachteil: in der Regel komplex und zeitaufwändig
    22. ** 2. Man verwendet vorgefertigte Funktionen wie (oben Verlinkt) ctype_alpha. Nachteil: bei dieser Funktion darf kein Leerzeichen verwendet werden, was einen Doppelnamen nicht als gültige Eingabe zulassen würde
    23. ** 3. Man lässt die Eingabe "Escapen" was MySQL-Injection nahezu unmöglich macht. Nachteil: Bei manchen Funktionen muss man bei jeder Ausgabe der Werte das "Escapen" "rückgängig" machen...
    24. */
    25. if((preg_match("/[A-Za-z ]*/", $_POST["firstName"]), $firstName) == 1) && (preg_match("/[A-Za-z ]*/", $_POST["lastName"]), $lastName) == 1) //Einfaches Suchmuster (ACHTUNG, enthält wahrscheinlich Fehler)
    26. {
    27. $sql = "INSERT INTO
    28. formular
    29. SET
    30. Vorname = '".$firstName[0]."',
    31. Nachname = '".$lastName[0]."'";
    32. mysql_query($sql) or die (mysql_error());
    33. } else
    34. {
    35. echo "Daten nicht korrekt! Nur buchstaben von a-z und lehrzeichen sind zulässig!";
    36. exit(0);
    37. }
    38. if(ctype_alpha($_POST["firstName"]) && ctype_alpha($_POST["lastName"])) //Variante 2, bei Doppelnamen fehlerhaft!!!
    39. {
    40. $sql = "INSERT INTO
    41. formular
    42. SET
    43. Vorname = '".$_POST["firstName"]."',
    44. Nachname = '".$_POST["lastName"]."'";
    45. mysql_query($sql) or die (mysql_error());
    46. } else
    47. {
    48. echo "Daten nicht korrekt! Nur buchstaben von a-z sind zulässig!";
    49. exit(0);
    50. }
    51. {//Version 3 (mein persöhnlicher Favourite
    52. $sql = "INSERT INTO
    53. formular
    54. SET
    55. Vorname = '".mysql_real_escape_string(((get_magic_quotes_gpc())?stripslashes($_POST["firstName"]):$_POST["firstName"]))."',".//vllt. eine Klammer zu fiel aber die macht es auch nicht kaputt
    56. "Nachname = '".mysql_real_escape_string(((get_magic_quotes_gpc())?stripslashes($_POST["lastName"]):$_POST["lastName"]))."'";
    57. mysql_query($sql) or die (mysql_error());
    58. }
    59. echo "Daten korrekt eingetragen! <a href='javascript:history.back()'>Zur&uumlck</a>";
    60. } else
    61. {
    62. echo "Bitte korrekte Daten eingeben"!
    63. } else
    64. {
    65. /* Formular*/
    66. echo '
    67. <form action="formular.php" method="post">
    68. Vorname:
    69. <input type="text" name="firstName">
    70. Nachname:
    71. <input type="text" name="lastName">
    72. <input type="submit" name="submit" value="ok">
    73. </form>';
    74. }
    75. ?>
    Alles anzeigen


    Eigentlich selbstklärend oder?
    Sonst einfach nen post....
    n0x-f0x
    </nobrain>
  • Pion schrieb:

    1. Ist es nicht dasselbe, warum hat ja Florian bereits gesagt...

    ok, ich korrigiere mich, es ist das gleiche* ;)
    * wenn man Klammern setzt und/oder die Operatoren nicht vermischt


    Aber mal ganz ehrlich, wer macht denn sowas:

    Quellcode

    1. if($a AND $b || $c)...

    und auch wenn man das vermischen sollte, dann klammert man für die Lesbarkeit.

    Quellcode

    1. if(($a AND $b) || $c) == if($a && $b || $c) == if(($a && $b) || $c)


    Ansonsten hast du natürlich recht.

    ... ok, das is OT :whistling: