Даты и математика в 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
слабый
(strtotime($decodedQuery) + strtotime('+30 Days')
Результаты к текущей дате плюс 30 дней в секундах плюс время декодированного запроса в секундах.- Ваше сравнение секунд с эпохи до строки