2

コンソールでテストした MySQL (ユーザーRoss Smith IIのおかげ) にクエリがあります (数時間前に 1 日 10 時間 34 分返されました)。何かを見落としているか、このクエリのどこかに、自分がしようとしていることを実行できないという条件があります。いくつかの洞察を本当に感謝します。上部のタイムスタンプは別のテーブルから選択された変数になることに注意してください。ただし、このクエリの目的のために、同じ形式で時刻を入力しました。すべての変数を取り出して生データを試しましたが、SQL クエリでは引き続き機能しますが、PHP にエコーさせることができません。Fatal error: Call to a member function fetch_assoc() on a non-object を受け取りました。再度、感謝します。

$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']);
        }
4

4 に答える 4

2
$aresult = $mysqli->query($aquery);
while( $row = $result->fetch_assoc() ) {
        echo ($row['duration']);
}

これはタイプミスのようです。を使用するべきではありません$aresult->fetch_assoc()か?

于 2013-01-23T03:03:43.633 に答える
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");
于 2013-01-23T03:23:03.777 に答える
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();
于 2013-01-23T03:26:58.707 に答える
0

mysqli_multi_query を調査し、 inhanring0 の回答を考慮した後、 Ross Smith IIのおかげで、ここに私が思いついた解決策があります。タイムスタンプ (ここでは $timeApproved) と現在の時刻 (他のタイムスタンプに置き換えることができます。@end = NOW() をタイムスタンプに置き換えてください...) から経過時間を計算するために PHP スクリプトが必要な場合は、ここにあります。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));
}
于 2013-01-23T04:33:12.803 に答える