不能反序列化完整字符串


Can't unserialize full string

简介&代码

我有一个聊天日志的内容存储在一个.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()函数时,我只能看到第一行?

问题是您的序列化数据无效:

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

因为这是三个数组,所以不清楚如何反序列化它(我很惊讶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