2014-02-15 44 views
-2

你好:)我一直在努力工作在這塊PHP腳本上,選擇符合某些條件的所有DateTime行,然後計算從那時起的時間差到當前時間。我的循環將無法使用PHP(日期時間轉換)

我的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); 
?> 

我這裏有解決方案:

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

$times = $row['Game_Time']; 
$time = strtotime($times); 
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); 
?> 
+0

此代碼不可能作爲-writetein工作。你正在定義一個函數INSIDE while循環,這會導致它在第二次迭代時死於「無法重新聲明函數」的錯誤。 –

+0

我認爲這也可能是一個問題,我可以用函數外的函數調用函數內的函數? – user2921824

+0

是的。那可以正常工作。如果你正在重新整理一些東西,你可能需要在有人給你的服務器執行任務之前,修復你的漏洞廣泛的[SQL注入攻擊](http://bobby-tables.com)漏洞。 –

回答

0

我無法評論,因爲我還沒有50代表這樣我必須這樣做,但似乎@Marc B是正確的,當他說:

($ time)c orreponds你的日期是一月1970分之1

每當我試圖做一些事情的日期並將其拉至該日期(1970年1月),我知道我不匹配了時間的格式。從該段代碼的消除所有可能

  • 輸出$time -

    1)錯誤測試:$time = $row['Game_Time'];

  • 檢查,這是走出來,所以我建議三件事作爲unix時間戳(目前我寫的1392430174)

  • 由於time()是unix時間戳格式,所以這個w生病意味着你正在扣除,$time = time() - $time;行也將採用unix時間戳格式。

2)可能

如果讓我來猜一猜我要說的是$time$row['Game_Time']不是Unix時間戳格式,這意味着你應該使用strtotime($time)轉換它,然後做計算($time = time() - $time; // to get the time since that moment)。測試這個的輸出。編碼有一點是絕對肯定的 - 你會得到錯誤。所以你必須根據一系列邏輯測試來推導出答案的系統。它真的就像用玻璃瓶來捕捉一個錯誤!

3)的一些技巧

我想請你幫個忙,並避免與變量名潛在的問題。特別是傳遞參數的時候 - 正如我以前有問題,重新定義一個字符串作爲這樣自身的一部分

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

..或什麼:爲什麼不叫這行:

$time = 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; 

只是建議,但更主要的是,如果它只是你使用它,你可以找到自己周圍等哦,在函數得到在公開任何東西 - 只是把它從外面。所有不錯的東西雖然!_

+0

感謝您的輸入!我得到它的工作,我只需要將DateTime的字符串格式化爲Unix時間戳 – user2921824

+0

@ user2921824 - 不用擔心..思考我的其他建議,雖然..和其他任何人在那裏是1970年1月1日回到任何部分的工作而不是他們想要的問題的日期通常是日期格式不在unix時間戳中。 'strtotime($ time)'將幫助_ –