0

我需要您的帮助才能在每个月的第 5 天自动运行以下 php 脚本。目前我手动运行它。这可以使用计划任务吗?此外,我没有对 Web 服务器的管理员访问权限。因此不能使用第三方自动化工具。

PS: 是否可以在具有 Windows 7 xampp 环境的本地计算机上安排此操作,然后再更新远程数据库?

session_start();

if($_SESSION['log'] != "log" || $_SESSION['type'] != "***"){
    header("Location: ***.php");
}

require_once('conf.php');

date_default_timezone_set('Asia/Kolkata');
$date = date("j"); //get current date
$today = date("d-m-Y");  
$now = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm

if ($date === 5){
    //get interest rate
    $sql = mysql_query("SELECT Rate FROM Interest WHERE Ref = 'Loan' ORDER BY Date DESC LIMIT 1");
    $r = mysql_fetch_assoc($sql);
    $rate = $r['Rate'];

    //check for not settled loans
    $check = mysql_query("SELECT LID FROM Registry WHERE Status = 0");
    if (mysql_num_rows($check) > 0){
        while ($list = mysql_fetch_assoc($check)) {     // while there are rows to be fetched...
        //*** Start Transaction ***//  
            mysql_query("BEGIN");  

            $loanID = $list['LID'];

            //get loan data
            $sql = mysql_query("SELECT Registry.Amount, SUM(Account.Total) AS Paid, SUM(Account.Interest) AS intPaid FROM Registry LEFT JOIN Account ON Registry.LID = Account.LID WHERE Registry.Status = 0 AND Account.Auto = 0 AND (Account.LID = '$loanID') GROUP BY Account.LID");
            $r = mysql_fetch_assoc($sql);
            $amount = $r['Amount']; //loan amount
            $paid = $r['Paid'];     //sum of paid
            $intPaid = $r['intPaid'];   //sum of interest paid

            //get sum of monthly automatically updated interest
            $sql = mysql_query("SELECT SUM(Interest) AS Interest FROM Account WHERE Payment = 0 AND Auto = 1 AND LID = '$loanID'");
            $r = mysql_fetch_assoc($sql);
            $autoInt = $r['Interest'];  

            $total = ($amount + $autoInt);  //total to be paid
            $balance = ($total - $paid);    //with no interest

            if ($paid >= $balance){
//              echo "Loan completed <br/>";
            }else{
                $int = ($balance * $rate) / 100;
                $update = mysql_query("INSERT INTO Account (LID, Date, Interest, Total, Auto) VALUES ('$loanID', NOW(), '$int', '$int', 1)") or die(mysql_error());

                if (! $update){
                //*** RollBack Transaction ***//  
                mysql_query("ROLLBACK");  
//                  $_SESSION['error'] = "Interest saving failed.!";
                    echo "Loan ID: " . $loanID . ", Interest: Rs. " . $int . "/= - Update Failed.!<br>";
                }else{
                //*** Commit Transaction ***//  
                    mysql_query("COMMIT");  
//                  $_SESSION['error'] = "Interest saved successfully";
                    echo "Loan ID: " . $loanID . ", Interest: Rs. " . $int . "/= - Update Succeeded.!<br>";
                }
            }
        }
    }
}else{
    echo "Monthly Interest can be update only by 05th day of the month.!";
}
4

4 回答 4

2

我认为at不需要管理员权限

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/at.mspx?mfr=true

编辑:

甚至尝试 MySQL Events

http://dev.mysql.com/doc/refman/5.1/en/events.html

它看起来应该很容易完成的所有数据库工作

于 2013-05-31T10:58:25.767 回答
2

如果它是一个可公开访问的 Web 服务器,您可以使用像https://www.cronjobservice.net/这样的 cronjob 服务。注册后,您输入一个网址和他们调用它的时间。我建议在一个失败的情况下使用其中的多个服务。(您的脚本必须在第一次调用时执行,并在来自其他服务的后续调用时退出。)

请务必正确处理 .htaccess 并确保没有与安全相关的输出。

于 2013-05-31T10:59:09.773 回答
2

您是否询问过托管您网站的人们是否有解决方案?大多数托管公司都有解决方案(即使在 Windows 服务器上)

如果托管公司对此没有解决方案(我严重怀疑),您可以从另一台具有 cron 可能性的服务器外部调用脚本,或者让当天的第一个访问者调用它。

在任何情况下,您都希望在脚本中包含一个检查,以确保您的脚本仅在设定的日期运行(您已经拥有该日期),并确保在当天多次调用脚本没有问题。

PS:如果脚本被第一个访问者调用,您将不得不考虑这样一个事实,即您在特定的日子不可能有任何访问者,因此脚本必须在下一个访问者出现时运行。

于 2013-05-31T11:03:06.563 回答
0

如果您没有对 Windows 的管理访问权限,您将无法创建计划任务。您唯一的选择是在您的应用程序中创建某种自定义任务组件,以检查/存储上次运行脚本的时间。这样做的问题是它依赖于用户活动,并且它可能不会在您想要的确切日期运行。

另一种选择是找到 Linux 托管,以便您可以利用 Cron。

于 2013-05-31T10:55:14.473 回答