根据时间选择用户

1hdlvixo  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(270)

我提供24小时试用会员在我的android应用程序。我对php了解不多。我想检查用户注册时间,并希望禁用试用会员资格,如果24小时过去了。我已经为此制作了一个小php文件。

$sql = "SELECT id, email, registration_time FROM user WHERE trial = 1";
$result = $conn->query($sql);

if($result) {
    while($row = $result->fetch_row()) {
        $id = $row[0];
        $email = $row[1];
        $registrationTime = strtotime($row[2]);
        $currentTime = strtotime("-1 day");
        if($currentTime > $registrationTime) {
            $update = "UPDATE user SET trial = 0 WHERE email = '$email'";
            $conn->query($update);

            $update = "UPDATE number_list SET disable = 1 WHERE user_id = $id";
            $conn->query($update);
        }
    }
}

它不提供任何结果,即使我有一个用户的时间超过48小时。
如何解决这个问题?

a11xaf1n

a11xaf1n1#

试试这个,检查一下

$currentTime=date('m-d-Y',strtotime($registrationTime . "-1 days"))
soat7uwm

soat7uwm2#

您应该使用一个准备好的语句来更新具有相同电子邮件的所有用户的数据库(您的第一个更新查询)。另请参阅文档。
如果有人用这样的电子邮件地址注册 test'; DROP ALL TABLES; --@gmail.com 1此代码将尽职尽责地删除您的数据库。不要像那样直接把用户数据放到代码中。
现在让我们看一下示例代码;

$sql = "SELECT id, email, registration_time FROM user WHERE trial = 1"; 
$result = $conn->query($sql);
if($result) {
    while($row = $result->fetch_row()) {

你是说根本没有结果。我假设您已经用debug语句测试了输出。e、 g.推杆 echo 'users exist'; 在这两者之间。首先要做的是检查你的 user 表(如果有行)。此sql查询是否生成结果?
假设是这样,那么sql语句似乎没有任何问题。假设你有一张table叫 user 有四列 id , email , registration_time ,和 trial 它应该产生结果。
接下来,您要做的是阅读查询函数文档。如您所见,当查询失败时,无论出于何种原因,它都返回false。尝试编写一个else代码块并记录发生的错误。您可以使用error函数获取它 mysqli::error . 尝试附加此代码;

} else { 
    echo "MySQL Error: " . $conn->error;
}

在那里你可以替换 echo 与你的错误处理的选择。如果要在应用程序中执行多个查询,那么为mysqli编写一个 Package 器可能是个好主意。这样,您就可以在 Package 器类中编写错误处理程序,用于在查询或数据库连接失败时应用程序应该执行的操作。
同样可能的情况是,当初始查询成功并获取一些行时,时间检查失败。您可能需要执行比使用更严格的日期/时间解析 strtotime 希望一切都好。假设您使用时间戳列来存储数据,您可以使用:

function readDatabaseTimestampValue($value) {
    $dateTime = date_create_from_format("Y-m-d H:i:s", $value);
    $timestamp = $dateTime->getTimestamp();
    return $timestamp;
}

检查从数据库返回的确切时间数据。日期和时间是复杂的,如果事情被重新解释,比如说sql中的日数可能会变成php应用程序中的年,这可能会导致奇怪的错误。e、 g.你可以这样做,比如说:

echo "24 hours ago: " . strtotime("-1 day") . ", user data: " . $row[2];

接下来,逻辑上可能有一些错误“24小时前”最好这样做,因为当人们弄乱日历时,使用“-1天”会引起奇怪的问题:

$timestamp = time() - 86400;

一天有86400秒(不包括dst和leap秒,但是你想要24小时的订阅时间,而不是3月21日前后的23小时)。
最后,如果同一个电子邮件地址在表中出现多次,就会出现问题。您将为一个用户将“试用”设置为0,但如果两个用户在同一24小时内使用同一电子邮件注册,则可以为另一个用户设置“禁用”标志。如果后者保证是唯一的,那么这就不是问题。否则,您可能需要更新 id 在两张table上。
接下来,我们可以看看一些优化。现在,你从数据库中获取所有信息。但是,通过注册时间索引和使用数据库的排序功能,您可以做得更好/更快。e、 假设我们知道24小时前的确切日期/时间 $yesterday 在php中,我们可以编写如下查询:

SELECT id, email, registration_time FROM user WHERE trial = 1 AND registration_time > ?

绑定 $yesterday 参数的变量。现在你不再需要 if() 声明;数据库会帮你做的。而且,随着数据库的增长,您不会每次代码运行时都逐个检查旧记录。
1注意,这可能不是一个合法的电子邮件地址,但即使使用合法的电子邮件地址,也可能有做坏事的方法。

相关问题