我在MySQL中有一个查询(感谢用户Ross Smith II)我在控制台中测试过,(几小时前返回1天10小时34分钟)我相对确定我的PHP是正确的,虽然我可能会忽略某些东西,或者在这个问题的某个地方有一个条件我不能做我想做的事情。非常感谢一些见解。请注意,顶部的时间戳将是从另一个表中选择的变量,但出于此查询的目的,我将时间放在相同的格式中。我已经取出所有变量并尝试了原始数据,仍然可以在SQL查询中工作,但我无法让PHP回应它。我收到致命错误:在非对象上调用成员函数fetch_assoc()。再次感谢。
$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 :(得分:2)
$aresult = $mysqli->query($aquery);
while( $row = $result->fetch_assoc() ) {
echo ($row['duration']);
}
这看起来像一个错字。你不应该使用$aresult->fetch_assoc()
吗?
答案 1 :(得分:0)
您不能使用多个查询来调用查询。单独查询每个(并删除; s)或使用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 :(得分: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();
答案 3 :(得分:0)
在研究mysqli_multi_query并考虑inhan和ring0's答案之后,感谢Ross Smith II,这是我提出的解决方案。如果有人需要一个PHP脚本来计算从时间戳(这里是$ timeApproved)和当前时间(可以用任何其他时间戳替换,用你的时间戳替换@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));
}