2012-12-22 85 views
1

我有一个php文件,我通过cron运行。为了测试,我将它设置为每小时运行一次,但通常每天运行一次。我想要的是,如果玩家的autotechrefinery字段设置为1,那么他们应该从桌子上拿走他们的人口,他们有多少钱,研究用品和技术。php mysql通过cron更新

从那里,我想要的是扣除500研究用品,添加50技术,并从金钱中扣除10%的人口。当我手动运行这个文件时,所有这些似乎都在工作,但是当我让它通过cron自动运行时,有些东西不起作用,因此它将技术设置为50,研究设置为-500,金钱为0

$refCheck = mysql_query("SELECT * FROM players WHERE autotechrefinery='1'"); 
while($rC = mysql_fetch_array($refCheck)) { 

$nation = $rC['nation']; 
$pop = $rC['population']; 
$rsupplies = $rC['researchsupplies']; 
$cash = $rC['money']; 
$tech = $rC['technology']; 

$newtech = $tech+50; 
$newmoney = $cash-($pop*.1); 
$newsupplies = $rsupplies-500; 

mysql_query("UPDATE players SET money='$newmoney', technology='$newtech', researchsupplies='$newsupplies', techbought='1' WHERE autotechrefinery='1'"); } 
+1

在循环结束时,您将'autotechrefinery'设置为1更新每一行,因此每个记录都会根据从db中获取的最后一个记录计算出值。你确定它按预期工作吗? –

+0

您可以添加crontab中的条目以及手动执行的字符串。除此之外,这种更新方法看起来并不安全:另一个脚本可能会更新数据库记录,而您的后续更新会覆盖这些值。更新玩家SET钱=钱 - (人口* 0.1)等将做的伎俩。尽管您可能有一些难以嵌入到SQL语句中的逻辑 –

+0

您正在使用[an **过时的**数据库API](http://stackoverflow.com/q/12859942/19068)并应使用[现代替换](http://php.net/manual/en/mysqlinfo.api.choosing.php)。 – Quentin

回答

2

代码中的错误是:UPDATE将始终更新所有条目。因此,所有条目都会获得循环最后一次传递的值。

要解决,你需要一些ID来识别该行,并在更新使用它的代码:

$refCheck = mysql_query("SELECT * FROM players WHERE autotechrefinery='1'"); 
while($rC = mysql_fetch_array($refCheck)) { 
    $ID = $rC['id']; 
    $nation = $rC['nation']; 
    $pop = $rC['population']; 
    $rsupplies = $rC['researchsupplies']; 
    $cash = $rC['money']; 
    $tech = $rC['technology']; 

    $newtech = $tech+50; 
    $newmoney = $cash-($pop*.1); 
    $newsupplies = $rsupplies-500; 

    mysql_query("UPDATE players SET money='$newmoney', technology='$newtech', researchsupplies='$newsupplies', techbought='1' WHERE id="$ID'); 
} 

你没有要求改进,但你可以实现一个SQL语句相同的结果:

UPDATE players set money=money - population * .1, technology = technology + 50, researchsupplies = researchsupplies - 500; 
+0

我们有一个ID,它只是没有点击我们需要使用它。并感谢你更清洁更新。非常感谢! – Greene345