2015-05-26 37 views
2

簡要&代碼

我有存儲在一個.txt文件中的聊天記錄的內容。內容如下:不能反序列化滿弦

a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:4:"test";s:4:"time";s:8:"14:15:54";}a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 2";s:4:"time";s:8:"14:16:55";}a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 3";s:4:"time";s:8:"14:17:59";}

一個jQuery函數調用出來chatretrieve.php一個頁面來收集這些文件的內容。 PHP文件看起來是這樣的:

<?php 

session_start(); 

$data = unserialize(file_get_contents('../sessions/chats/log_'.$_SESSION['chatCode'].'.txt')); 

#exit(print_r($data)); 

$content = ''; 

for($i = 0; $i < count($data); $i++){ 
    $content.='<div class="msgln">'; 
     $content.='<div class="meta">'; 
      $content.='<span class="name">'.$data[$i]['author'].'</span>'; 
      $content.='<span class="time">'.$data[$i]['time'].'</span>'; 
     $content.='</div>'; 
     $content.='<div class="msg">'.stripslashes(htmlspecialchars($data[$i]['message'])).'</div>'; 
    $content.='</div>'; 

} 

return $content; 

jQuery函數的相關部分如下:

$.post('inc/chatretrieve.php').done(function(data) { 
    console.log(data); 
}); 

問題

當我註釋掉PHP頁面exit(print_r($data))部分,控制檯返回只有.txt文件中的第一個數組變量:

Array 
(
    [author] => e297f 
    [message] => test 
    [time] => 14:15:54 
) 
1 

由於.txt文件中有三條消息(使用file_get_contents()函數進行檢索),爲什麼我只能在使用unserialize()函數時看到第一行?

回答

2

的問題是,你的序列化的數據是無效的:

'a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:4:"test";s:4:"time";s:8:"14:15:54";}a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 2";s:4:"time";s:8:"14:16:55";}a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 3";s:4:"time";s:8:"14:17:59";} 

因爲這是三排,目前還不清楚如何unserialise這個(我很驚訝的是,PHP不徹底失敗,而是返回第一個對象)。

您需要將其存儲爲序列化數組,或者找到一種方法將文件拆分爲每個消息的部分 - 這可能可以在換行符或類似的東西上完成。

例如喜歡的東西

<?php 
//Note the added newlines. 
$sez = 'a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:4:"test";s:4:"time";s:8:"14:15:54";} 
a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 2";s:4:"time";s:8:"14:16:55";} 
a:3:{s:6:"author";s:5:"e297f";s:7:"message";s:6:"test 3";s:4:"time";s:8:"14:17:59";}'; 


foreach(explode("\n",$sez) as $line){ 
    $data = unserialize($line); 
    print_r($data); 
} 

例這裏http://codepad.org/sq1SbhIz