PHP - Рассчитать время между датами - PullRequest
0 голосов
/ 14 октября 2010

хотел бы узнать, как я могу рассчитать время между двумя датами.Я работаю над пользовательской функциональностью Unlock, и вот что у меня есть:

// get offender's username from session  
$username = $_SESSION['UserName'];  
require_once('./connections/mysql.php');  

$checklockoutexpiration = mysqli_query($conn,"SELECT IsLockedOut, LastLockoutDate FROM users WHERE UserName = '$username' Limit 1") or die($dataaccess_error);  

if(mysqli_num_rows($checklockoutexpiration) == 1)  
{  
    $row = mysqli_fetch_array($checklockoutexpiration);  
    $islockedout = $row['IsLockedOut'];  
    $lastlockoutdate = $row['LastLockoutDate'];  
}  

if(**$islockedout == 1 && $lastlockoutdate + LOCKOUT_DURATION_IN_MINUTES < getdate()**)  
{  
    // unlock user  
}  

Дата блокировки находится в базе данных в форме NOW () и выглядит как 2010-10-13 13:01: 05.Я предполагаю, что это серверное время, которое на данный момент является моей локальной машиной для разработки.

ВОПРОС: Как сделать жирную линию в коде.

В asp.net я бы сделал что-то вроде:

// if lockout datetime + lockout duration is less than datetime now  
if (usrInfo != null && usrInfo.IsLockedOut && usrInfo.LastLockoutDate.ToUniversalTime().AddMinutes(passwordAttemptLockoutDuration) < DateTime.UtcNow)  
{  
// then automatically Unlock user  
    usrInfo.UnlockUser();  
}  

Может кто-нибудь показать мне, как это делается? Спасибо!

Ответы [ 5 ]

3 голосов
/ 14 октября 2010

Используйте http://php.net/strtotime, чтобы превратить дату в формате "2010-10-13 13:01:00" в секунды с начала эпохи как целое число.

Используйте http://php.net/time дляполучить текущие секунды с эпохи как целое число.

Тогда это просто.

1 голос
/ 14 октября 2010

Уже есть приемлемые ответы ... поэтому я покажу другой подход.Я бы изменил строку запроса на:

SELECT IsLockedOut, LastLockoutDate, 
    (addtime(LastLockoutDate, $passwordAttemptLockoutDuration) < NOW()) unlocked 
FROM users WHERE UserName = '$username' Limit 1

Где $ passwordAttemptLockoutDuration строка вида «часы: минуты: секунды»

Значение «разблокировано» будет равно 0 (или ложно) если они все еще заблокированы, и будет 1, если они смогут войти снова.

0 голосов
/ 14 октября 2010

Спасибо за все советы.Я решил проблему, добавив новый столбец (LastUnlockDate).Когда пользователь блокируется, я устанавливаю IsLockedOut на 1, LastLockoutDate на NOW () и LastUnlockDate на NOW () + $ lockoutduration (в секундах).

Тогда часть моего кода выглядит примерно так:

//------------------------------------------------------------  
// if lockout session exits  
//------------------------------------------------------------  

if(!empty($_SESSION['count']))
{  
    require_once('./connections/mysql.php');  
    require_once('./web.config.php');  
    require_once('./controls/login/error_messages.php');  

    $count = $_SESSION['count'];
    $offender = mysqli_real_escape_string($conn, $_SESSION['offender']);
    $maxloginattempt = MAX_LOGIN_ATTEMPT;

    if($count >= $maxloginattempt)
    {
        echo $maxloginattempt_error;
        $showform = 0;

        // check if user exists in database
        $checkoffender = mysqli_query($conn, "SELECT UserName, IsLockedOut, LastLockoutDate, LastUnlockDate, NOW() AS ServerTime FROM users WHERE UserName = '$offender' LIMIT 1")
        or die($dataaccess_error);

        if(mysqli_num_rows($checkoffender) == 1)
        {
            $row = mysqli_fetch_array($checkoffender);
            $islockedout = $row['IsLockedOut'];
            $lastlockoutdate = $row['LastLockoutDate'];
            $lastunlockdate = $row['LastUnlockDate'];
            $servertime = $row['ServerTime'];
        }

        // unlock user if lockout has expired
        if($islockedout == 1 && $lastunlockdate < $servertime)
        {
            $unlockoffender = mysqli_query($conn,"UPDATE users SET IsLockedOut = 0 WHERE UserName = '$offender'") 
            or die($updateactivity_error);

            unset($_SESSION['count']);
            unset($_SESSION['offender']);

            $showform == 1;
        }

        // otherwise lockout the user
        if($islockedout == 0)
        {
            $lockoutduration = (LOCKOUT_DURATION * 60);
            $updateoffender = mysqli_query($conn,"UPDATE users SET IsLockedOut = 1, LastLockoutDate = NOW(), LastUnlockDate = (NOW() + $lockoutduration)  WHERE UserName = '$offender'") 
            or die($updateactivity_error);
        }
    }
}

Поскольку этот код основан исключительно на присутствии сеанса, если браузер закрыт и сеанс потерян, пользователь вбаза данных все еще установлена ​​как заблокированная.Итак, чтобы исправить это, я изменил свою фактическую страницу входа, которая теперь проверяет во время аутентификации и разблокирует пользователя, если срок блокировки уже истек.

Спасибо всем за помощь и предложение.В заключение, мой вопрос был , как я могу добавить время к дате - и простой ответ был : NOW () + $ lockoutduration .

0 голосов
/ 14 октября 2010

Если вы хотите сделать это больше как ваш пример ASP, используйте класс DateTime .Вы должны иметь возможность создать его из вашей строки, и вместе с его классом DateInterval вы можете добавить интервал ко времени или использовать diff , чтобы получить интервал из двух раз.

(Похоже, это доступно только в PHP 5.3. Возможно, это нарушит условия сделки.)

0 голосов
/ 14 октября 2010

Краткий ответ: преобразуйте свою метку времени и продолжительность блокировки в секунды, затем сравните.

Длинный ответ:

$lockout = ($lockoutDurationMinutes * 60);
$timestamp= strtotime($yourTimeStampFieldVariable);

if ( ($timestamp + $lockout) > time())
{
// still locked out
}
...