这就是我所拥有的。此代码从所有用户获取数据,并从user_days中减去1,然后更新每个用户的user_days行。
$result = mysqli_query($con,"SELECT * FROM users");
while($row = mysqli_fetch_array($result))
{
$minusone = $row['user_days']-1;
mysqli_query($con,"UPDATE users SET user_days=$minusone");
echo "<br />";
echo $row['user_days'];
}
我遇到的问题是: 而不是从每个用户减去1并更新每个用户字段, 它使用第一个用户的值更新每个用户的字段。
例如: 在更新之前 用户1有30天 用户2有60天
更新后用户1有29天 用户2有29天(而不是59天)
感谢任何帮助,我希望这个问题很容易理解。
为了澄清,我想更新每个领域。 我只是不希望从第一个结果中复制更新。
感谢所有答案,这给了我很多帮助。
答案 0 :(得分:3)
为什么不运行UPDATE users SET user_days = user_days-1 WHERE id=XXXXX
?然后选择整个事情?
答案 1 :(得分:0)
更新记录时,需要为感兴趣的记录指定用户ID,否则当前查询会更新表中的所有行。
答案 2 :(得分:0)
您应该将哪条记录指向更新
mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id=XXXXX");
答案 3 :(得分:0)
问题在于UPDATE
语句。如果没有WHERE
子句,它会将SET
子句应用于数据库中的每一行。假设您在users表中有一个名为id
的唯一ID列,您可以像这样修改代码:
while($row = mysqli_fetch_array($result))
{
$minusone = $row['user_days']-1;
$user_id = $row['id'];
mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id=$user_id");
echo "<br />";
echo $row['user_days'];
}
答案 4 :(得分:0)
使用以下查询:
mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE user_ID = '".$row['user_ID']."'");
答案 5 :(得分:0)
您正在更新具有相同$minusone
值的所有用户。您需要在update语句中使用WHERE
子句,如下所示:
$result = mysqli_query($con,"SELECT * FROM users");
while($row = mysqli_fetch_array($result))
{
$minusone = $row['user_days']-1;
$id_user = $row['id_user'];
mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id_user = $id_user");
echo "<br />";
echo $row['user_days'];
}
做你想做的事的另一种方式是:
...
$result = mysqli_query($con,"UPDATE users SET user_days = user_days - 1");
...
这假设您要将1替换为所有user_days
。
答案 6 :(得分:0)
正如其他答案所指出的,最好的方法是用一行替换整个代码块。
mysqli_query($con, "UPDATE users SET user_days=user_days-1");
然后您可以根据需要选择并显示信息。
在不确切知道您使用user_days
的情况下,我认为可能有更好的方法来解决您的目标。我假设这是某种订阅服务,并且此代码将每天运行一次以减少允许它们访问服务的天数。
更好的方法是在数据库中使用subscriptionExpires
字段,该字段将保存日期时间值。使用您的方法,如果运行此任务的作业失败,每个用户将获得额外的一天。如果网络蜘蛛或用户找到您的脚本,您的用户帐户将提前到期。如果您使用帐户到期时的实际日期,则无法猜测当前值是否正确。