如何使用HTML将一个表格加载到多个网页中?

3
我正在创建一个用于显示报告的网站。所有报告都是以表格形式呈现的,并使用PHP从SQL中提取。除了当行数超过几百行时需要较长时间来提取数据外,我的页面已经可以正常工作。这些表格通常有30多列。我想知道是否有办法使表格加载速度更快,或者更好的方法是将表格分成多个页面,并在底部添加导航按钮以向前或向后移动表格。
我尝试只使用PHP、HTML和CSS来完成这个任务。我没有直接访问代码所在服务器的权限,只能访问我的代码。因此更新除我的代码之外的任何内容都会非常困难。
以下是我目前用于提取和显示表格的代码:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>QDef</title>
        <link rel="StyleSheet" href="StyleSheet.css" type="text/css">
    </head>
    <body>
        <div class="menu-wrap">
            <nav class="menu">
                <ul class="clearfix">
                    <li><a href="default.aspx">Home</a></li>
                    <li><a href="#">Material Tracking</a>
                        <ul class="sub-menu">
                            <li><a href="SearchStateProject.php">Search by State or Contract Number</a></li>
                            <li><a href="MaterialTrackingAllStates.php">All Contracts</a></li>
                        </ul>
                    </li>
                    <li><a href="#">OPR Reports</a>
                        <ul class="sub-menu">
                            <li><a href="COEI_OPR_Filtered.php">COEI OPR Filtered</a></li>
                            <li><a href="OSP_OPR_Filtered.php">OSP OPR Filtered</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Admin</a>
                        <ul class="sub-menu">
                            <li><a href="QDef.php">QDef</a></li>
                            <li><a href="CheckPHP.php">PHP Check</a></li>
                            <li><a href="EditQDefForm.php">Edit QDef form</a></li>
                            <li><a href="FormToEditMaterial.php">Form to Edit Material</a></li>
                            <li><a href="TableUpdates.php">Table Updates</a></li>
                        </ul>
                    </li>
                </ul>
            </nav>
        </div>
        <br>
        <br>
        <h1>QDef Table</h1>
<?php
    $configs = include('DBConn.php');
    $servername = $configs['ServerName'];
    $username = $configs['UserName'];
    $password = $configs['Password'];
    $dbname = $configs['DBName'];
    $limit = 15; 

    try
    {
        $conn = new PDO("sqlsrv:server=$servername;database=$dbname", $username,$password);
        //set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $conn->setAttribute(PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 1);
        //echo "Connected Successfully<br>" /*. $conn*/;
        /*If conncected see if we can pull any data!*/
    }
    catch(Exception $e)
    {
        die( print_r( $e->getMessage()));
    }

    $TotalRows = $conn->query('select count(*) from pmdb.v_QDefs')->fetchColumn(); //How many rows in the table
    $pages = ceil($TotalRows / $limit); //How many page will there be
    $currentpage = 1;
    $currentpage = min($pages, filter_input(input_get, 'page', filter_validate_int, array('options' => array('default' => 1,'min_range' => 1,),))); //What page are you currently on
    var_dump($currentpage);
    $offset = abs(($currentpage - 1) * $limit); //Calculate Offset
    //Some info to display to the user?
    $start = $offset + 1;
    $end = min(($offset + $limit),$TotalRows);
    $prevlink = ($currentpage > 1) ? '<a href="?page=1" title="First page">&laquo;</a> <a href="?page=' . ($currentpage - 1) . '" title="Previous page">&lsaquo;</a>' : '<span class="disabled">&laquo;</span> <span class="disabled">&lsaquo;</span>'; //the back link
    $nextlink = ($currentpage < $pages) ? '<a href="?page' . ($currentpage + 1) . '" title="Next page">&rsaquo;</a> <a href="?page=' . $pages . '" title="Last page">&raquo;</a>' : '<span class="disabled">&rsaquo;</span> <span class="disabled">&raquo;</span>'; //the Forward link
    echo '<div id="paging"><p>', $prevlink, ' Page ',$currentpage, ' of ',$pages,' pages, displaying ',$start,'-',$end, ' of ',$TotalRows,' results ',$nextlink,' </p></div>'; //display the paging information

    $tsql = "select Id,QSrc,QName,isActive,RunReport,FilePath,QDef from pmdb.v_QDefs order by Id OFFSET $offset ROWS FETCH NEXT $limit ROWS";
    //echo $tsql . "<br>";
    $getqueries = $conn->query($tsql);

    $queries = $getqueries->fetchALL(PDO::FETCH_ASSOC);

    $countqueries = count($queries);

    if(isset($countqueries))
    {
        if($countqueries > 0)
        {
            //echo "There are queries returned";
            BeginQueriesTable($countqueries);
                $CountValues = 1;
            foreach($queries as $query)
            {
                PopulateQueryTable($query,$CountValues);
                $CountValues = !$CountValues;
            }
            EndQueriesTable();
        }
        else
        {
            echo "<br>Values returned: $countqueries";
        }
    }
    else
    {
        echo "No count";
    }

    function BeginQueriesTable($rowCount)
    {
        $headings = array("Edit","Id","QSrc","QName","isActive","RunReport","FilePath","QDef");
        echo "<p class=" . chr(34) . "headings" . chr(34) . ">$rowCount Results</p>";
        echo "<table class=" . chr(34) . "tab" . chr(34) . "id=" . chr(34) . "OuterTable" . chr(34) . ">";
        echo "<tr>";
        foreach($headings as $heading)
        {
            echo "<th class=" . chr(34) . "cell" . chr(34) . ">$heading</th>";
        }
        echo "</tr>";
    }

    function PopulateQueryTable($values,$Number)
    {
        $queryID = $values['Id'];
        //var_dump($values);
        //echo "<br/>";
        //var_dump ($queryID);
        echo "<tr class=" . chr(34) . "row" . ($Number) . chr(34) . "><td><a href=" . chr(34) . "EditQDefForm.php?id=" . $values['Id'] . chr(34) . ">Edit</a></td>";
        foreach($values as $key=>$value)
        {
            if(!is_null($value))
            {
                echo "<td>$value</td>";
            }
            else
            {
                echo "<td></td>";
            }
        }
        echo "</tr>";
    }

    function EndQueriesTable()
    {
        echo "</table><br/>";
    }
?>
    </body>
</html>

目前,这个表将会提取大约15000行数据。我知道这并不算太多,但是因为有61列,其中一些是非常长的注释,所以加载需要5-10分钟的时间。

如果您需要更多信息,请告诉我,任何帮助都将不胜感激。


1
顺便说一下:我建议您使用单独的配置文件来进行SQL连接... - Bubble Hacker
@BubbleHacker 如果我把它放在单独的配置文件中,我该如何链接到它?你能给我展示一些例子或文档吗?我有几个表可以这样做。 - Mike
1
使用 PHP 的 include 函数。 - Bubble Hacker
1
https://dev59.com/fnA65IYBdhLWcg3wqAWt - Marc B
@BubbleHacker 感谢您对使用单独的配置文件的评论。我已经为所有表格做了这样的处理。 - Mike
显示剩余2条评论
2个回答

0

主要思路是使用MySQL Limit:例如:

$sql = "SELECT * FROM mytable LIMIT 10 OFFSET 15";

您可以将页码作为查询参数传递给下一页和上一页的链接:

$rec_limit=50; //Your favorite paging number
 if( isset($_GET{'page'} ) ) {
            $page = $_GET{'page'} + 1;
            $offset = $rec_limit * $page ;
         }else {
            $page = 0;
            $offset = 0;
         }
$sql = "SELECT * from mytable LIMIT $offset, $rec_limit";

请查看这里,了解有关创建下一个和上一个链接等的更多详细信息。


这被标记为sql server。如果这是MySQL,您的答案将很有效,但对于SQL Server不起作用。 - Sean Lange
LIMIT和SQL TOP类似吗? - Mike
是的,它是可以的。然而,LIMIT 最好有两个选项:“行数”和“从第一行开始的偏移量”。 - Ali Sheikhpour
Offset在2012年的SQL中被添加,据我所知,LIMIT并没有。我发现以下代码可以实现你描述的功能: OFFSET 15 ROWS FETCH NEXT 15 ROWS ONLY - Mike

0

我在@markb在上面的评论中提供的链接(sql-Simple PHP Pagination Script)的帮助下解决了这个问题。最终我使用了那个答案中的链接:

基本分页教程

我尝试使用问题的被接受的答案,但无法使其正常工作。以下是我为自己找到的解决方案:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>QDef</title>
        <link rel="StyleSheet" href="StyleSheet.css" type="text/css">
    </head>
    <body>
        <div class="menu-wrap">
            <nav class="menu">
                <ul class="clearfix">
                    <li><a href="default.aspx">Home</a></li>
                    <li><a href="#">Material Tracking</a>
                        <ul class="sub-menu">
                            <li><a href="SearchStateProject.php">Search by State or Contract Number</a></li>
                            <li><a href="MaterialTrackingAllStates.php">All Contracts</a></li>
                        </ul>
                    </li>
                    <li><a href="#">OPR Reports</a>
                        <ul class="sub-menu">
                            <li><a href="COEI_OPR_Filtered.php">COEI OPR Filtered</a></li>
                            <li><a href="OSP_OPR_Filtered.php">OSP OPR Filtered</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Admin</a>
                        <ul class="sub-menu">
                            <li><a href="QDef.php">QDef</a></li>
                            <li><a href="CheckPHP.php">PHP Check</a></li>
                            <li><a href="EditQDefForm.php">Edit QDef form</a></li>
                            <li><a href="FormToEditMaterial.php">Form to Edit Material</a></li>
                            <li><a href="TableUpdates.php">Table Updates</a></li>
                        </ul>
                    </li>
                </ul>
            </nav>
        </div>
        <br>
        <br>
        <h1>QDef Table</h1>
<?php
    $configs = include('DBConn.php');
    $servername = $configs['ServerName'];
    $username = $configs['UserName'];
    $password = $configs['Password'];
    $dbname = $configs['DBName'];
    $limit = 15; //Create the max limit per page

    try
    {
        $conn = new PDO("sqlsrv:server=$servername;database=$dbname", $username,$password);
        //set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $conn->setAttribute(PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 1);
        //echo "Connected Successfully<br>" /*. $conn*/;
        /*If conncected see if we can pull any data!*/
    }
    catch(Exception $e)
    {
        die( print_r( $e->getMessage()));
    }
    //How many rows in the table
    $TotalRows = $conn->query('select count(*) from pmdb.v_QDefs')->fetchColumn();
    //How many pages will there be
    $pages = ceil($TotalRows / $limit);
    //echo $pages;
    if(isset($_GET['currentpage']))
    {
        //var_dump($_GET);
        $currentpage = $_GET['currentpage'];
    }
    else
    {
        $currentpage = 1;
    }

    // if current page is greater than total pages...
    if ($currentpage > $pages) 
    {
       $currentpage = $pages;
    } 

    // if current page is less than first page...
    if ($currentpage < 1) 
    {
       $currentpage = 1;
    } 
    //Calculate Offset
    $offset = abs(($currentpage - 1) * $limit);

    $range = 3;
    echo "<p>";
    if($currentpage > 1)
    {
        echo "<a href='{$_SERVER['PHP_SELF']}?currentpage=1'> << </a> ";
        $prevpage = $currentpage - 1;
        echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$prevpage'> < </a> ";
    }
    //Setting the number of links for pages around the current page
    for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++)
    {
        if (($x > 0) && ($x <= $pages))
        {
            if ($x == $currentpage)
            {
                echo "[<b>$x</b>]";
            }
            else 
            {
                echo "<a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a>";
            }
        }
    }

    if ($currentpage != $pages)
    {
        $nextpage = $currentpage + 1;
        echo "<a href='{$_SERVER['PHP_SELF']}?currentpage=$nextpage'> > </a>";
        echo "<a href='{$_SERVER['PHP_SELF']}?currentpage=$pages'> >> </a>";
    }
    echo "</p>";
    //Some info to display to the user?
    $start = $offset + 1;
    $end = min(($offset + $limit),$TotalRows);
    echo '<div id="paging"><p>',' Page ',$currentpage, ' of ',$pages,' pages, displaying ',$start,'-',$end, ' of ',$TotalRows,' results ',$nextlink,' </p></div>'; //display the paging information

    $tsql = "select Id,QSrc,QName,isActive,RunReport,FilePath,QDef from pmdb.v_QDefs order by Id OFFSET $offset ROWS FETCH NEXT $limit ROWS ONLY";

    $getqueries = $conn->query($tsql);

    $queries = $getqueries->fetchALL(PDO::FETCH_ASSOC);

    $countqueries = count($queries);

    if(isset($countqueries))
    {
        if($countqueries > 0)
        {
            //echo "There are queries returned";
            BeginQueriesTable($countqueries);
                $CountValues = 1;
            foreach($queries as $query)
            {
                PopulateQueryTable($query,$CountValues);
                $CountValues = !$CountValues;
            }
            EndQueriesTable();
        }
        else
        {
            echo "<br>Values returned: $countqueries";
        }
    }
    else
    {
        echo "No count";
    }

    function BeginQueriesTable($rowCount)
    {
        $headings = array("Edit","Id","QSrc","QName","isActive","RunReport","FilePath","QDef");
        echo "<table class=" . chr(34) . "tab" . chr(34) . "id=" . chr(34) . "OuterTable" . chr(34) . ">";
        echo "<tr>";
        foreach($headings as $heading)
        {
            echo "<th class=" . chr(34) . "cell" . chr(34) . ">$heading</th>";
        }
        echo "</tr>";
    }

    function PopulateQueryTable($values,$Number)
    {
        $queryID = $values['Id'];
        echo "<tr class=" . chr(34) . "row" . ($Number) . chr(34) . "><td><a href=" . chr(34) . "EditQDefForm.php?id=" . $values['Id'] . chr(34) . ">Edit</a></td>";
        foreach($values as $key=>$value)
        {
            if(!is_null($value))
            {
                echo "<td>$value</td>";
            }
            else
            {
                echo "<td></td>";
            }
        }
        echo "</tr>";
    }

    function EndQueriesTable()
    {
        echo "</table><br/>";
    }
?>
    </body>
</html>

这个现在正在工作,并且当前每页显示15行。我只是使用那个数字使它快速。我会在完成网站之前增加行数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接