我的网站是一个社区;我们有论坛和用户资料,每个人都有所谓的“优点”,有点像 StackOverflow 上的“声誉”。我有一个在我制作的计时器上运行的代码。这个计时器有两个脚本运行;一个脚本每天运行一次(完美运行),另一个每周运行一次。
计时器本身工作正常,但是当运行每周代码时,会发生一些非常奇怪的事情:1) 每周代码第一次运行完美,但由于某种原因,整个代码第二次运行时间,并且会发生一些日志记录错误。2) 该程序第二次运行时,忘记了上一次大家登录的时间(如果用户连续两周不活动,系统应该将其功勋状态减一),因此无论如何都会减少大家的功勋他们一直很活跃。
我已经完成了我的作业,我认为这是我的浏览器出错(Firefox 会加载每个页面两次,具体取决于您拥有的插件),但事实并非如此;每个用户都有一个绩效日志,记录影响其绩效状态的每一笔交易。每个人都有两笔系统交易,第二笔交易正好在第一笔交易之后一秒。每个人都有相同的两个时间戳。这意味着,代码贯穿始终,给每个人他们所得到的东西,然后从头开始,正好在一秒钟后。然而,这一次,它无条件地给每个人一个缺点(从他们的优点中减去)。
这一切都不应该发生,因为我的每周计时器做的第一件事是检查它是否是正确的日子,它做的第二件事(如果它是正确的日子)是将计时器更新到下周,所以它一天不会跑两次。
这里是:
<?php
mysql_connect("connect","username","password");
mysql_select_db("seriamus");
$feduby = mysql_query("SELECT day,week FROM timer WHERE name='timer'");
$timer = mysql_fetch_array($feduby);
//Daily Timer
if($timer[0]==date("M j, Y"))
{
$tomorrow = strtotime("+1 day");
mysql_query("UPDATE timer SET day='" . date('M j, Y', $tomorrow) . "' WHERE name='timer'");
mysql_connect("connect","username","password") or die(mysql_error());
mysql_select_db("agluserdatabase");
$getsuspendinfo = mysql_query("SELECT gamertag,rank,sdate,srank FROM users");
while($suspo = mysql_fetch_array($getsuspendinfo))
{
if($suspo[1]=="Suspended")
{
if($suspo[2]==date("M j, Y"))
{
mysql_query("UPDATE users SET rank='" . $suspo[3] . "', srank='', sdate='' WHERE gamertag='" . $suspo[0] . "'");
}
}
}
}
//Weekly Timer
if($timer[1]==date("M j, Y"))
{
$inaweek = strtotime("+7 days");
mysql_query("UPDATE timer SET week='" . date('M j, Y', $inaweek) . "' WHERE name='timer'");
mysql_connect("connect","username","password") or die(mysql_error());
mysql_select_db("agluserdatabase");
$getmeritinfo = mysql_query("SELECT merits,logins,lastseen,demerit,gamertag,rank,userid FROM users");
while($meritinfo = mysql_fetch_array($getmeritinfo))
{
if($meritinfo[3]==0)
{
if($meritinfo[1]>=3)
{
if($meritinfo[5]!="Suspended"&&$meritinfo[5]!="Banned")
{
$newmerits = $meritinfo[0] + 1;
mysql_query("UPDATE users SET merits='" . $newmerits . "' WHERE gamertag='" . $meritinfo[4] . "'");
mysql_query("INSERT INTO meritlog" . $meritinfo[6] . " VALUES ('System', 'Merit', 1, 'Active for a week without getting a demerit', '" . date('M j, Y g:i:s') . "')");
}
}
else if ($meritinfo[1]==0)
{
$two_weeks_ago = strtotime('-14 days', strtotime(date("M j, Y")));
$last_seen = strtotime($meritinfo[2], strtotime(date("M j, Y")));
if($last_seen <= $two_weeks_ago)
{
if($meritinfo[5]!="Suspended"&&$meritinfo[5]!="Banned")
{
$newmerits = $meritinfo[0] - 1;
mysql_query("UPDATE users SET merits='" . $newmerits . "' WHERE gamertag='" . $meritinfo[4] . "'");
mysql_query("INSERT INTO meritlog" . $meritinfo[6] . " VALUES('System', 'Demerit', 1, '2+ weeks of inactivity', '" . date('M j, Y g:i:s') . "')");
if($newmerits <= -10)
{
mysql_query("UPDATE users SET merits = 0 WHERE gamertag = '" . $meritinfo[4] . "'");
mysql_query("UPDATE users SET lastpromotion = '" . date('M j, Y') . "' WHERE gamertag = '" . $meritinfo[4] . "'");
if($meritinfo[5]=="Praetorian")
{
mysql_query("UPDATE users SET rank = 'Centurion' WHERE gamertag = '" . $meritinfo[4] . "'");
}
else if($meritinfo[5]=="Centurion")
{
mysql_query("UPDATE users SET rank = 'Triarius' WHERE gamertag = '" . $meritinfo[4] . "'");
}
else if($meritinfo[5]=="Triarius")
{
mysql_query("UPDATE users SET rank = 'Decanus' WHERE gamertag = '" . $meritinfo[4] . "'");
}
else if($meritinfo[5]=="Decanus")
{
mysql_query("UPDATE users SET rank = 'Prime Legionary' WHERE gamertag = '" . $meritinfo[4] . "'");
}
else if($meritinfo[5]=="Prime Legionary")
{
mysql_query("UPDATE users SET rank = 'Legionary' WHERE gamertag = '" . $meritinfo[4] . "'");
}
else if($meritinfo[5]=="Legionary")
{
mysql_query("UPDATE users SET rank = 'Banned' WHERE gamertag = '" . $meritinfo[4] . "'");
}
}
}
}
}
}
mysql_query("UPDATE users SET logins='0', demerit='0' WHERE gamertag='" . $meritinfo[4] . "'");
}
}
?>
在这段代码中,还有一些与用户排名有关的东西,或者他们当周被记过多少,或者他们是否被暂停或禁止等。它们应该不重要,但我包括了它们无论如何,这样您就可以获得整个代码。
如果您需要我详细说明整个代码的具体设置,请告诉我。
提前感谢您花时间阅读所有这些内容并(希望)帮助我!任何帮助都将不胜感激,即使它是一些与问题完全无关的效率方法——任何帮助都会很棒!:D