PHP在偏移量处反序列化错误,适用于某些服务器,而不适用于其他服务器

Sam*_*nam 17 php serialization

我的代码可以在少数几台服务器上运行,但其他服务器上的代码数据却没有.我打电话给这样一个页面:

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
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

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);
        }
Run Code Online (Sandbox Code Playgroud)

这是一个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\";}"
Run Code Online (Sandbox Code Playgroud)

处理后,我收到以下错误:

遇到PHP错误
严重性:通知消息:unserialize()[function.unserialize]:偏移量为6的错误447字节
文件名:plugins/Drilldowns.php
行号:93

我在5.2.13上尝试这个 - 在某些Linux上工作,某些OS X工作,而不是其他工作.已经检查过php.ini,charset(我想) - 我无法弄清楚我的生活.我尝试过的事情很简单

string(18) "a:1:{s:3:\"sam\";}" length:18
Run Code Online (Sandbox Code Playgroud)

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

Pek*_*ica 23

它是引号前面的反斜杠: \"

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

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";}"'));
Run Code Online (Sandbox Code Playgroud)

这可以使用的服务器可能启用了魔术引号.

  • @Sam我得到了与斜杠相同的错误,当我删除它们时它们就会消失.另外,我很确定`var_dump`不会添加这样的斜杠.你能在数据上尝试`stripslashes()`吗? (3认同)

the*_*ard 22

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

 base64_encode(serialize($User)); // make sure to encode the serialized object
 unserialize(base64_decode($User)); // decode it before unserializing
Run Code Online (Sandbox Code Playgroud)

  • 我不知道我是否能反应这篇文章,但我有相同的发布,我正在使用base64_encode(序列化($ data))...我该如何解决? (2认同)