4

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

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

最好的解决方案是,一旦他们提交了支付周期,我就可以从 PHP/MySQL 处理器/DB 传递总记录数,然后在 PHP 处理器处理每个员工时更新该数字,这样用户就会看到“Processing Employee 35 of 134”,例如“35”会随着每条记录的处理而增加和更新。或者,如果不可能,我什至可以使用动态列表,例如:

处理 134 名员工 1
处理 134 名员工 2
处理 134 名员工 3
处理 134 名员工 4
等等......

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

4

3 回答 3

0

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

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

确切的实现将取决于您是否使用 jQuery、原型、纯 Javascript 等...

于 2013-04-08T06:43:35.220 回答
0

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

和进度条:

我会对动态列表做的是:

 $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 条更新一次, if($count mod 5 == 0) { echo ... flush() }

于 2012-07-13T18:06:04.503 回答
0

您必须将 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] 的内容(总共 155 条记录中的第 15 条记录为 15-155)并results.split('-')在您的 javascript 编码中执行。

于 2012-07-13T19:08:30.193 回答