string & int не работает должным образом в strtotime - PullRequest
0 голосов
/ 22 ноября 2018

В этом случае $interval я даю как целое число означает, что он работает нормально, возвращая истину, предположим, что $interval я даю как строку, значит не работает должным образом, возвращая ложь.

сценарий 1

    <?php
$restDate = "2018-11-21 11:58:55";
$difference = strtotime(date('Y-m-d H:i:s')) - strtotime($restDate);
$interval = 60 * 60 * 24 * 7;
if($difference <= $interval){
    $data['passwordResetStatus'] = true;
}else{
    $data['passwordResetStatus'] = false;
}

var_dump($data);
?>

Выход

array(1) { ["passwordResetStatus"]=> bool(true) }

сценарий 2

    <?php
$restDate = "2018-11-21 11:58:55";
$difference = strtotime(date('Y-m-d H:i:s')) - strtotime($restDate);
$interval = "60 * 60 * 24 * 7"; // changes from here
if($difference <= $interval){
    $data['passwordResetStatus'] = true;
}else{
    $data['passwordResetStatus'] = false;
}

var_dump($data);
?>

Выход

array(1) { ["passwordResetStatus"]=> bool(false) }

Мой ожидаемый выход

сценарий 2 и он должен возвращаться как array(1) { ["passwordResetStatus"]=> bool(true) }

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вместо ввода пользователем "60 * 60 * 24 * 7", не может ли пользователь ввести "1 неделя"?

Если да, то гораздо более безопасный способ, чем eval, - это использовать strtotime для вычислениявремя.

echo strtotime("1 week")-time();
// Same as 60*60*24*7
0 голосов
/ 22 ноября 2018

Почему бы не работать с классами PHP DateTime?Вот короткое решение.

$today = new \DateTime();
$rest = new \DateTime('2018-11-21 11:58:55');

$interval = $rest->diff($today);

$passwordValid = $interval->format('%a') >= 7 ? false : true;

Что я здесь сделал?Сначала нам нужно сегодня время.После этого нам нужно время, с которым мы сравниваем сегодняшнее время.Оба раза являются экземплярами DateTime.Из-за этого мы можем легко вычислить разницу между двумя временами.Класс DateTime получил метод diff, который вычисляет разницу между двумя объектами DateTime.Он возвращает DateInterval объект, который содержит разницу.Теперь мы можем сравнить рассчитанную разницу с вашим интервалом в 7 дней.

Довольно просто, хм?

0 голосов
/ 22 ноября 2018

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

fe:

$interval = array_product(explode('*',"60 * 60 * 24 * 7"));
...