我有一个1.2MB的文件,里面有36k +行文本,并且可能还在增长。问题是我想显示input.txt中的所有行,但是由于行太多,我因浏览器崩溃而退出...到目前为止,我尝试过的是:
<?php
$handle = fopen("input.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
echo '<li class="list-group-item d-flex justify-content-between align-items-center">'.$line.'</li>';
}
fclose($handle);
} else {
echo 'error';
}
?>
此代码适用于约40KB约1400行的文件,否则将导致崩溃...
在那之后,我想如果我将该文件加载到db,然后用php conn并从基数中获取数据,我将能够显示所有行,但是我又错了
<?php
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT ime_pjesme FROM pjesme";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo '<li class="list-group-item d-flex justify-content-between align-items-center">'. $row["ime_pjesme"].'</li>';
}
} else {
echo "0 results";
}
$conn->close();
?>
所以我的问题是,有什么方法/方法可以让我在浏览器中显示这些行,或者有什么方法可以加载它,然后按50等显示50?
答案 0 :(得分:1)
是的,有一种方法可以一次显示文件一页。
有许多库可以很好地满足您的需要,但是要了解其机制,这里是仅使用jQuery库和一些PHP的方法。
简单地说,您需要两个文件。第一个将显示页面计数器/选择器以及行将出现的区域。假设您一次要50行:
$pages = floor(($rownumber + 50 - 1)/ 50);
print "<ul class=\"pageselect\">";
for ($i = 0; $i < $pages; $i++) {
$p = $i + 1;
print "<li data-page=\"{$p}\">Page {$p}</li>";
}
print "</ul>";
您组织CSS以便LI元素都很好,居中且水平。然后您使用例如jQuery通过委托给父UL(使用Javascript)将事件处理程序附加到对这些LI之一的单击上:
$('ul.pageselect').on('click', 'li', function() {
var wanted = $(this).attr('data-page');
$.post('/path/to/page_load.php', { page: wanted })
.then(reply => {
// "reply" is the object returned by the loader PHP.
$('#lines').empty();
for (var l = 0; l < reply.lines.length; l++) {
$('#lines').append($('<p>').text(reply.lines[l]));
}
});
});
委托函数对第二个PHP文件发出AJAX POST调用,并期望将处理JSON答复(此处称为reply
)。
以上内容将杀死诸如<div id="lines"></div>
之类的DIV的内容,并用加载程序回复中的所有行数填充P。
加载器接收到的参数是页码,将其转换为绝对行号,运行select并以JSON格式返回所有内容:
$from = (((int)$_POST['page'])-1) * 50;
if ($from < 0) { $from = 0; }
// Run a SELECT with OFFSET {$from},50 to fetch at most 50 rows
$reply = [
'total' => $total, // use SQL_CALC_FOUND_ROWS to get the total number
'lines' => [ ]
];
while ($rs->fetch(PDO::PDO_FETCH_ASSOC) as $line) {
$reply['lines'] = "This line is {$line['text']}.";
}
header('Content-Type: application/json; charset=UTF8');
// Return JSON encoding of $reply to the caller.
exit(json_encode($reply));
您会发现浏览器工具对于检查AJAX调用发生的情况非常有用。稍后,您将可以使用大多数niftier库回收“加载程序”文件。