我授予网站的付费会员与非会员共享优质内容的能力,为期 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 = $_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
}
但数学结果并不对。有什么想法吗?还是有更好的方法来实现这一目标?
您正在使用可以轻松操作的base64()
,而是在数据库中存储唯一的id
,存储创建记录的日期。现在使用此id
创建 url 而不是使用日期,每条记录也会节省几个字节。
现在,当用户访问时,使用该唯一id
从数据库中获取日期,并使用strtotime()
与当前时间进行比较。
例如。。。假设 X 先生得到了一个类似 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
}
您还可以通过用字母替换数字来创建自己的哈希机制,但最好使用唯一 ID 概念,因为您不必通过丢失编码泄露 url 中的数据。
有什么想法吗?
你正在将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){
-
(strtotime($decodedQuery) + strtotime('+30 Days')
到当前日期的结果加上 30 天(秒)加上解码查询的时间(以秒为单位)。 - 您将自纪元以来的秒数与字符串进行比较
尝试,
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
很弱