PHP:嵌套变量问题


PHP: Nested Variables Issue

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

我写了一些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."'";

被困住了,我确定我的速度很慢。

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

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

但是,正如你自己所知道的。这是一个不必要的复杂日期计算,导致不正确的值。例如,您可以使用

echo date("Y-m-d",strtotime("1st January this year"));  // 2015-01-01

如何防止 PHP 中的 SQL 注入?

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

这将起作用,但您必须:)颠倒比较

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

此外,还应使用预准备语句。建议在使用用户输入时使用。

我认为您正在搜索的范围是不可行的。根据您发布的代码,它会搜索>=当前年份且小于4年前的帖子。所以你需要改变比较。

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

$yearnow类似于2015-01-01。那$yearnow-4会是什么?
无论如何,您可以使用 DateTime 类(您已经使用了别名 date_create)来执行必要的操作:

<?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

怎么样?

$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."')";

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 . "'";

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

这将看起来像这样:

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