无法反序列化完整字符串

时间:2015-05-26 13:28:23

标签: javascript php jquery

简介&代码

我将聊天记录的内容存储在.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()函数时只能看到第一行?

1 个答案:

答案 0 :(得分: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";}

因为这是三个数组,所以不清楚如何反序列化(我很惊讶PHP不会彻底失败,而是返回第一个对象)。

您需要将其存储为序列化数组,或者找到一种方法将文件拆分为每个消息的部分 - 这可能是在换行或类似的事情上完成的。

e.g。像

这样的东西
<?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