首页 > 解决方案 > 使用 cronJob 和 SQL 为记录创建 PHP 数据库,通过每晚将值向右移动来更新数据库

问题描述

在询问有关如何在每个午夜运行 PHP 脚本的先前问题后,我正在尝试运行 CronJob PHP 脚本。从那以后,我一直被一个看似微不足道的问题难住了。我已经阅读了几篇关于从数据库中获取行、回显值等的文章,并且一直在实现代码。但似乎它们并不是要运行一个 php 文件。所以这里是代码

<?php
$connection = mysqli_connect('localhost', 'root', '', 'pointsmanager');
$before0d = "SELECT * FROM points WHERE today_points";
$before1d = "SELECT * FROM points_history WHERE 1d_before";
$before2d = "SELECT * FROM points_history WHERE 2d_before";
$before3d = "SELECT * FROM points_history WHERE 3d_before";
$before4d = "SELECT * FROM points_history WHERE 4d_before";
$before5d = "SELECT * FROM points_history WHERE 5d_before";
$before6d = "SELECT * FROM points_history WHERE 6d_before";
$before7d = "SELECT * FROM points_history WHERE 6d_before";

UPDATE points_history
SET 1d_before = $before0d, 2d_before = $before1d, 3d_before = $before2d, 4d_before = $before3d, 5d_before = $before4d, 6d_before = $before5d, 7d_before = $before6d,
WHERE condition;
?>

这就是我想做的。我想创建用户每天获得的积分的历史日志。在一个数据库中,我希望它选择一个名为 today_points 的列并将其存储在一个变量中:

查看名为“点”的数据库

然后,我希望它将数据库中一周的每个值存储在一个变量中。

查看数据库“points_history”

最后,通过将所有当前值向右移动来更新 points_history

看这里

并从另一个名为“points”的数据库中获取名为“today_points”的列的值并将其放入“1d_before”(因此,每个午夜,所有值都向右移动一个,“今天的点数”现在是前一天)可以任何人都告诉我如何在 PHP 中做到这一点。老实说,我通过上面的代码片段尽了最大的努力。但它不起作用。任何人向我展示任何类似的代码将不胜感激。谢谢!

标签: phpmysqlsqlrow

解决方案


就像 Dharman 所说,您需要规范化您的表以将值存储在单独的行而不是列中。但是,如果您需要如何在现有结构中执行此操作的解决方案,那么这里是查询,

UPDATE points_history 
SET
    7d_before = 6d_before,
    6d_before = 5d_before,
    5d_before = 4d_before,
    4d_before = 3d_before,
    3d_before = 2d_before,
    2d_before = 1d_before,
    1d_before = (
        SELECT 
            today_points
        FROM
            points
        WHERE
            user_id = '123'
        )
WHERE
    user_id = '123';

假设您要为用户 ID '123' 更新它。为了将值向右移动,我们首先将第 6 天的值复制到第 7 天,然后将第 5 天的值复制到第 6 天,然后将第 4 天的值复制到第 5 天,依此类推。最后,我们将通过从today_points表中选择来更新第一天的值。

这是工作小提琴


推荐阅读