PHP最佳实践,显示包含大量行数的文件中的所有行

问题描述 投票:-1回答:1

我有一个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然后conn与php并从基础获取数据我将能够显示所有行,但我又错了

            <?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等?

php mysql string file
1个回答
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)。

上面将杀死像Qazxswpoi这样的DIV的内容,并用加载器回复中的行填充尽可能多的P。

加载器接收一个参数,该参数是页码,将其转换为绝对行号,运行select并以JSON格式返回所有内容:

<div id="lines"></div>

您会发现浏览器工具非常有价值,可以检查AJAX调用的内容。您将能够在以后的大多数niftier库中回收“loader”文件。

© www.soinside.com 2019 - 2024. All rights reserved.