Werte als String in DB schreiben
Klaus
- php
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?
Klaus
Geht das einfacher?
var_dump($_POST['Kontaktdatum']);
Ich tippe darauf, dass das bereits ein String ist.
Geht das einfacher?
Danke an Euch alle.
Hallo,
Um Daten in eine Datenbank zu schreiben muss ich einige Benutzereingaben mit Hochkommata versehen, damit sie als String erkannt werden.
die Formulierung ist ganz schlecht. Besser: SQL verlangt, dass Strings in Hochkomma (einfache Anführungszeichen) gesetzt werden.
Bis jetzt mach ich das so:
...
$_POST['Kontaktdatum'] = "'".$_POST['Kontaktdatum']."'";
...
> Geht das einfacher?
Vor allem besser. Es ist nicht sinnvoll, die \*Daten\* zu verändern, damit sie für einen bestimmten Kontext "passen", sondern die kontextspezifische Anpassung (Maskierung, Umcodierung) wird an der Stelle vorgenommen, wo die Daten in einen anderen Kontext übergehen.
Konkret hier: Die Hochkommata sollten nicht Bestandteil deiner Daten sein, sondern Bestandteil des SQL-Statements (ich habe jetzt einfach mal SQL angenommen). Bei "schulmäßiger" Aufbereitung der Daten würde in deinem Fall das Hochkomma als Bestandteil des Strings mit in der DB gespeichert. Das will man aber nicht.
So long,
Martin
--
Drei Sachen vergesse ich immer wieder: Telefonnummern, Geburtstage und ... äääh ...
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hi!
Um Daten in eine Datenbank zu schreiben muss ich einige Benutzereingaben mit Hochkommata versehen, damit sie als String erkannt werden.
Es ist nicht von Belang, wo die Daten herkommen. Das DBMS will nur ein den Regeln entsprechendes SQL-Statement haben. Und da sehen die Regeln vor, dass String-Literale in Begrenzungszeichen zu notieren sind. Weiterhin muss man diese Begrenzungszeichen gesondert notieren, wenn sie innerhalb der Daten vorkommen, sonst werden sie als Begrenzungszeichen interpretiert, was im besten Fall zu einem Syntaxfehler führt, aber auch gezielt für SQL-Injection ausgenutzt werden kann. Das ist kein SQL-spezifisches Problem, sondern tritt immer dann auf, wenn Daten und Anweisungen gemischt in einem Dokument/String notiert werden müssen. Mehr zu dieser Problematik: http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel
Lo!
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>
Hello,
kleiner Nachtrag noch:
Für die Validierung und Richtigstellung von Eingabedaten stellt PHP umfangreiche
Filterfunktionen http://de3.php.net/manual/en/book.filter.php
zur Verfügung. Man muss also diese Funktionen gar nicht unbedingt selber schreiben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg