*此代码应更新表格,显示每个用户的回合。我希望每个用户每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();
- 表格根本没有更新
答案 0 :(得分:0)
$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和预备语句。