You are not logged in.

  • Login

new man

Unregistered

1

Friday, December 10th 2010, 10:21pm

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

PHP Quellcode

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

3

Saturday, December 11th 2010, 9:59am


PHP Quellcode

1
2
3
4
$vname = (isset($_POST['vorname']));
$nname = (isset($_POST['nachname']));
 
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:

PHP Quellcode

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


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

4

Saturday, December 11th 2010, 11:03am

!isset, dann kannst auch gleich empty nehmen und du prüfst sogar noch den Inhalt mit ;)

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


mfg

5

Saturday, December 11th 2010, 11:48am

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.

6

Saturday, December 11th 2010, 11:52am

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.

PHP 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.

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 !

7

Saturday, December 11th 2010, 11:55am

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

2. Ich würde das nie vermischen, immer schön die Funktion die dafür gedacht ist auch zum maskieren nehmen..



mfg

newman

Unregistered

8

Saturday, December 11th 2010, 3:25pm


PHP Quellcode

1
2
3
4
$vname = (isset($_POST['vorname']));
$nname = (isset($_POST['nachname']));
 
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:

PHP Quellcode

1
2
3
4
5
# ! ist der Negationsoperator
if(!isset($_POST['vorname']) and !isset($_POST['nachname']))
 
# Alternativ
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. :)

9

Saturday, December 11th 2010, 3:33pm

Schalte die Error Meldungen aus. Das ist interessant für Hacker ;)

10

Saturday, December 11th 2010, 3:47pm

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. ;)

newman

Unregistered

11

Saturday, December 11th 2010, 8:59pm

Quoted

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

12

Tuesday, December 14th 2010, 8:01pm

Ich erdreiste mich an dieser Stelle mal zusammenzufassen:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
 
// Quellcode
 
/* Error-Reporting*/
 //wenn alles läuft auskommentieren!
error_reporting(E_ALL);
ini_set('display_errors',1);
 
/* Datenbank - Login */
 
$db_host = "localhost";
$db_name= "test";
$db_login = "root";
$db_pass = "****";
 
/*  Datenbank - Verbindung */
 
$db = mysql_connect($db_host,$db_login,$db_pass, $db_name) ;
mysql_select_db($db_name, $db);
 
if(isset($_POST["submit"])) //Wenn das Formular abgeschieckt wurde
{
    if(isset($_POST["firstName"]) && isset($_POST["lastName"]) && !empty($_POST["firstName"]) && !empty($_POST["lastName"]))
    //Erst prüfen ob die $_POST Daten existieren und dann prüfen ob sie leer sind
    {
        /* An dieser Stelle gibt es mehrere Möglichkeiten:
        ** 1. Man schreibt ein Suchmuster das prüft, ob die eingabe gültig ist. Nachteil: in der Regel komplex und zeitaufwändig
        ** 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
        ** 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...
        */
        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)
        {
            $sql =  "INSERT INTO
		formular
		SET
		Vorname = '".$firstName[0]."',
		Nachname = '".$lastName[0]."'";
		 mysql_query($sql) or die (mysql_error()); 
        } else
        {
            echo "Daten nicht korrekt! Nur buchstaben von a-z und lehrzeichen sind zulässig!";
            exit(0);
        }
 
        if(ctype_alpha($_POST["firstName"]) && ctype_alpha($_POST["lastName"])) //Variante 2, bei Doppelnamen fehlerhaft!!!
        {
            $sql =  "INSERT INTO
		formular
		SET
		Vorname = '".$_POST["firstName"]."',
		Nachname = '".$_POST["lastName"]."'";
		 mysql_query($sql) or die (mysql_error()); 
        } else
        {
            echo "Daten nicht korrekt! Nur buchstaben von a-z sind zulässig!";
            exit(0);
        }
 
 
 
        {//Version 3 (mein persöhnlicher Favourite
            $sql =  "INSERT INTO
		formular
		SET
		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
		"Nachname = '".mysql_real_escape_string(((get_magic_quotes_gpc())?stripslashes($_POST["lastName"]):$_POST["lastName"]))."'";
		 mysql_query($sql) or die (mysql_error()); 
        }
        echo "Daten korrekt eingetragen! <a href='javascript:history.back()'>Zur&uumlck</a>";
    } else
    {
        echo "Bitte korrekte Daten eingeben"!
} else
{
    /* Formular*/
     echo '
<form action="formular.php" method="post">
Vorname:
<input type="text" name="firstName">
Nachname:
<input type="text" name="lastName">
<input type="submit" name="submit" value="ok">
</form>';
}
?>


Eigentlich selbstklärend oder?
Sonst einfach nen post....
n0x-f0x

newman

Unregistered

13

Tuesday, December 14th 2010, 8:27pm

Danke dir n0x-f0x. :)

14

Wednesday, December 15th 2010, 11:42am

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:

PHP Quellcode

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

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

PHP 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:

15

Wednesday, December 15th 2010, 4:36pm

<offtopic>
Ich kenne genug die das machen, ich arbeite auch lieber mit Klammern...

Aber wie zb bei soetwas: mysql-xy() or die() mysql-xy() || die() sollte der Unteschied dann schon klarer werden


mfg
</offtopic>

Similar threads

Social bookmarks