我的循环不适用于PHP(日期时间转换)

我的循环不适用于PHP(日期时间转换),php,loops,datetime,Php,Loops,Datetime,Hello:)我一直在尝试编写这段PHP脚本,选择所有符合特定条件的DateTime行,然后计算从那时到当前时间的时间差 我的PHP脚本只是呼应“44年前”。当我在数据库中有一条以上的记录,而呼应完全错误时,我在数据库中没有那么旧的记录 我知道我可以在选择循环中回显适当的日期时间,选择条件确实有效 感谢您的帮助。:) 我的PHP代码如下: <?php //AJAX REQUEST $Following_ID = $_GET['Following_ID']; //connecti

Hello:)我一直在尝试编写这段PHP脚本,选择所有符合特定条件的DateTime行,然后计算从那时到当前时间的时间差

我的PHP脚本只是呼应“44年前”。当我在数据库中有一条以上的记录,而呼应完全错误时,我在数据库中没有那么旧的记录

我知道我可以在选择循环中回显适当的日期时间,选择条件确实有效

感谢您的帮助。:)

我的PHP代码如下:

     <?php

//AJAX REQUEST
$Following_ID = $_GET['Following_ID'];
//connection infi
$con=mysqli_connect("localhost","root","PASS","TABLE");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

 //SQL to select all fields from appointment table
$result = mysqli_query($con,"SELECT * FROM Followers
WHERE Following_ID='$Following_ID' AND Follow_Status='acce' AND Followers_Requested_Game NOT LIKE '%$Following_ID%' AND (Follower_Game='truth' OR Follower_Game='rate') ORDER BY Game_Time DESC");

//echo all in array
while($row = mysqli_fetch_array($result))
  {

$time = $row['Game_Time'];
humanTiming ($time);
echo 'event happened '.humanTiming($time).' ago';
}

function humanTiming ($time)
{

    $time = time() - $time; // to get the time since that moment

    $tokens = array (
        31536000 => 'year',
        2592000 => 'month',
        604800 => 'week',
        86400 => 'day',
        3600 => 'hour',
        60 => 'minute',
        1 => 'second'
    );

    foreach ($tokens as $unit => $text) {
        if ($time < $unit) continue;
        $numberOfUnits = floor($time / $unit);
        return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
    }

}

}


//close connection
mysqli_close($con);
?> 

我无法发表评论,因为我还没有50名代表,所以我必须在这里这样做,但@Marc B说的似乎是对的:

($time)对应于您的日期为1970年1月1日

每当我试图用一个日期做一些事情,而这个日期(1970年1月1日),我知道我没有匹配时间的格式。因此,我建议三件事:

1)错误测试-消除所有可能性

  • 从这段代码中输出
    $time
    $time=$row['Game_time']

  • 检查这是否显示为unix时间戳(在我编写时,当前为1392430174)

  • 由于
    time()
    是unix时间戳格式,这意味着您正在正确地进行扣减,并且行
    $time=time()-$time也将采用unix时间戳格式

2)可能的

如果我不得不猜测一下,我会说
$time
$row['Game\u time']
不是unix时间戳格式,这意味着您应该使用
strotime($time)
转换它,然后进行计算(
$time=time()-$time;//以获取从那一刻起的时间
)。测试这个函数的输出。对于编码,有一件事是绝对肯定的——你会得到bug。因此,你必须在一系列逻辑测试的基础上推导出答案。这真的就像用玻璃杯捕捉一只虫子

3)一些提示

我会帮你自己一个忙,避免变量名的潜在问题。为什么不打这个电话:

$time = time() - $time; // to get the time since that moment
像这样:

$time_difference = time() - $time; // to get the time since that moment
。。或者像我以前一样,在将字符串重新定义为它自身的一部分时遇到了问题,特别是在传递参数时

另外,
$tokens
数组是否会更加标准化,将秒转换为值,将时间名称转换为键,例如将“年”转换为键。也许可以使用更容易阅读的东西,这样数字就不会有错误,例如

$tokens = array();
$tokens['second'] = 1;
$tokens['minute'] = 60*$second;
$tokens['hour'] = 60*$minute;
$tokens['day'] = 24*$hour;
$tokens['week'] = 7*$day;
$tokens['month'] = 30*$day;
$tokens['year'] = 365*$day;

只是建议,但最重要的是,如果只是你在使用它,你可以找到你自己,等等。哦,在一个函数中,你可以得到任何公开的东西——只需从外部调用它。不过都是好东西_

这段代码不可能像Writein那样工作。你在while循环中定义了一个函数,这会导致它在第二次迭代中死掉,并出现“cannot redeclare function”错误。我想这也可能是个问题,我可以在循环中调用函数,而函数在循环外?是的。那很好。如果您正在重新安排工作,您可能希望在有人对您的服务器进行pwns之前修复您的敞开漏洞。一旦脚本正常工作,我会这样做。我已经更新了我的代码示例,它似乎仍然不起作用。这是44年前的回音,与你的日期是1970年1月1日一致,那是44年前。。。e、 g.unix timestamp=0感谢您的输入!我让它工作了,我只需要将DateTime从字符串格式化到Unixtimestamp@user2921824-别担心。。考虑一下我的其他建议。。对于那些在工作的任何部分都要追溯到1970年1月1日而不是他们想要的日期的人来说,问题通常是日期格式不在unix时间戳中<代码>strotime($time)
会有帮助_
$tokens = array();
$tokens['second'] = 1;
$tokens['minute'] = 60*$second;
$tokens['hour'] = 60*$minute;
$tokens['day'] = 24*$hour;
$tokens['week'] = 7*$day;
$tokens['month'] = 30*$day;
$tokens['year'] = 365*$day;