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)
In dem aufgerufenen Skript gehe ich nun her und mache folgendes:
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:
Die Variable $i hat komischerweise den Wert 1, und nicht 3.
Folgende Prüfung gibt entsprechend auch die Fehlermeldung aus:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143597
Url: https://administrator.de/contentid/143597
Ausgedruckt am: 26.11.2024 um 21:11 Uhr
8 Kommentare
Neuester Kommentar
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.
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.
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:
Sollte nun "magic_quotes_gpc" auf "on" stehen, führe ich für z.B. "$_POST" den folgenden Code aus:
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.
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
}
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.
Zitat von @coltseavers:
Man kann auch einfach beim deserialisieren diese Zeile nehmen
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.Man kann auch einfach beim deserialisieren diese Zeile nehmen
> <?
> $neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));
> ?>
>
wird.
sind die "magic_quotes_gpc" auf "off" nimmt stripslashes() keine änderungen vor.
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)));