2013-01-23 54 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)); 
}