简介&代码
我有一个聊天日志的内容存储在一个.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