2010-11-10 2 views
16

Ich habe Code, der auf einer Handvoll von Servern funktioniert, aber nicht andere, die mit serialisierten Daten kommt. Ich nenne eine Seite wie diese:PHP unserialize Fehler bei Offset, funktioniert auf einigen Servern, nicht andere

http://domain/index.php/sales/Drilldowns?params=a:12:{s:13:"selectionType";s:8:"facility";s:8:"dateType";s:5:"daily";s:10:"dateOption";s:9:"drilldown";s:6:"metric";s:13:"bookingAmount";s:9:"companyFK";s:2:"11";s:10:"facilityFK";s:0:"";s:7:"classFK";s:0:"";s:15:"customDateStart";s:4:"null";s:7:"newDate";s:10:"2010-11-01";s:10:"metricName";s:10:"Bookings%20$";s:16:"currentDateRange";s:10:"11/01/2010";s:23:"currentMetricNavigation";s:8:"DELDELTE";}&getExcel=0 

Dies ist der Code Ich verwende:

protected function getRequestVariables(){ 
     if(isset($_REQUEST['params'])){ 
      var_dump($_REQUEST['params']); 
      echo 'length:'.strlen($_REQUEST['params']); 
      $vars = unserialize($_REQUEST['params']); 
      var_dump($vars); 
     } else { 
      $vars = $_REQUEST; 
      // unset saved drilldown options 
      $this->ci->session->svar_set('postVars', null); 
     } 

Dies ist ein var_dump Ausgang:

string(447) "a:12:{s:13:\"selectionType\";s:8:\"facility\";s:8:\"dateType\";s:5:\"daily\";s:10:\"dateOption\";s:9:\"drilldown\";s:6:\"metric\";s:13:\"bookingAmount\";s:9:\"companyFK\";s:2:\"11\";s:10:\"facilityFK\";s:0:\"\";s:7:\"classFK\";s:0:\"\";s:15:\"customDateStart\";s:4:\"null\";s:7:\"newDate\";s:10:\"2010-11-01\";s:10:\"metricName\";s:10:\"Bookings $\";s:16:\"currentDateRange\";s:10:\"11/01/2010\";s:23:\"currentMetricNavigation\";s:8:\"DELDELTE\";}" 

Wenn das verarbeitet wird ich das bekommen folgender Fehler:

A PHP Error was encountered
Severity: Notice Message: unserialize() [function.unserialize]: Error at offset 6 of 447 bytes
Filename: plugins/Drilldowns.php
Line Number: 93

Ich versuche das auf 5.2.13 - funktioniert auf einigen Linux, einigen OS X, nicht anderen. Habe php.ini, charset (denke ich) überprüft - ich kann es nicht für mein Leben herausfinden. Ich habe die Dinge so einfach wie

string(18) "a:1:{s:3:\"sam\";}" length:18 

und es noch Fehler versucht. Irgendeine Ahnung warum?

+0

Können Sie den genauen unserialize Code zeigen, den Sie verwenden? –

+0

Wir brauchen den Code. Es ist wahrscheinlich etwas plattform- oder versionsspezifisch, wenn es nur auf einigen Servern funktioniert. –

+0

Es funktioniert auf 5.2 Linux (Centos), aber nicht 5.3 - schlägt auf einigen Macs aber nicht –

Antwort

21

Es ist die Schrägstriche vor der Zitate: \"

Wenn Sie sie entfernen, es funktioniert.

var_dump(unserialize('a:12:{s:13:"selectionType";s:8:"facility";s:8:"dateType";s:5:"daily";s:10:"dateOption";s:9:"drilldown";s:6:"metric";s:13:"bookingAmount";s:9:"companyFK";s:2:"11";s:10:"facilityFK";s:0:"";s:7:"classFK";s:0:"";s:15:"customDateStart";s:4:"null";s:7:"newDate";s:10:"2010-11-01";s:10:"metricName";s:10:"Bookings $";s:16:"currentDateRange";s:10:"11/01/2010";s:23:"currentMetricNavigation";s:8:"DELDELTE";}"')); 

Die Server funktioniert dies auf, haben wahrscheinlich magic quotes eingeschaltet.

+0

Magic Zitate ist auf allen Servern - der Dump setzt sie dort .. Ich werde mehr Code in einer Minute –

+3

@Sam ich bekomme die gleichen Fehler, die Sie mit den Schrägstrichen, und sie verschwinden, wenn ich sie entferne. Außerdem bin ich mir ziemlich sicher, dass 'var_dump' keine Schrägstriche hinzufügt. Können Sie ein 'stripslashes()' auf den Daten versuchen? –

+0

du hattest recht - ich habe stripslashes() hinzugefügt und es hat funktioniert. Ich habe verifiziert, dass magic_quotes deaktiviert ist - aber ich werde in unserem Framework nachsehen, dass etwas nicht in diese injiziert. Danke vielmals! –

21

Ich hatte dieses Problem und es dauerte eine Weile, um es zu lösen. Ich konnte einfach keine gute Lösung finden, aber das ist, was ich getan habe, um meine Situation zu lösen:

+0

das ist eine großartige Lösung. :) – Mifas

+1

ich weiß nicht, ob ich diesen Beitrag reaktivieren kann, aber ich habe das gleiche issu und ich benutze den base64_encode (serialize ($ data)) ... wie kann ich es beheben? –

+0

Dies war die einzige Lösung, die wirklich funktionierte. regex replace wird manchmal nicht funktionieren. – astroanu

Verwandte Themen