Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: coltseavers

coltseavers (Level 2) - Jetzt verbinden

26.05.2010, aktualisiert 28.05.2010, 4335 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 ..
Ähnliche Inhalte
Batch & Shell

Leere Array-Werte aus einem Array entfernen

gelöst Frage von ToniHoBatch & Shell3 Kommentare

Hallo zusammen, ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames ...

JavaScript

Javascript Array

gelöst Frage von internet2107JavaScript2 Kommentare

Ich habe folgendes Problem. Ersetze ich die folgenden Zahlen gegen Variablenwerte, bekomme ich nicht das Ergebnis, wie mit festen ...

Batch & Shell

Array oder Object oder wie soll ich das machen

gelöst Frage von Druide83Batch & Shell4 Kommentare

Hallo, mal wieder verzweifelt. Wahrscheinlich ist die Lösung einfach, aber ich habe gerade keinen Kopf mehr zum klar denken. ...

Batch & Shell

Wert aus Array ausschliessen PowerShell

gelöst Frage von ivaylo53Batch & Shell2 Kommentare

Guten Morgen Community, irgendiwe komme ich bei diesem Problem nicht weiter. Ich habe Zwei Objekte $alCSVUser und $alADUser. Diese ...

Neue Wissensbeiträge
Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 36 MinutenAdministrator.de Feedback4 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 17 StundenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 1 TagGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Sicherheit

Intel gibt neue Spectre V2-Microcode-Updates frei (20.02.2018)

Information von kgborn vor 1 TagSicherheit

Intel hat zum 20. Februar 2018 weitere Microcode-Updates für OEMs freigegeben, um Systeme mit neueren Prozessoren gegen die Spectre ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...