2013-09-23 40 views
0

我正在構建一個多語言網站Laravel4

在數據庫中我有名爲「內容」的列,其中包含多種語言的序列化值。例如:
函數反序列化偏移量錯誤

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. 語言的縮寫,從會議所作
  2. 內容是來自於輸入字段現在

當我添加新語言到數據庫,它會創建新的序列化字符串。大! 但是,當我想反序列化該字符串和添加值,我得到以下錯誤:

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:我正在使用增變器向數據庫添加值。

我希望它很清楚。如果有什麼不清楚的地方,請發表評論,我會解決它。
謝謝!

+0

unserialising時的錯誤提示字符串已被修改(即損壞)。看看這個:http://stackoverflow.com/questions/10152904 –

+0

我使用訪問器和mutators。是否有可能,當我從數據庫中檢索值時,一個增變器正在搞亂我的'$ this-> content'? – intelis

+1

不一定是一個增變,但我懷疑是什麼。在序列化數據之後抓取輸出並將其與您從數據庫傳遞給'unserialise()'的字符串進行比較。 –

回答

0

好吧,我已經設法修復它。我曾兩次對我的代碼進行反序列化 - 一次是在訪問器中,一次是在增變器中。這裏是一個工作示例:

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