根据时间php选择用户

时间:2018-04-13 09:31:30

标签: php mysql mysqli

我在我的Android应用程序中提供24小时试用会员资格。我不太了解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小时,也没有提供任何结果。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

试试这个并检查

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

答案 1 :(得分:0)

您应该使用预设语句为具有相同电子邮件的所有用户(您的第一个更新查询)更新数据库。另请参阅documentation

如果有人使用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()) {

你说根本没有结果。我假设您已使用调试语句测试了输出。例如。把echo 'users exist';放在这里。首先要做的是检查user表是否有任何行。这个SQL查询是否产生结果?

假设确实如此,那么SQL语句似乎没有任何问题。假设您有一个名为user的表,其中包含四列idemailregistration_timetrial,它应该会产生结果。

接下来,您要做的是阅读query function documentation。正如您所看到的,当查询失败时,无论出于何种原因,它都返回FALSE。尝试编写“else”代码块并记录发生的错误。您可以使用错误函数mysqli::error来获取它。尝试附加此代码;

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

您可以将echo替换为您选择的错误处理。 如果要在应用程序中执行多个查询,为mysqli编写包装器可能是个好主意。这样,您可以在包装器类中编写错误处理程序,以便在查询或数据库连接失败时应用程序应该执行的操作。

也可能是这样的情况是,当您的初始查询成功并获取某些行时,时间检查失败。您可能希望进行比使用strtotime更严格的日期/时间解析并希望获得最佳结果。假设您正在使用TIMESTAMP列来存储数据,您可以使用:

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

检查从数据库返回的确切时间数据。日期和时间都很复杂,如果重新解释,可以说SQL中的日期编号可能会成为PHP应用程序中的年份,这可能会导致奇怪的错误。例如。你可以这样说:

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

接下来,您可能在逻辑中有一些错误。 “24小时前”做得更好,因为当人们弄乱日历时,使用“-1天”将导致奇怪的问题:

$timestamp = time() - 86400; 

一天有86,400秒(好吧,不包括DST和闰秒,但你需要24小时的订阅时间,而不是3月21日 st 的23小时)。

最后,如果表中存在多个相同的电子邮件地址,则会出现问题。您将为一个用户将'trial'设置为0,但如果两个用户在相同的24小时内使用相同的电子邮件注册,则可以为另一个用户设置'禁用'标志。如果后者保证是唯一的,那么这不是问题。否则,您可能希望在两个表中按id进行更新。

接下来,我们可以看一些优化。现在,您从数据库中获取所有内容。但是,通过在registrationTime上使用索引并使用数据库的排序功能,您可以做得更好/更快。例如。假设我们知道24小时前的确切日期/时间为$yesterday,我们可以编写如下查询:

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

$yesterday变量绑定到参数。现在您不再需要if()声明;数据库为你做。此外,随着数据库的增长,每次代码运行时,您都不会逐个检查旧记录。

1 请注意,这可能不是合法的电子邮件地址,但即使使用合法的邮件地址,也可能有办法做坏事。