如果php中的语句使用日期

时间:2011-09-07 15:21:17

标签: php mysql date if-statement

我想根据两个日期写一份IF声明 我有一个MySQL数据库(我无法控制)进行测试和考试 其中一个字段标记为ClientTime,并输出测试的日期和时间。查询时,典型输出将显示为Thu Aug 25 16:47:05 GMT+0100 2011

以下所有内容都发生在while loop

我已设法使用strtotime()将此MySQL日期转换为d / m / Y格式,因此上述内容将显示为25/08/2011,我可以显示包含所有正确日期的表格。

我还有一个php表单,询问此测试过期的天数,并将其存储在变量$IMonths中(来自表单页面传递的$ _POST ['IMonths']) - 一旦我使用它就会将PHP代码更改为Months但是我正在使用几天进行测试 - 因此传递的变量被称为$ IMonths。

我还创建了一个$today = date("d/m/Y");变量

我可以使用以下命令$Expiry = date('d/m/Y', strtotime($row['ClientTime'] . "+$IMonths days"));成功创建新日期,并且可以显示测试日期和到期日期的所有结果。

然后,我希望在我的while语句中包含一个if语句,该语句是($Expiry>$today),但它不准确 - 没有错误,并且更改天数会改变结果。

我的测试数据库有5个考试,其中包含以下日期。

Taken 17/08/2011
Taken 17/08/2011
Taken 22/08/2011
Taken 22/08/2011
Taken 24/08/2011

如果我将到期日设置为1,我会按预期收到所有结果:

如果我将其设置为10天,我会得到两个结果

Taken 17/08/2011
Taken 17/08/2011

即使他们的约会时间少于今天的日期(2011年9月7日(我写这篇文章)),我也不会得到任何其他人,但他们确实会在9月份到期。

如果我将到期日设置为15,我会得到一个结果,即将来的某一天!

Taken 17/08/2011

我希望这是有道理的。我的代码如下:

<?php

// Make The MySQL Server Connection
mysql_connect("localhost", "root", "") or die(mysql_error());

// Make The MySQL Database Connection
mysql_select_db("questions") or die(mysql_error());

$IQuizName = $_POST['IQuizName'];
$IMonths = $_POST['IMonths'];

$result = mysql_query("SELECT * FROM questions.resultsets 
                       WHERE QuizName='$IQuizName' 
                       AND PassFail='Pass'") or die (mysql_error());

$today = date("d/m/Y");

echo "<table border='1'>";
echo "<tr> <th align='left'>Candidate Name </th> <th align='left'>Pass / Fail</th> <th align='left'>Date last Taken</th> <th align='left'>Expires</th> <th align='left'>Today</th> </tr>";

  while($row = mysql_fetch_array($result)){

  //START of expiry calculation
  $Expiry = date('d/m/Y', strtotime($row['ClientTime'] . "+$IMonths days"));

  if($Expiry>$today){

    echo "<tr><td>"; 
    echo $row['Candidate'];
    echo "</td><td>";  

    echo $row['PassFail'];
    echo "</td><td>"; 

    //Date Conversion
    echo date('d/m/Y', strtotime($row['ClientTime']));
    echo "</td><td>"; 

    echo $Expiry;
    echo "</td><td>"; 

    echo $today;
    echo "</td><tr>"; 

  };
}

echo "</table>";
echo "<P>";
?>

4 个答案:

答案 0 :(得分:1)

您的问题是由PHP中的数据类型引起的。在PHP中调用date()函数时,实际上是将日期格式化为字符串。因此,当你执行$ Expiry = date(blahblah)时,$ expiry现在是一个字符串。所以你的if语句是if(somestring&gt; someotherstring)。通常,您不会想要比较一个文本块以查看它是否大于另一个文本块。

http://www.php.net/manual/en/function.date.php

解决这个问题的一种方法是使用strtotime函数。这将返回基于UNIX时间戳的日期表示形式的整数。

http://www.php.net/manual/en/function.strtotime.php

如果将字符串日期转换为strtotime,则if语句现在正在比较一个数字是否大于另一个数字。这应该可以解决你的问题:)

答案 1 :(得分:1)

首先:修复SQL注入漏洞。

我建议在SQL中查询到期日期,这样会容易得多。

这是示例代码

//escape those user variables !!
$IQuizName = mysql_real_escape_string($_POST['IQuizName']);
$IMonths = mysql_real_escape_string($_POST['IMonths']);

$result = mysql_query("SELECT * FROM questions.resultsets 
                   WHERE QuizName= '$IQuizName' 
                   AND PassFail= 'Pass' 
                   AND ClientTime < NOW() "); 

//don't use (or die(error)) in production code, (for now I'll let it slide).
if (!$result) then { die (mysql_error()); }
while ($row = mysql_fetch_row($result)) 
{
  echo "the table"
}

答案 2 :(得分:0)

为了准确比较日期,您应该再次使用strtotime函数转换日期。

答案 3 :(得分:0)

在PHP中,没有标准的日期数据类型。你所拥有的是字符串,当你比较它们时,它们会被比较为字符串,而不是日期,这就是为什么你得到你不期望的结果。通常在PHP中完成的方法是通过从最高位到最小位排序来格式化日期字符串,例如

YYYY-MM-DD HH:MM:SS

如果这样做,字符串比较将按预期工作。您可以使用以下方式轻松设置日期格式:

$string = date('Y-m-d H:i:s', $year, $month, $day, $hour, $minute, $second);