1

我授予网站的付费会员在 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
} 

但数学结果并不正确。有任何想法吗?还是有更好的方法来实现这一点?

4

5 回答 5

3

您正在使用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 中的数据。

于 2014-02-27T20:16:37.283 回答
2

有任何想法吗?

您正在将 Unix 时间戳记与字符串进行比较。那是行不通的(如你所料)。

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){
于 2014-02-27T20:18:04.117 回答
0

尝试,

if (strtotime($decodedQuery) < strtotime('-30 Days')) {
 //$decodedQuery is more than 30 days in the past
}
于 2014-02-27T20:21:54.743 回答
0
  1. (strtotime($decodedQuery) + strtotime('+30 Days')结果到当前日期加上 30 天(以秒为单位)加上解码查询的时间(以秒为单位)。
  2. 您将自纪元以来的秒数与字符串进行比较
于 2014-02-27T20:18:13.390 回答
0

尝试

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

但是,base64是的,很弱

于 2014-02-27T20:18:19.363 回答