2010-11-10 64 views
16

我的代码适用于少数几台服务器,但没有其他服务器使用串行化数据。我所说的页面是这样的:PHP反序列化在偏移量的错误,在一些服务器上工作,而不是其他服务器

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 

这是我使用的代码:

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); 
     } 

这是一个var_dump输出:

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\";}" 

当那得到处理我得到的以下错误:

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

我在5.2.13上试了这个 - 在一些Linux,一些OS X上,而不是其他的。已经检查过php.ini,charset(我认为) - 我无法弄清楚我的生活。我尝试过的东西很简单

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

它仍然是错误的。任何线索为什么?

+0

你可以显示你正在使用的确切的反序列化代码? – 2010-11-10 21:02:47

+0

我们需要代码。如果它仅适用于某些服务器,则它可能是特定平台或版本。 – 2010-11-10 21:04:59

+0

它适用于5.2 linux(Centos),但不适用于5.3 - 在某些Mac上失败,但在其他Mac上失败 – 2010-11-10 21:46:34

回答

21

它在引号前面的反斜线:\"

当你删除它们,它的工作原理。

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";}"')); 

该工作的服务器可能已打开magic quotes

+0

所有服务器上的魔术引号都关闭 - 转储会将它们放在那里..我会在一分钟内发布更多代码 – 2010-11-10 21:39:05

+3

@Sam I get与斜线相同的错误,当我移除它们时它们会消失。另外,我很确定'var_dump'不会像这样添加斜杠。你可以在数据上试试'stripslashes()'吗? – 2010-11-10 21:44:19

+0

你是对的 - 我添加了stripslashes(),它工作。我已经验证magic_quotes已关闭 - 但我会检查我们的框架中是否注入了某些内容。万分感谢! – 2010-11-10 21:49:00

21

我有这个问题,它花了我一段时间来解决它。我只是找不到任何好的解决方案,但这是我做了什么来解决我的情况:

base64_encode(serialize($User)); // make sure to encode the serialized object 
unserialize(base64_decode($User)); // decode it before unserializing 
+0

这是一个很好的解决方案。 :) – Mifas 2014-01-28 10:14:25

+1

我不知道如果我可以反应它这篇文章,但我有相同的issu和我使用base64_encode(序列化($数据))...我该如何解决它? – 2014-08-22 10:32:09

+0

这是真正有效的唯一解决方案。正则表达式替换有时不起作用。 – astroanu 2015-09-12 15:47:56

相关问题