溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP出現Notice: unserialize() [function.unserialize]: Error at offset問題的解決方案

發布時間:2020-06-14 19:13:56 來源:網絡 閱讀:2491 作者:happyyin 欄目:web開發

今天的用PHP的時候無意的出現了用unserialize()函數轉換老是返回false,我確認我的字符串是沒錯的,測試了很多次還是一樣,沒辦法,啟用了error_reporting(E_ALL)啟用錯誤信息,沒想到發現了Notice: unserialize() [function.unserialize]: Error at offset的信息, 因為我字符我是從數組轉換過來的,所以應該是沒有錯的, Google了一下,原來是編碼問題,在PHP手冊的評論中有人討論了此問題.

原來我serialize后的數組字符串是從數據庫里取出來的,而原來插入數據庫時,因為美工修改前臺視圖代碼時導致視圖編碼未保存成UTF8編碼而是ANSCII編輯,而我復制出來后用unserialize()的PHP文件是UTF-8編碼,編碼不同,所以就出現錯誤了...

例子:
“ 首頁以ANSCII方式操作

<?php

$arr = array('en' => 'hello', 'cn' => '您好');
$str = serialize($arr);
echo $str;

?>

輸出結果: a:2:{s:2:"en";s:5:"hello";s:2:"cn";s:4:"您好";}

然后以UTF-8的編碼方式來測試

則以上代碼的輸出結果為: a:2:{s:2:"en";s:5:"hello";s:2:"cn";s:6:"您好";}
看到有什么不同了吧,在出現中文字符時字符長度就不一樣了,也就是strlen('您好')在第一種編碼中是4,而在第二種編碼中是6,其中原因可以查看相關手冊. 而unsrialize()要根據類似 s:6:"您好" 中的6來判斷字符長度并進行反序列,但原來的是4,字符長度不符,也就是出現了offset錯誤

解決辦法:
“ 將要反序列的字符串進行一次轉換,代碼

$data=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$data);
$data=unserialize($data);
如果您的解碼數組內容里有類似(<img src=\"/new/uploadfile/editor/p_w_picpath/20131221/20131221201521_54813.jpg\" alt=\"\" />的雙引號轉移字符)的子元素,還需要對特定子元素去除重復的轉移雙引號(文本編輯器上傳圖片功能默認對URL內容進行了斜杠轉義,解碼后需要對其去除重復雙引號轉移)

a:7{s:8:"nickname";s:10:"4211931411";s:3:"uid";s:6:"481010";s:10:"other_type";s:1:"1";s:8:"other_id";i:2023;s:11:"other_title";s:143:"發布了博文: <a href='/blog/a-log/uid-481010/id-2023' target='_blank'>中國有個你大爺 巧妙 答記者問 </a>";s:3:"des";s:232:"<p>
<img src=\"/new/uploadfile/editor/p_w_picpath/20131221/20131221201521_54813.jpg\" alt=\"\" /></p><p><p>1、記者:大爺,巿長被綁架了,綁匪要贖金一千萬,如果不給,他們就用汽油燒死他?,F正在";s:11:"content_url";s:53:"/blog/a-log/uid-481010/id-2023";}

$data['des']=stripslashes($data['des']);


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女