【发布时间】:2017-03-07 07:00:18
【问题描述】:
我正在努力使用 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();
--table 根本没有更新
【问题讨论】:
-
为什么你甚至需要在 PHP 中这样做?您可以使用一条语句完全在 MySQL 中执行此查询。
-
请先阅读How to Ask。你完全忽略了告诉我们你的代码应该做什么,以及你得到的结果是什么原因是错误的。
-
我无法使用 MySQL,因为我的托管服务提供商不允许我使用触发器
-
@SLUNlCKO 我的意思是,无论您如何调用查询,您都可以在一个查询中完成所有这些操作。您现在执行此操作的方式(选择所有行,使用 PHP 分析数据,然后运行一堆查询来更新数据)是脆弱的,如果表有并发更新,则会中断。您可以简单地执行一条 SQL 语句(通过 PHP)并完成它。
-
@cdhowie 的意思类似于:
UPDATE rounds SET free = case when free < 200 then free + 1 else free end, saved = case when ..... where id = ....