函数反序列化偏移错误

时间:2013-09-23 19:21:02

标签: php laravel laravel-4

我正在使用 Laravel4 构建多语言网站
在数据库中,我有一个名为“content”的列,其中包含多种语言的序列化值。例如:

a:3:{s:2:"gb";s:15:"This is English";s:2:"es";s:5:"Hola!";s:2:"si";s:19:"Slovenija je zakon!";}

序列化数组包含:

  1. 语言缩写,取自Session
  2. 来自输入字段的内容
  3. 现在,当我向数据库添加新语言时,它会创建新的序列化字符串。大! 但是,当我想要反序列化该字符串并向其中添加值时,我收到以下错误:

    unserialize() [<a href='function.unserialize'>function.unserialize</a>]: Error at offset 0 of 30 bytes
    

    任何想法是怎么回事?我理解错误的含义,但它没有意义,因为我确信数据库中的值是序列化字符串。

    public function setContentAttribute($value)
    {   
        $lang = (Session::has('my.locale') ? Session::get('my.locale') : Config::get('app.locale'));
        /* Create new serialized string */
        if(empty($this->content)) {    
            $data[$lang] = $value['content'];
            $this->attributes['content'] = serialize($data);
        /* Update values */
        } else {
            $data = $this->content;
            $data = unserialize($data)
            $data[$lang] = $value['content'];
            $this->attributes['content'] = serialize($data);
        }
    }
    

    P.S:我正在使用mutators为数据库添加值。

    我希望它足够清楚。如果有任何不清楚的地方,请发表评论,我会解决它 谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我已经成功解决了这个问题。我两次反序列化我的代码 - 一次在访问器中,一次在mutator中。这是一个有效的例子:

public function getVsebinaAttribute($value)
    {
        $data = unserialize($value);
        $lang = $this->getLang();
        if (!empty($data[$lang])) {
            return $data[$lang];
        } else {
            return '# Value has not yet been added';
        }
    }
    public function setVsebinaAttribute($value)
    {
        if (isset($this->attributes['vsebina'])) {
            $data = unserialize($this->attributes['vsebina']);
        } else {
            $data = array();
        }

        $lang = $this->getLang();
        $data[$lang] = $value;
        $this->attributes['vsebina'] = serialize($data);
    }

    protected function getLang()
    {
        return Session::has('my.locale') ? Session::get('my.locale') : Config::get('app.locale');
    }