Допустимый запрос MySQL, не возвращающий результат


У меня есть запрос в 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']);
        }
Author: Community, 2013-01-23

4 answers

Вы не можете вызвать запрос с несколькими подобными запросами. Запросите каждый из них по отдельности (и удалите;) или используйте мульти_запрос.

$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");
 0
Author: Ring Ø, 2013-01-23 03:23:03
$aresult = $mysqli->query($aquery);
while( $row = $result->fetch_assoc() ) {
        echo ($row['duration']);
}

Это похоже на опечатку. Разве вы не должны использовать $aresult->fetch_assoc()?

 2
Author: Jim, 2013-01-23 03:03:43

У вас есть несколько запросов, которые вы не можете выполнить точно так, как пытаетесь. Я использую 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
Author: inhan, 2013-01-23 03:26:58

После изучения запроса mysqli_multi_query и с учетом в ответах и ring0, а также благодаря Россу Смиту 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));
}
 0
Author: dcclassics, 2017-05-23 10:34:57