:::: MENU ::::

WebDevExp

Meine Erfahrungen in der Webentwicklerwelt

Objekte serialisiert in einer MySQL Datenbank ablegen

mysql, php

Objekte serialisiert in einer MySQL Datenbank ablegen

Die Meinungen, ob man komplette Objekte ablegen sollte oder nicht, gehen sehr auseinander.
Dagegen spricht zum Beispiel, dass man nicht mehr nach Inhalten in einem Objekt suchen kann oder immer der komplette Text neugeschrieben werden muss, auch wenn man nur eine Zahl ändert. Dafür spricht auch einiges, jedenfalls geht es mir darum, dass ich heute vor einem Problem stand.

Folgendes Konstrukt habe ich serialisiert (mittels serialize), in ein utf8-unicode-ci TEXT Feld gespeichert. Nach dem auslesen beschwerte sich unserialize über ungültige Daten und mit dem Objekt war nichts mehr anzufangen.

class Address {
  /*diverse Properties, hauptsächlich Strings*/
}
class MethodSpecial extends Method {
  /*diverse andere Properties*/
}
abtract class Method {
  protected $address;
  public function setAddress(Address $address){
    $this->address = $address;
  }
}

$address = new Address(.....);
$method = new SpecialMethod(....);
$method->setAddress($address);

$string = serialize($method);

Gibt man $string mit einem einfachen echo aus, fällt auf, dass hier komische Sonderzeichen vorhanden sind, speichert man das ganze in ein TEXT Feld in einer Tabelle, werden aus diesen Zeichen Sternchen. Das unserialize schlägt fehl.

Nun gibt es zwei Ansätze, dieses Problem zu lösen:
1. base64_encode und base64_decode: einfach den String vorher kodieren und dann speichern, beim auslesen dann erst dekodieren und danach deserialisieren.
2. GLOB bzw. BLOB statt TEXT als Feldtyp nutzen (nicht von mir getestet, der Tip wurde mit von einem Bekannten gegeben)

3 Comments

Leave a comment

Loading Facebook Comments ...