我想根据两个日期写一份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>";
?>
答案 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);