2013-01-23 47 views
2

我有一個查詢在MySQL中(感謝用戶Ross Smith II),我已經在控制檯中測試過,(幾個小時前返回1天10小時34分鐘)我相對確定我的PHP是正確的,儘管我可能忽略了某些事情,或者在這個查詢中存在某種條件,但我不能做我想做的事情。真的很感謝一些見解。請注意,頂部的時間戳將是從另一個表中選擇的變量,但爲了查詢的目的,我已將時間放在相同的格式中。我已經取出所有變量並嘗試原始數據,仍然可以在SQL查詢中使用,但我無法讓PHP迴應它。我收到致命錯誤:調用非對象上的成員函數fetch_assoc()。再次感謝。有效的MySQL查詢不返回結果

$aquery = ("SET @start = \"2013-01-19 07:56:22\"; 
     SET @end = NOW(); 

     SELECT 
     CONCAT(
      FLOOR(
       (
        UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
         (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
          IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
          IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
        ) 
       )/86400 
      ), 
      ' days ', 
      TIME_FORMAT(
      SEC_TO_TIME(
       (
        UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
         (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
          IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
          IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
        ) 
       ) % 86400 
      ), 
      '%H hours %i minutes' 
      ) 
     ) AS duration"); 
     $aresult = $mysqli->query($aquery); 
     // while($row = $result->fetch_assoc()) { 
     // Edited typo above, does not fix. 
     while ($row = $aresult->fetch_assoc()) { 
     echo ($row['duration']); 
     } 

回答

0

你不能通過查詢這樣的多個查詢。分別查詢每個人(並刪除該人的)或使用multi_query

$aresult = $mysqli->multi_query($aquery); 

$mysqli->query("SET @start = \"2013-01-19 07:56:22\""); 
$mysqli->query("SET @end = NOW()"); 
$result = $mysqli->query("SELECT 
    CONCAT(
     FLOOR(
      (
       UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
        (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
         IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
         IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
       ) 
      )/86400 
     ), 
     ' days ', 
     TIME_FORMAT(
     SEC_TO_TIME(
      (
       UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
        (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
         IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
         IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
       ) 
      ) % 86400 
     ), 
     '%H hours %i minutes' 
     ) 
    ) AS duration"); 
2
$aresult = $mysqli->query($aquery); 
while($row = $result->fetch_assoc()) { 
     echo ($row['duration']); 
} 

這看起來像一個錯字。你不應該使用$aresult->fetch_assoc()

+0

是的,它是一個錯字,我已經編輯我原來的職位,因爲它並沒有解決問題。 – dcclassics

0

您有多個查詢,你不能直接寫給執行像你想的方式。我正在使用PDO,所以如果這樣做能夠達到你想要的效果,我並不積極。但給它一個鏡頭。

$mysqli->autocommit(FALSE); 
$mysqli->query("SET @start = '2013-01-19 07:56:22'"); 
$mysqli->query("SET @end = NOW()"); 
/*$aresult = */$mysqli->query("SELECT 
    CONCAT(
     FLOOR(
      (
       UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
        (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
         IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
         IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
       ) 
      )/86400 
     ), 
     ' days ', 
     TIME_FORMAT(
     SEC_TO_TIME(
      (
       UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
        (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
         IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
         IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
       ) 
      ) % 86400 
     ), 
     '%H hours %i minutes' 
     ) 
    ) AS duration"); 
$mysqli->commit(); 
0

研究的mysqli_multi_query並考慮到inhanring0's答案,並感謝Ross Smith II後,這裏是解決方案,我想出了。如果任何人需要一個PHP腳本來計算從時間戳($ timeApproved here)和當前時間(可以用其他時間戳取代,用您的時間戳替換@end = NOW())所經過的時間...)。 它將返回0天0小時0分格式的時間量。 非常感謝您的幫助。

這裏是更新的代碼

$link = mysqli_connect("localhost", "username", "password", "database"); 
$query = "SET @start = \"".$timeApproved."\";"; 
$query .= "SET @end = NOW();"; 
$query .= "SELECT 
CONCAT(
    FLOOR(
     (
      UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
       (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
        IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
        IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
      ) 
     )/86400 
    ), 
    ' days ', 
    TIME_FORMAT(
    SEC_TO_TIME(
     (
      UNIX_TIMESTAMP(@end) - UNIX_TIMESTAMP(@start) - 86400 * (
       (FLOOR(DATEDIFF(@end, @start)/7) * 2) + 
        IF(WEEKDAY(@end) > 4, WEEKDAY(@end) - 4, 0) + 
        IF(WEEKDAY(@end) < WEEKDAY(@start), 2, 0) 
      ) 
     ) % 86400 
    ), 
    '%H hours %i minutes' 
    ) 
) AS duration;"; 

if (mysqli_multi_query($link, $query)) { 
do { 

if ($result = mysqli_store_result($link)) { 
    while ($row = mysqli_fetch_array($result)) 

{ 
echo $row['duration']; 
} 

// mysqli_free_result($result); // I will only have one result. 
} 
} while (mysqli_next_result($link)); 
}