Serialisierter String per URL-GET in DB speichern

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

bräuchte mal eure Hilfe.

Ich habe mehrere Checkboxes, die als Ergebnis ein Array ausgeben. Dieses Array habe ich serialisiert. Ergebnis (bspw.):

Code:
a:25 {i:0;s:4:"mo_8";i:1;s:4:"di_8";i:2;s:4:"mi_8";i:3;s:4:"do_8";i:4;s:4:"fr_8";i:5;s:4:"di_9";i:6;s:4:"do_9";i:7;s:5:"di_10";i:8;s:5:"do_10";i:9;s:5:"di_11";i:10;s:5:"do_11";i:11;s:5:"di_12";i:12;s:5:"do_12";i:13;s:5:"di_13";i:14;s:5:"do_13";i:15;s:5:"di_14";i:16;s:5:"do_14";i:17;s:5:"di_15";i:18;s:5:"do_15";i:19;s:5:"di_16";i:20;s:5:"do_16";i:21;s:5:"di_17";i:22;s:5:"do_17";i:23;s:5:"di_18";i:24;s:5:"do_18";}

Diesen String müsste ich zusammen mit ein paar weitere Parameter über die URL (GET) an ein PHP-Script übergeben, welches mir u.a. auch diesen String speichert.

Aktuell bekomme ich aber die folgende Fehlermeldung: "SQLSTATE[22001]: String data, right truncated:
1406 Data too long for column 'slots' at row 1"

Wie kann ich den String am besten über die URL übergeben und speichern?

LG.
 
Die Fehlermeldung kommt wohl aus deiner Datenbank, die dir sagt, dass der String zu lang ist für die Tabellenspalte, die du angelegt hast.
Entweder du machst die Tabellenspalte einfach größer, was der absolut schlechteste Ansatz wäre.
Oder du normalisierst deine Datenbank sauber, sodass du jeden einzelnen Wert in eine Tabellenspalte einspeicherst https://en.wikipedia.org/wiki/Database_normalization.
 
  • Gefällt mir
Reaktionen: up.whatever, madmax2010 und Iqra
Die Fehlermdelung ist eindeutig. Die Spalte 'slots' erlaubt weniger als 1406 Zeichen
 
  • Gefällt mir
Reaktionen: madmax2010
Mal ganz davon ab, dass ich da sql-injections sehe, oder arbeitest du mit prepared statements?
 
  • Gefällt mir
Reaktionen: DefconDev und madmax2010
Also erstmal rate ich dir von serialize in PHP dringend ab - nimm lieber json_encode, dass ist deutlich sicherer und kompakter auch noch. Zusätzlich kannst du in MySQL je nach Version den Spaltentyp json verwenden, den man per Query durchsuchen kann.

Wenn du das jetzt aber so lassen und kompakt und einfach speichern willst, kannst du das mit:

Code:
$originalData = '{"name": "value"}';
$databaseData = base64_encode(gzcompress($originalData));

$storedData = $db->fetch('...');
$loadOriginalData = gzuncompress(base64_decode($storedData));
speichern. Für die Textdaten dürfte gzcompress so 50% - 85% Kompression bringen und base64_encode nimmt dir davon wieder ein bisschen was weg. Vorteil: Den Base64-string kannst du fast überall unverändert reinschreiben.

Ich würde dir aber zu einem ECHTEN json-Feld raten. Das müsstest du dann mit rawurlencode oder base64_encode in die URL packen. Denk aber immer dran, dass Daten aus der URL im Access-Log des Servers landen, Post wäre hier besser.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: madmax2010
Zurück
Oben