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 = $_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){
  1. (strtotime($decodedQuery) + strtotime('+30 Days') 到当前日期的结果加上 30 天(秒)加上解码查询的时间(以秒为单位)。
  2. 您将自纪元以来的秒数与字符串进行比较

尝试,

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很弱

相关内容

  • 没有找到相关文章

最新更新