coltseavers
Goto Top

Unserialize klappt bei meinem array nicht

Ich habe folgendes Problem:

Ich möchte in einem Formular ein Array per POST übergeben.
Dazu gehe ich her und mache folgendes:
(Formularübetragungsmethode ist post)
<?
	$serialisiertesarray = serialize ($irgendeinarray);
	print("<input type=\"hidden\" name=\"arraydaten\" value=".$serialisiertesarray .">");  
?> 

In dem aufgerufenen Skript gehe ich nun her und mache folgendes:
<?
	print("Array: ".$_POST["arraydaten"]);  
?> 

In diesem Moment wird mir der aus dem Array erzeugte String angezeigt:
a:3:{i:0;s:6:\"200027\";i:1;s:6:\"200028\";i:2;s:6:\"200031\";}

Für mich macht das den Eindruck, als sei bis zu dieser Stelle alles so, wie es sein soll.

Dann mache ich folgendes:
<?
	$neuesarray = unserialize ($_POST["arraydaten"]);  
	$i = count($neuesarray);
?> 

Die Variable $i hat komischerweise den Wert 1, und nicht 3.

Folgende Prüfung gibt entsprechend auch die Fehlermeldung aus:
<?
	if(!is_array($neuesarray)){	
		print("Fehler bei array-erzeugung!");  
	}
?> 


Was läuft da falsch?
Ist mein PHP auf dem Server nicht korrekt konfiguriert?
Einen Fehler im Code halte ich inzwischen nämlich für recht unwahrscheinlich - er ist ja recht übersichtlich, und ich hab schon so'n paar Stunden versucht und nachgelesen...

Wäre für qualifizierte Vorschläge sehr dankbar!

Colt Seavers

Content-Key: 143597

Url: https://administrator.de/contentid/143597

Printed on: April 25, 2024 at 00:04 o'clock

Member: chr-fritz
chr-fritz May 26, 2010 at 23:12:46 (UTC)
Goto Top
Was zeigt denn var_dump() für den Unserialisierten Array an?

var_dump(unserialize($_POST['arraydaten']));  
Member: coltseavers
coltseavers May 27, 2010 at 01:08:50 (UTC)
Goto Top
ein var_dump gibt aus: bool(false)
Member: coltseavers
coltseavers May 27, 2010 at 01:30:26 (UTC)
Goto Top
Fehler gefunden!

diese zeile
$neuesarray = unserialize ($_POST["arraydaten"]);

habe ich wie folgt geändert:
$neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));

Damit werden die Backshlashes aus dem String entfernt und das Array wird auch wieder als solches erkannt und verwertbar...
Habs in nem Buch gefunden...
Member: chr-fritz
chr-fritz May 27, 2010 at 09:57:25 (UTC)
Goto Top
Ich würde dir aber trozdem raten den "stripshlashes()" nicht zu verwenden, da der Fehler durch die Konfigurationsoptionen "magic_quotes_gpc" und "magic_quotes_runtime" welche auf "on" gestellt sind zurück zu führen ist. http://de2.php.net/manual/de/info.configuration.php#ini.magic-quotes-gp ...

Daher würde ich überprüfen ob eine der beiden Optionen auf "on" bzw. "true" gestellt ist, und die Arrays "$_POST", "$_GET", "$_REQUEST" evtl. auch "$_COOKIE" und "$_FILES" rekursiv mit "stripslashes()" behandeln.

Ohne dies wirst du spätestens auf einem System auf welchem eine der beiden Optionen eingeschaltet ist das gleiche Problem wieder erhalten.
Member: coltseavers
coltseavers May 27, 2010 at 10:51:44 (UTC)
Goto Top
Hi Fritz,

vielen Dank für die Antwort!
"magic_quotes_gpc" war tatsächlich auf on, das hab ich dann gleich mal abgeschaltet.
(muß man erstmal drauf kommen, dass es so ne einstellung überhaupt gibt!)

ich hab nun aber deinen ratschlag nicht ganz verstanden.
im ersten satz schreibst du ich solle stripslashes() nicht verwenden, im zweiten rätst du aber dazu.

meine meinung: man kann die funktion beim deserialisieren auch weiterhin mitbenutzen - schaden tut sie ja nicht, und wenn man - wie du schon sagtest - den server wechselt - vermeidet das probleme. oder wie würdest du den code schreiben, wenn du per POST ein array übergeben wolltest?
Member: chr-fritz
chr-fritz May 27, 2010 at 14:08:02 (UTC)
Goto Top
Hallo,

falls die Funktion weiterhin benutzt wird kann es passieren, dass auf einem System bei dem "magic_quotes_gpc" aus ist, der Serialisierte String zerstört wird. Daher habe ich hierzu eine Funktion welche einen Array rekursiv durchgeht und jedes Element mittles "stripslashes()" behandelt. Sie sieht ungefär so aus:
function stripslashesRecursive($array){
  $newArray=array();
  foreach($array as $key=>$val){ // gehe jedes Element des Arrays durch
    if(is_array($val)) $newArray[$key]=stripslashesRecursive($val); // Überprüfe ob $val ein Array ist und für die Funktion ein weiteres mal aus (Rekursion)
    else $newArray[$key]=stripslashes($val); // Ist $val kein Array wird stripslashes() ausgeführt und unter $key im Array $newArray gespeichert.
  }
  return $newArray; // Gib den neuen Array zurück
}
Sollte nun "magic_quotes_gpc" auf "on" stehen, führe ich für z.B. "$_POST" den folgenden Code aus:
if(get_magic_quotes_gpc() == 1 || get_magic_quotes_runtime() == 1) {
$_POST=stripslashesRecursive($_POST);
// das selbe für $_GET, $_REQUEST usw.
}

Das ganze mache ich bevor ich irgend wie die Werte aus diesen Variablen verwende. Somit haben die Werte immer das richtige Format.

Allerdings würde ich zusätzlich den Array noch mittles Base64 Codieren, um weiteren Problemen bei der Übertragung vorzubeugen.
Member: coltseavers
coltseavers May 28, 2010 at 00:51:19 (UTC)
Goto Top
Hallo,

hm, warum denn so kompliziert?
Man kann auch einfach beim deserialisieren diese Zeile nehmen
 
<?
$neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));   
?>

sind die "magic_quotes_gpc" auf "on" korrigiert stripslashes() den string, sodass wieder ein array daraus wird.
sind die "magic_quotes_gpc" auf "off" nimmt stripslashes() keine änderungen vor.

so, wie ich das sehe, kann man also stripslashes() einfach vorsichtshalber mit einbauen. schaden tuts nicht, und beide fälle sind abgedeckt...
Member: chr-fritz
chr-fritz May 28, 2010 at 14:58:16 (UTC)
Goto Top
Zitat von @coltseavers:
Man kann auch einfach beim deserialisieren diese Zeile nehmen
 
> <?
> $neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));   
> ?>
> 
sind die "magic_quotes_gpc" auf "on" korrigiert stripslashes() den string, sodass wieder ein array daraus
wird.
sind die "magic_quotes_gpc" auf "off" nimmt stripslashes() keine änderungen vor.
Doch "stripslashes()" führt immer Änderungen durch egal wie "magic_quotes_gpc" eingestellt ist. Daher muss es abgefragt werden ob die Slashes entfernt werden müssen oder nicht.

Im folgenden Beispiel sieht man was passiert sollten in den Array-Werten eine der Folgenden zeichenfolgen auftreten: \' bzw. \"
$a=array('asdf\"asdf',"asdf'\'asdf");  
$s=serialize($a);
echo $s;
var_dump(unserialize($s));
var_dump(unserialize(stripslashes($s)));
Wie man sieht wird erst der Serialisierte String ausgegben. Beim zweiten die Ausgabe des Arrays. Die Dritte ausgabe wird mit einem Fehler quitiert. D.h. einfach Blind "stripslashes()" kann unter bestimmten umständen zu Fehlern führen, falls "magic_quotes_gpc" ausgeschaltet ist.