Hello,
Um Daten in eine Datenbank zu schreiben muss ich einige Benutzereingaben mit Hochkommata versehen, damit sie als String erkannt werden. Bis jetzt mach ich das so:
...
$_POST['Kontaktdatum'] = "'".$_POST['Kontaktdatum']."'";
...
> Geht das einfacher?
Es ist nicht gesund, Postdaten, oder andere, die aus nicht vertrauenswürdiger Quelle stammen (also z.B. aus einem Request), ohne die zum SQL des DBMS passende Escapefunktion in den Querystring einzubauen.
Anders ausgedrückt: Bei Übergabe von Daten per Textschnittstelle an ein DBMS müssen diese für die Textschnittstelle vorher "kastriert" werden. Es müssen alle Inhalte, die als Befehl der Textschnittstelle missverstanden werden könnten maskiert (oder entfernt) werden. Da man die Daten selten verfremden will, fällt entfernen also weg.
Für MySQL (als Beispiel) gibt es in der API von PHP die Funktionen
mysql\_escape\_string()
<http://de3.php.net/manual/en/function.mysql-escape-string.php>
mysql\_real\_escape\_string()
<http://de3.php.net/manual/en/function.mysql-real-escape-string.php>
mysqli\_real\_escape\_string()
<http://de3.php.net/manual/en/mysqli.real-escape-string.php>
Mit einer der Funktionen müssen \_Strings\_ behandelt werden, bevor sie in das Statement eingebaut werden.
Generell unterscheidet man aber unterschiedliche Spaltentypen
Typ Escpapen mit Begrenzung
\----------------- -------------------------------- -----------------
Text (String) mysqli\_real\_escape\_string() Textbegrenzer (')
Ganzzahl intval() keine oder (')
Boolean & Co
(TRUE, FALSE, NULL) eigene Funktion keine!
usw.
Du kannst also nicht einfach ohne Kenntnis des Zieltyps (Spaltentyp der Tabelle) rein mechanisch eine Funktion über deine Eingabedaten jagen. Der Zieltyp muss beachtet werden.
Und da man ja ohnehin eine Validierung des Datensatzes vornimmt, \_bevor\_ man ihn einträgt in die Tabelle, kann man die Typprüfung und das typgerechte Escapen auch gleich an diser Stelle vornehmen.
Hier kommt Martins Einwand auch zum tragen: <https://forum.selfhtml.org/?t=198363&m=1331906> "Es ist nicht sinnvoll, die \*Daten\* zu verändern".
Baue Dir also ein Datensatz-Array auf:
$\_record\_descr = array();
$\_record\_descr['name'][$n] = 'Nachname';
$\_record\_descr['type'][$n] = 'String';
$\_record\_descr['default'][$n] = '';
$\_record\_descr['validate'][$n] = 'validation\_function\_name';
usw.
$\_record\_descr['name'][$n+1] = 'Alter';
$\_record\_descr['type'][$n+1] = 'Number';
$\_record\_descr['default'][$n+1] = 0;
$\_record\_descr['validate'][$n] = 'validation\_function\_number';
usw.
und fahre dieses Multiarray dann ab. Hole alle Daten aus den gleichnmigen Elementen des Post-Arrays. Wenn ein Wert im Postarray fehlt, entscheide, ob die Prüfung meckern muss, oder ob sie ihn einfach mit einen Default-Value füllt...
Diese Prüfung kannst Du nun beliebig kompliziert machen. Je strukturierter Du hier vorgehst, desto sicherer und integerer werden Deine Daten nachher sein/bleiben.
Die Spaltentypen kann i.d.R. auch aus dem Schema der Tabelle abfragen, sodaß Du sie nicht hart verdrahten musst. Wird dann die Tabllenstruktur einmal geändert, kann Dein Programm ganz automatisch darauf reagieren.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>