";[总计]的装载记录编号[#]”;进度条


"Loading Record Number [##] of [Total]" progress bar

我有一个问题可能没有解决方案,但希望有人能解决这个问题。

我用PHP/MMySQL开发了一个使用HTML/CSS处理工资单的网站。当用户提交过去(2周)的工资单时,它会处理每个员工的工作时间。对于<50名员工可以很快处理,但对于拥有100多名员工的公司来说,处理可能需要相当长的时间。理想情况下,我想要的不是通用的"加载"栏或估计的"35%加载"栏,因为每家公司的工资单在员工数量上会有很大差异。

最好的解决方案是,一旦他们提交了支付期限,我就可以从PHP/MySQLProcessor/DB传递总记录编号,然后在PHP处理器处理每个员工时更新编号,这样用户就会看到"处理134名员工中的35名",例如,"35"会随着每个记录的处理而增加和更新。或者,如果不可能的话,我甚至可以用一个动态列表,比如:

正在处理员工1(共134人)
正在处理员工2(共134人)
正在处理员工3(共134人)
正在处理134名员工中的4名
等等

Ajax或Javascript似乎是实现这一目标的最佳选择,但我还不知道如何使用它们来实现这一点。如有任何帮助或见解,我们将不胜感激。如果我发现了什么,我会继续寻找并更新这篇文章。

我已经通过在批处理中迭代时调用PHP中的flush()命令做到了这一点,但您可能会遇到棘手的问题,需要更新隐藏字段,并在setTimeOut上使用javascript函数来检查该值并更新进度条。

  • http://php.net/manual/en/function.flush.php

进度条:

  • http://docs.jquery.com/UI/Progressbar

我会用动态列表做的是:

 $count = 0;
 // some db query
 // start output
 echo "<ul>";
 // iterate through records and perform dynamic insert
   $count ++;
   echo "<li>Processed " . $count . " records.</li>";
   flush();
 // end iteration
 // end output
 echo "</ul>";

如果您只想更新每%的记录,那么就像您所说的那样,获取一个总数,那么也许可以在If子句中使用模数运算符。例如,如果您有50条记录,并且希望每5条更新一次,如果($count mod 5==0){echo…flush()}

您必须结合Mike S.的建议和快速ajax调用(比如每500毫秒一次)。您可以对从PHP文件写入的文本文件进行ajax调用。。。。

例如:

<?php
    $count = 0;
mysql_connect('blahblah');
 // start output
$query = mysql_query("SELECT ...");
while($rs = mysql_fetch_assoc($query)) {
    $fh = fopen('filename.txt','w');
    fwrite($fh, $count);
    fclose($fh);
    ++$count
}
?>

然后,您需要每隔500毫秒(或更早)对filename.txt文件进行一次ajax调用,并读取该文件的内容,以查看您在处理请求方面的进展情况。您甚至可以在php文件[current_count]-[total_count]的内容中进行类似的操作(15-155表示总共155条记录中的第15条记录),并在javascript编码中执行results.split('-')

我的方法是将记录总数和当前记录数存储在会话变量中。然后设置一个php页面,返回"Processing employee$currentRec of$totalRec"的text.html。

当您从主页面提交请求时,在页面上显示一个div以显示状态消息。启动一个ajax请求来处理数据,并在数据完成后让它隐藏div。处理记录的代码可以在会话变量进行时对其进行更新。同时,启动一个定期的ajax请求,该请求获取状态消息并用响应更新div的内容。继续执行此操作,直到div不再可见为止。在处理数据时,页面上应该弹出一条状态消息,显示当前记录编号,它会根据您设置更新计时器的方式随时更新。

具体的实现将取决于您是否使用jQuery、prototype、纯Javascript等。