PHP:嵌套变量问题

时间:2015-01-07 15:21:09

标签: php variables

对于异常模糊的标题表示道歉,我不确定这里使用的确切术语。

我已经编写了一些PHP来存储当前年份的变量,然后编写另一个变量来存储当前年份减去4(四年前)。作为一个说明,我确实希望它成为全年,因此追加到1月1日。

// Get current date
$date = date_create('now');

// Store two digit version of current year
$yearnow = date_format($date, 'y') . "-01-01";

// Reduce the year count by two
$yearminusfour = $yearnow - 4 . "-01-01";

那里没有问题,尽管可能有更好的方法来做到这一点。但是,我之后使用它来动态地抓取WordPress中过去四年的帖子。

负责返回正确帖子的这一行代码在静态时可以正常工作:

$where .= " AND post_date >= '2010-01-01' AND post_date < '2014-01-01'";

我所挣扎的是将两者结合起来使其变得动态。我试过了:

$where .= " AND post_date >= $yearnow AND post_date < $yearminusfour";
$where .= " AND post_date >= '.$yearnow.' AND post_date < '.$yearminusfour.'";
$where .= " AND post_date >= '".$twentyten."' AND post_date < '".$yearminusfour."'";

我被困住了,我确定自己很慢。

7 个答案:

答案 0 :(得分:1)

$where .= " AND post_date >= '$yearnow' AND post_date < '$yearminusfour'";

这是正确的版本。你不需要那些时期。

但是,正如你所了解的那样。这是一个不必要的复杂的日期计算,导致错误的值。例如,您可以使用

获取今年的第一个日期
echo date("Y-m-d",strtotime("1st January this year"));  // 2015-01-01

How can I prevent SQL injection in PHP?

答案 1 :(得分:1)

$where .= " AND post_date >= '".$twentyten."' AND post_date < '".$yearminusfour."'";

这会有效,但你必须反向比较:)

$where .= " AND post_date <= '".$twentyten."' AND post_date >= '".$yearminusfour."'";

此外,您应该使用预准备语句。当您使用用户输入时,建议使用它。

答案 2 :(得分:0)

我认为你所寻找的范围是不可行的。根据您发布的代码,它会搜索帖子&gt; =当前年份而不是4年前的日期。所以你需要改变比较。

$where .= " AND post_date <= '".$twentyten."' AND post_date > '".$yearminusfour."'";

答案 3 :(得分:0)

$ yearnow就像2015-01-01。那么$yearnow-4会是什么? 无论如何,您可以使用DateTime class(您已使用别名date_create)来执行必要的manipulations

<?php
$date = new DateTime('first day of January');


$clause = sprintf('WHERE x BETWEEN %s AND %s',
    $date->format('Y-m-d'),
    $date->modify('- 4 year')->format('Y-m-d')
);

echo $clause;

打印(今年)

WHERE x BETWEEN 2015-01-01 AND 2011-01-01

答案 4 :(得分:0)

我建议使用mysql的BETWEEN条件(我假设你使用mysql)和日期减法。

这将是这样的:

$where .= " AND post_date BETWEEN '$yearnow' AND '$yearnow' - INTERVAL 4 YEAR";

答案 5 :(得分:0)

怎么样?

$yearStart = date('Y-m-d', strtotime('Jan 01'));
$yearEnd = date('Y-m-d',strtotime("$yearStart -4 year")); 

$where .=  "AND (date_field BETWEEN '".$yearStart."' AND '".$yearEnd."')";

答案 6 :(得分:0)

1)要获取日期,请尝试:

$currentdate = date('Y-m-d',time());
$yearminus4 = date('Y-m-d',strtotime("-4 years", time()));

2)我认为你的sql语句中有你的选择标准

$where = " AND post_date >= '" . $yearminus4 . "'  
           AND post_date <= '" . $currentdate . "'";