Cron更新MySQL

时间:2017-03-06 15:31:03

标签: php mysql cron

我正在努力使用我的代码来使用CRON更新mysql条目。也许我只是看不出我做错了什么,但是maaan ..我的头已经因为过度思考而受伤。

*此代码应更新表格,显示每个用户的回合。我希望每个用户每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);
}
问题是,现在我有4个条目。

id  free  saved    lost
1    2      300   19568
2    200    250   19568
3    6      300   19568
4    7      300   19568

但更新后看起来像这样:

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();

- 表格根本没有更新

2 个答案:

答案 0 :(得分:0)

即使所有if / elseif都失败,也会运行

$roundSql。结果是,根据数据,您可能会有一个查询 - 为特定free递增id - 运行多次。有几种方法可以解决这个问题,包括:

1 - 在if / elseif的末尾有一个else来进行查询 - 即使它是一个空的MySQL语句 - 当所有其他选项都失败时。

2 - 在if语句之前初始化$roundSql。在查询之前,检查它是否为空,只检查它是否为空白。

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

答案 1 :(得分:0)

考虑在单个查询中执行此操作,这将更可靠(特别是对于并发表访问),更容易推理和执行更快:

$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
);

作为旁注,mysql_*函数在PHP 5.5中已弃用,并且它们存在一些严重的SQL注入漏洞问题。请考虑使用PDO和预备语句。