Php Cron更新MySQL

Php Cron更新MySQL,php,mysql,cron,Php,Mysql,Cron,我正在努力使用CRON更新mysql条目。也许我只是看不出我做错了什么,但是马安。。我的头已经因为过度思考而痛了 *这段代码应该更新为每个用户显示轮数的表。我想为每个用户每10分钟增加一轮 这是每10分钟执行一次的代码: $conn = mysql_connect($dbhost, $dbuser, $dbpass); mysql_select_db('universe_domination'); $sql = mysql_query("SELECT * FROM rounds"); forea

我正在努力使用CRON更新mysql条目。也许我只是看不出我做错了什么,但是马安。。我的头已经因为过度思考而痛了

*这段代码应该更新为每个用户显示轮数的表。我想为每个用户每10分钟增加一轮

这是每10分钟执行一次的代码:

$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db('universe_domination');
$sql = mysql_query("SELECT * FROM rounds");
foreach (mysql_fetch_array($sql) as $row) {
    $id = $row['id'];
    $free = $row['free'];
    $saved = $row['saved'];
    $lost = $row['lost'];
    if ($free < 200) {
        $roundSql = "UPDATE rounds SET free = free + 1 WHERE id = " . $id;
    } elseif ($free == 200 && $saved < 300) {
        $roundSql = "UPDATE rounds SET saved = saved + 1 WHERE id = " . $id;
    } elseif ($free == 200 && $saved == 300) {
        $roundSql = "UPDATE rounds SET lost = lost + 1 WHERE id = " . $id;
    }
    mysql_query($roundSql);
}
但更新后的情况如下所示:

id  free  saved    lost
1    6      300   19568
2    200    250   19568
3    6      300   19568
4    9      300   19568
谁能告诉我那个密码有什么问题吗?我相信这是一些初学者的错误,但我找不出哪里错了

**到目前为止,它把它编辑错了。。。一行加4轮,第三行不加,第四行加2轮

****使用后仍然没有运气:

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $sql = "UPDATE rounds SET free = free + (CASE WHEN free < 200 THEN 1 ELSE 0 END),
            SET saved = saved + (CASE WHEN saved < 300 THEN 1 ELSE 0 END),
            SET lost = lost + (CASE WHEN free = 200 AND saved = 300 THEN 1 ELSE 0 END)";
    $updateRound = $conn->prepare($sql);
    $updateRound->execute();
-表根本不会更新

$roundSql正在运行,即使all if/elseif失败。结果是,根据数据的不同,您可能会有一个查询(对于特定id,可以自由递增)多次运行。有几种方法可以解决这个问题,包括:

1-在if/elseif的末尾有一个else,以便在所有其他选项都失败时进行查询(即使它是null MySQL语句)

2-在if语句之前初始化$roundSql。在查询之前,请检查它是否为空,并仅在它不为空时执行查询


作为一种调试工具,添加一些print语句以查看正在运行的查询。

考虑在一个查询中完成这一切,这将更可靠,尤其是在并发表访问中,更容易推理,执行更快:

$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db('universe_domination');

mysql_query(<<<SQL
UPDATE rounds
SET free = free + (CASE WHEN free < 200 THEN 1 ELSE 0 END),
    saved = saved + (CASE WHEN free = 200 AND saved < 300 THEN 1 ELSE 0 END),
    lost = lost + (CASE WHEN free = 200 AND saved = 300 THEN 1 ELSE 0 END);
SQL
);

另外,PHP 5.5中不推荐使用mysql_*函数,它们存在一些严重的SQL注入漏洞问题。请考虑使用PDO和准备好的语句。

为什么你甚至需要在PHP中这样做?您可以完全在MySQL中进行此查询,只需一条语句。请先阅读。你完全忽略了告诉我们你的代码应该做什么,以及为什么你得到的结果是错误的。我不能使用MySQL,因为我的托管提供商不允许我使用MySQLtriggers@SLUNlCKO我的观点是,无论如何调用查询,都可以在一个查询中完成这一切。现在选择所有行,用PHP分析数据,然后运行一系列查询来更新数据的方法是脆弱的,如果同时更新表,这种方法就会中断。您只需通过PHP执行一条SQL语句就可以了。@cdhowie说的是:UPDATE rounds SET free=case when free<200然后free+1 else free end,saved=case when。。。。。其中id=…将您的解决方案与mysqli或PDO一起使用不起作用。。首先,我注意到我的主机提供商对MySQL使用了不同的端口,所以在没有定义端口的情况下,它无法正常工作。你的解决方案是错误的,因为它对每一列都使用SET。我的错,你是对的;我已经移除了多余的套件,现在应该可以用了。
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db('universe_domination');

mysql_query(<<<SQL
UPDATE rounds
SET free = free + (CASE WHEN free < 200 THEN 1 ELSE 0 END),
    saved = saved + (CASE WHEN free = 200 AND saved < 300 THEN 1 ELSE 0 END),
    lost = lost + (CASE WHEN free = 200 AND saved = 300 THEN 1 ELSE 0 END);
SQL
);