Vinzenz Mai: serialize-String für mySQL codieren

Beitrag lesen

Hallo dobra,

Das Problem ist jetzt, dass keine "{" und "}" in das Faeld geschrieben werden.

da für MySQL diese Zeichen keine besondere Bedeutung haben, hat MySQL auch kein Problem damit. Es speichert sie erwartungsgemäß und liefert sie erwartungsgemäß zurück:

Nehmen wir an, wir haben eine Tabelle "example" mit der Spalte "content", VARCHAR, genügend groß dimensioniert. Dann erhalte ich im Kommandozeilenclient von MySQL nach Absetzen folgender SQL-Anweisung

INSERT INTO  
    example  
(content)  
VALUES  
('{}'),  
('s{Test}xyz');

die Rückmeldung

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

Ein anschließendes

  
SELECT  
    content  
FROM  
    example

liefert das Ergebnis

content
------------
{}
s{Test}xyz

Alles völlig normal und erwartet. Wenn Dir Klammern abhanden kommen, dann kann dies zum einen bei der Datenübertragung vom Browser zu Deinem Perl-Script passieren - aber wozu gibt es das CGI-Modul?

Falls dort die Daten noch erwartungsgemäß ankommen, könnte die weitere Verarbeitung in Perl vor dem Abspeichern in der Datenbank schuld daran sein. Es könnte sein, dass die Daten wie von Dir gewünscht abgespeichert werden, und erst nach dem Auslesen während der Verarbeitung für die Ausgabe verstümmelt werden. Ob die Daten korrekt abgespeichert sind, kannst Du mit dem MySQL-Client Deiner Wahl ermitteln.

Soweit so gut, aber sowas ...

im Quelltext schaut das dann z.B. so aus:
<input type="hidden" name="ORDERDATA" value="a:10:{s:4:'zone';s:14:'AT';s:6:'anzahl';i:3;s:12:'krabatt_text';s:9:'undefined';s:13:'zahlartrabatt';d:-0.957;s:5:'total';d:35.843;s:13:'krabatt_summe';i:0;s:9:'warenwert';d:31.9;s:13:'zwischensumme';d:36.8;s:7:'versand';d:4.9;s:7:'zahlart';s:23:'Vorauskassa';}">

sowas ist Leichtsinn pur und die Vergewaltigung einer Datenbank.
Daten, die vom Browser kommen, müssen sorgsam geprüft werden - und vergiß nicht: im Prinzip kann jeder die Daten in den Hidden-Input-Feldern mit Werkzeugen wie Firebug bequem manipulieren.

Hidden Inputs sind in aller Regel keine besonders gute Idee.

Und noch viel schlechter ist die Idee, diese serialisierten Daten unstrukturiert in einem Datenbankfeld abzuspeichern. Die DB verkommt zur sequentiellen Datei (mit dem einzigen Vorteil, dass Du Dich ums Sperren nicht zu kümmern brauchst). Deine Daten sehen jedoch nach strukturierten Daten aus, die man wunderbar in unterschiedlichen Spalten (wenn nicht sogar Tabellen) speichern sollte, könnte, müsste.

Du könntest Dir Dein Konzept noch einmal durch den Kopf gehen lassen. Du kannst es mit Sicherheit sicherer und besser machen.

Freundliche Grüße

Vinzenz