Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Unserialize klappt bei meinem array nicht

Frage Entwicklung PHP

Mitglied: coltseavers

coltseavers (Level 2) - Jetzt verbinden

26.05.2010, aktualisiert 28.05.2010, 4231 Aufrufe, 8 Kommentare

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)
01.
<? 
02.
	$serialisiertesarray = serialize ($irgendeinarray); 
03.
	print("<input type=\"hidden\" name=\"arraydaten\" value=".$serialisiertesarray .">"); 
04.
?> 
In dem aufgerufenen Skript gehe ich nun her und mache folgendes:
01.
<? 
02.
	print("Array: ".$_POST["arraydaten"]); 
03.
?> 
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:
01.
<? 
02.
	$neuesarray = unserialize ($_POST["arraydaten"]); 
03.
	$i = count($neuesarray); 
04.
?> 
Die Variable $i hat komischerweise den Wert 1, und nicht 3.

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

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
Mitglied: chr-fritz
27.05.2010 um 01:12 Uhr
Was zeigt denn var_dump() für den Unserialisierten Array an?

01.
var_dump(unserialize($_POST['arraydaten']));
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 03:08 Uhr
ein var_dump gibt aus: bool(false)
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 03:30 Uhr
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...
Bitte warten ..
Mitglied: chr-fritz
27.05.2010 um 11:57 Uhr
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.
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 12:51 Uhr
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?
Bitte warten ..
Mitglied: chr-fritz
27.05.2010 um 16:08 Uhr
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:
01.
function stripslashesRecursive($array){ 
02.
  $newArray=array(); 
03.
  foreach($array as $key=>$val){ // gehe jedes Element des Arrays durch 
04.
    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) 
05.
    else $newArray[$key]=stripslashes($val); // Ist $val kein Array wird stripslashes() ausgeführt und unter $key im Array $newArray gespeichert. 
06.
07.
  return $newArray; // Gib den neuen Array zurück 
08.
}
Sollte nun "magic_quotes_gpc" auf "on" stehen, führe ich für z.B. "$_POST" den folgenden Code aus:
01.
if(get_magic_quotes_gpc() == 1 || get_magic_quotes_runtime() == 1) { 
02.
$_POST=stripslashesRecursive($_POST); 
03.
// das selbe für $_GET, $_REQUEST usw. 
04.
}
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.
Bitte warten ..
Mitglied: coltseavers
28.05.2010 um 02:51 Uhr
Hallo,

hm, warum denn so kompliziert?
Man kann auch einfach beim deserialisieren diese Zeile nehmen
01.
  
02.
<? 
03.
$neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));  
04.
?>
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...
Bitte warten ..
Mitglied: chr-fritz
28.05.2010 um 16:58 Uhr
Zitat von coltseavers:
Man kann auch einfach beim deserialisieren diese Zeile nehmen
01.
  
02.
> <? 
03.
> $neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));  
04.
> ?> 
05.
> 
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. \"
01.
$a=array('asdf\"asdf',"asdf'\'asdf"); 
02.
$s=serialize($a); 
03.
echo $s
04.
var_dump(unserialize($s)); 
05.
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.
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Windows 10
Klappt es noch mit 7 Key Windows 10 zu aktivieren? (10)

Frage von zeroblue2005 zum Thema Windows 10 ...

PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

LAN, WAN, Wireless
gelöst Router Switch zwei APs Verbindung klappt nicht (16)

Frage von c3t1n57 zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...