PHP中的日期和数学

时间:2014-02-27 20:12:56

标签: php base64 strtotime date-math

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

但数学并不合适。有任何想法吗?或者有更好的方法来实现这一目标吗?

5 个答案:

答案 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)

  1. (strtotime($decodedQuery) + strtotime('+30 Days')结果显示当前日期加上30天秒数加上解码查询的时间(以秒为单位)。
  2. 您将epoch以来的秒数与字符串
  3. 进行比较

答案 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
}