Даты и математика в PHP

Я предоставляю платным участникам сайта возможность делиться премиум-контентом с не-участниками в течение 30 дней. Вот что я пытаюсь сделать:

Сначала подписчик заполняет форму, чтобы сгенерировать электронное письмо своему собеседнику, которое генерирует URL для целевой страницы контента. Поскольку я не хочу, чтобы они легко могли с этим манипулировать, все, что я сделал, это добавил дату в кодировке base64 к URL целевой страницы.

$url = "http://www.example.com/video_landing_page.php?" . base64_encode(date('Y-m-d'));

Получатель получит ссылку, которая выглядит как http://www.example.com/video_landing_page.php?MjAxNC0wMi0yNg==

На целевой странице я проанализировал URL, чтобы получить только запрос, и расшифровал его:

$url = $_SERVER['PHP_SELF'];
$url_components = parse_url($url);
$query = $url_components['query'];
$decodedQuery = base64_decode($query);

Теперь я хочу отобразить сообщение об ошибке, если с момента создания URL прошло 30 дней, и я застрял здесь. Я пытался так и не смог получить то, что мне нужно:

if ((strtotime($decodedQuery) + strtotime('+30 Days')) > date('Y-m-d){
    Display error Message
} else {
    Display Success Message
} 

Но математика не выходит правильно. Есть идеи? Или есть лучший способ сделать это?

5 ответов

Решение

Есть идеи?

Вы сравниваете Unix Timstamp со строкой. Это не сработает (как вы ожидаете).

if ((strtotime($decodedQuery) + strtotime('+30 Days')) > date('Y-m-d){

должно быть:

if ((strtotime($decodedQuery) + strtotime('+30 Days')) > time()){

Это сравнивает две метки времени Unix.

Или есть лучший способ сделать это?

Да. использование DateTime() как они сопоставимы:

$now = new DateTime();
$inOneMonth = new DateTime($decodedQuery);
$inOneMonth->modify('+1 month');
if ($inOneMonth > $now){

Ты используешь base64() которые можно легко манипулировать, вместо этого, хранить уникальный id в вашей базе данных сохраните дату создания записи. Теперь используйте это id для создания URL-адресов вместо использования даты также сэкономит вам несколько байтов на запись.

Теперь, когда пользователь посещает, получить дату из базы данных, используя этот уникальный id и использовать strtotime() сравнить с текущим временем.


Например... Предположим, что г-н Х получил URL-адрес как

http://demo.com/landingpage.php?uid=454566

На landingpage.php использовать..

$store_id = (isset($_GET['uid'])) ? $_GET['uid'] : ''; 
// Validate, fetch the row from DB and count, if not 1 than throw error, 
// if it returns one than go ahead

// Or you can use INTERVAL 30 DAY < NOW() if you want MySQL to do the job for you
// Than just compare the row count.. or if you want to do with PHP

if(strtotime($fetched_db_time) < strtotime('-30 days')){
    //Record is 30 days older
}

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

Пытаться,

if (strtotime($decodedQuery) < strtotime('-30 Days')) {
 //$decodedQuery is more than 30 days in the past
}

Пытаться

if(strtotime($decodedQuery.' + 30 Days')  > date('Y-m-d) )

но да, base64 слабый

  1. (strtotime($decodedQuery) + strtotime('+30 Days') Результаты к текущей дате плюс 30 дней в секундах плюс время декодированного запроса в секундах.
  2. Ваше сравнение секунд с эпохи до строки
Другие вопросы по тегам