我授权网站的付费会员在30天内与非会员分享优质内容。以下是我要完成的任务:
首先,订阅者填写表单以向其好友生成电子邮件,该好友生成内容登录页面的URL。因为我不希望他们轻松能够操纵这个,所以我所做的只是将一个base64编码的日期追加到着陆页网址。
$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 = $_SERVER['PHP_SELF'];
$url_components = parse_url($url);
$query = $url_components['query'];
$decodedQuery = base64_decode($query);
现在我想在创建网址30天后显示错误消息,这就是我被困住的地方。我试过这样的尝试并没能得到我需要的东西:
if ((strtotime($decodedQuery) + strtotime('+30 Days')) > date('Y-m-d){
Display error Message
} else {
Display Success Message
}
但数学并不合适。有任何想法吗?或者有更好的方法来实现这一目标吗?
答案 0 :(得分:3)
您正在使用可以轻松操作的base64()
,而是在数据库中存储唯一的id
,存储创建记录的日期。现在使用此id
创建网址而不是使用日期,也可以为每条记录节省几个字节。
现在,当用户访问时,使用该唯一id
从数据库中获取日期,并使用strtotime()
与当前时间进行比较。
例如......假设X先生得到了一个像
这样的网址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
}
您也可以通过用字母替换数字来为此创建自己的散列机制,但如果您使用唯一ID概念则更好,因为您不必在丢失编码的网址中泄露数据。
答案 1 :(得分:2)
有什么想法吗?
您正在将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){
答案 2 :(得分:0)
(strtotime($decodedQuery) + strtotime('+30 Days')
结果显示当前日期加上30天秒数加上解码查询的时间(以秒为单位)。 答案 3 :(得分:0)
尝试
if(strtotime($decodedQuery.' + 30 Days') > date('Y-m-d) )
但是,base64
很弱
答案 4 :(得分:0)
尝试,
if (strtotime($decodedQuery) < strtotime('-30 Days')) {
//$decodedQuery is more than 30 days in the past
}