Aufzählungszeichen in Object serialisieren

südpol

Erfahrenes Mitglied
Hi,

ich stehe ich hier gerade vor einem Problem für das mir keine Lösung einfallen möchte. Ich importieren via phpexcel ein Excel Sheet. In diesem xlsx können natürlich auch Sonderzeichen wie z. B. BulletPoints vorkommen:
"• Requires reviews of IT service(...)"
Diese zeichen werden in html auch schön angezeigt und wenn ich die Daten nach dem Import direkt in die Datenbank schreibe, dann funktioniert sogar das ohne Probleme. Ich muss nun aber die Daten in einem Fall zuerst anzeigen bevor diese in die Datenbank gehen. Zu diesem Zweck habe ich die Daten in ein Objekt geladen und dieses dann serialisiert und danach noch base64 encodiert - damit kann ich das gesamte Object mit nur einer $_POST Variablen durch die Gegend schupsen. Habe ich allerdings ein Sonderzeichen wie den Bullet Punkt in diesem Objekt, dann scheitert der unserialize Befehl des Objekt's. :( Hat jemand eine Idee wie ich das umgehen kann ohne die Bullet Punkte löschen zu müssen?

LG
 
Du könntest mal versuchen [phpf]htmlentities[/phpf] vorher darauf anzuwenden oder auch [phpf]json_encode[/phpf] anstatt [phpf]unserialize[/phpf] zu nutzen.

Es könnte daran liegen, dass bei dir [phpf]serialize[/phpf] nicht korrekt mit Multibytestrings umgehen kann (welche PHP-Version nutzt du?).
Siehe auch hier: http://stackoverflow.com/a/2853670/603003
 
Danke. Da die Ausgabe aus der DB u. a. auch wieder in ein Excel sein soll, würde ich die Verwendung von htmlentities() gerne vermeiden. Ich habe etwas mit json_encode() gespielt - dies scheint von der Funktion her alles zu bieten, was ich brauche. Allerdings scheitere ich daran das Objekt wieder sauber zurück zu bekommen. Wenn ich z. B. folgendes versuche:
PHP:
<?php

function SerialiseObject($obj) {
	return base64_encode(json_encode($obj));
}

function UnserialiseObject($obj) {
	return json_decode(base64_decode($obj));
}


class testobject {
	public $test;
	
	public function myTest() {
		echo $this->test;
	}
}

$obj = new testobject();
$obj->test = "My Test Text";


$string = SerialiseObject($obj);

unset($obj);

$obj = UnserialiseObject($string);

$obj->myTest();



?>

Dann findet er bei dem neuen Object die Funktion myTest() nicht. Gibt es da einen Trick wie ich das Objekt in "mein" Objekt zurück verwandle und nicht in eine stdClass Object?

P. S. PHP Version ist 5.2
 
Zuletzt bearbeitet:
In diesem Fall ist für die Kodierung in JSON und wieder zurück ungeeignet, da PHP keinerlei Informationen darüber speichert, welchen Typ ein Objekt hat.
 
Du kannst es aber über einen Trick regeln:

PHP:
<?php

function SerialiseObject($obj) {
    return base64_encode(json_encode($obj));
}

function UnserialiseObject($obj) {
    return json_decode(base64_decode($obj));
}


class testobject {
    public $test;
    
    public function myTest() {
        echo $this->test;
    }
    
    public static function unserialize($string)
    {
      $result = new self;
      foreach(json_decode(base64_decode($string)) as $property => $value)
      {
        $result->$property = $value;
      }
      
      return $result;
    }
    
    
    public function serialize()
    {
      return base64_encode(json_encode($this));
    }
}

$obj = new testobject();
$obj->test = "My Test Text";


// $string = SerialiseObject($obj);
$string = $obj->serialize();

unset($obj);

//$obj = UnserialiseObject($string);

$obj = testobject::unserialize($string);

$obj->myTest();



?>
 
Man kann auch gleich das Interface Serializable implementieren:
PHP:
class testobject implements Serializable
{
  public $test;
  
  public function myTest()
  {
    echo $this->test;
  }
  public function serialize()
  {
    $data = get_object_vars($this);
    return base64_encode( json_encode($data) );
  }
  public function unserialize($ser)
  {
    $data = json_decode( base64_decode($ser) );
    foreach ( $data as $prop => $val )
    {
      $this->{$prop} = $val;
    }
  }
}

$obj = new testobject();
$obj->test = "My Test Text";

$ser = serialize($obj);
var_dump($ser);

$obj2 = unserialize($ser);
$obj->myTest();
 
Zuletzt bearbeitet:
Hi,

damit wäre ich dann aber wieder beim ursprünglichen Problem: Objekte die unicode chars enthalten können mit serialize und unserialize nicht sauber verarbeitet werden ohne die entsprechenden chars zu ersetzen (was ich nicht möchte, da die Anwendung z. B. auch japanisch unterstützen soll). Damit bleibt mir vermutlich nur die Möglichkeit ein export und import Interface für mein Objekt zu implementieren welches die Daten als "normales" array zurück liefert und damit via json serialisiert werden kann, richtig?
 
Dann eben so:
PHP:
class testobject implements Serializable
{
  public $test;
  
  public function myTest ()
  {
    echo $this->test;
  }
  public function serialize ()
  {
    $data = get_object_vars($this);
    return base64_encode( json_encode($data) );
  }
  public function unserialize ($ser)
  {
    $data = json_decode( base64_decode($ser) );
    foreach ( $data as $prop => $val )
    {
      $this->{$prop} = $val;
    }
  }
}

$obj = new testobject();
$obj->test = 'My Test Text';

$ser = serialize($obj);
var_dump($ser);

$obj2 = unserialize($ser);
$obj->myTest();
 
Was ist denn an meiner Variante nicht in Ordnung? Ich habe kein serialize() bzw. unserialize() verwendet. Hier noch mal ein Beispiel, das es direkt funktioniert:

PHP:
<?php
class testobject {
    public $test;
    
    public function myTest() {
        echo $this->test;
    }
    
    public static function unserialize($string)
    {
      $result = new self;
      foreach(json_decode(base64_decode($string)) as $property => $value)
      {
        $result->$property = $value;
      }
      
      return $result;
    }
    
    
    public function serialize()
    {
      return base64_encode(json_encode($this));
    }
}

$obj = new testobject();
$obj->test = "??????????????";


$string = $obj->serialize();

unset($obj);

$obj = testobject::unserialize($string);

$obj->myTest();
?>
 
Hi,

beide Funktionen "lösen" das von mir vermeintlich identifizierte Problem. Den Vorschlag von "einfach nur crack" hatte ich zwischenzeitlich schon selbst implemeniert. Mit meinem Test-Objekt geht das auch alles wie es soll - in meinem Hauptprogram aber nicht :(

Ich habe jetzt in meinem Hauptprogram mal var_dumps an allen Stellen der Kette implementiert. Bei genauem Betrachten zeigt sich dabei, dass das Problem beim Übertragen der Daten via POST entstehen muss:

Mein base64 string zum Zeitpunkt als er in das Formular geschrieben wird:
Code:
string(800) "eyJJRCI6IiIsIlJlcXVpcmVtZW50IjoiXHUyMDIyIFJlcXVpcmVzIHJldmlld3Mgb2YgSVQgc2VydmljZSBkZWxpdmVyeSBhZ2FpbnN0IGVxdWl0YWJsZSBhbmQgZW5mb3JjZWFibGUgU0xBczxiciBcLz48YnIgXC8+XG5cdTIwMjIgTW9uaXRvcnMgZGV2aWF0aW9ucyBpbiB0ZXJtcyBvZiBjb3N0LCB0aW1pbmcgYW5kIGZ1bmN0aW9uYWxpdHkiLCJBdWRpdG9yQWR2aWNlIjpudWxsLCJFUk1JRCI6bnVsbCwiQXVkaXREZXB0aElEIjoyMCwiSW5zZXJ0SUQiOiI0NTYiLCJJbnNlcnREYXRlIjoxMzMzNDU3NDc2LCJBcHByb3ZlcklEIjpudWxsLCJBcHByb3ZhbERhdGUiOm51bGwsIlNvcnRPcmRlciI6bnVsbCwia2V5d29yZHMiOlsiMiJdLCJrZXl3b3Jkc19vYmoiOltdLCJvYmplY3RpdmVzIjpbIjM5MSJdLCJvYmplY3RpdmVzX29iaiI6W10sImNsaWVudHMiOlsiMSJdLCJQcm9qZWN0SUQiOiIiLCJQQV9JRCI6IiIsIlBBX05hbWUiOiIiLCJQQVNfSUQiOiIiLCJQQVNfTmFtZSI6IiIsIlBfb2JqZWN0aXZlIjoiIiwiUF9vYmplY2l0dmVfTmFtZSI6IiIsIldoYXQyRG8iOiJOIiwiS2V5d29yZElkU3RyaW5nIjoiIiwiT2JqZWN0aXZlSWRTdHJpbmciOiIifQ=="

und dann der String wie er auf der anderen Seite ankommt:

Code:
string(800) "eyJJRCI6IiIsIlJlcXVpcmVtZW50IjoiXHUyMDIyIFJlcXVpcmVzIHJldmlld3Mgb2YgSVQgc2VydmljZSBkZWxpdmVyeSBhZ2FpbnN0IGVxdWl0YWJsZSBhbmQgZW5mb3JjZWFibGUgU0xBczxiciBcLz48YnIgXC8 XG5cdTIwMjIgTW9uaXRvcnMgZGV2aWF0aW9ucyBpbiB0ZXJtcyBvZiBjb3N0LCB0aW1pbmcgYW5kIGZ1bmN0aW9uYWxpdHkiLCJBdWRpdG9yQWR2aWNlIjpudWxsLCJFUk1JRCI6bnVsbCwiQXVkaXREZXB0aElEIjoyMCwiSW5zZXJ0SUQiOiI0NTYiLCJJbnNlcnREYXRlIjoxMzMzNDU3NDc2LCJBcHByb3ZlcklEIjpudWxsLCJBcHByb3ZhbERhdGUiOm51bGwsIlNvcnRPcmRlciI6bnVsbCwia2V5d29yZHMiOlsiMiJdLCJrZXl3b3Jkc19vYmoiOltdLCJvYmplY3RpdmVzIjpbIjM5MSJdLCJvYmplY3RpdmVzX29iaiI6W10sImNsaWVudHMiOlsiMSJdLCJQcm9qZWN0SUQiOiIiLCJQQV9JRCI6IiIsIlBBX05hbWUiOiIiLCJQQVNfSUQiOiIiLCJQQVNfTmFtZSI6IiIsIlBfb2JqZWN0aXZlIjoiIiwiUF9vYmplY2l0dmVfTmFtZSI6IiIsIldoYXQyRG8iOiJOIiwiS2V5d29yZElkU3RyaW5nIjoiIiwiT2JqZWN0aXZlSWRTdHJpbmciOiIifQ=="

Das Plus Zeichen wird entfernt und dafür ein Zeilenumbruch eingefügt. Dieses Problem tritt aber wie gesagt nur in meinem Hauptprogram auf - damit muss es mit meiner AJAX Funktion in Verbindung stehen. :( Damit habe ich wohl ein javascript Problem in dieser Funktion:

Javascript:
function SaveDraftQuestion(TargetURL, ID)
{
	
	var xmlHttp = getXMLHttp();
  
	var POSTID = "input_"+ID;
	var OBJ=document.getElementById(POSTID).value;

  
	xmlHttp.onreadystatechange = function()
	{
		if(xmlHttp.readyState == 4)
		{
			HandleResponse(xmlHttp.responseText, 'statusbox');
			if(xmlHttp.responseText == 'OK') 
			{
				deleteTableLine(ID);
			}
			else 
			{
				ErrorTableLine(ID);
			}
		}
	}

	var paramenters="OBJ="+OBJ;
	xmlHttp.open("POST", TargetURL, true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlHttp.send(paramenters);
  	
}
 

Neue Beiträge

Zurück