【问题标题】:Valid MySQL query not returning result有效的 MySQL 查询不返回结果
【发布时间】:2013-01-23 03:00:50
【问题描述】:

我在 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']);
        }

【问题讨论】:

    标签: php mysql datediff


    【解决方案1】:
    $aresult = $mysqli->query($aquery);
    while( $row = $result->fetch_assoc() ) {
            echo ($row['duration']);
    }
    

    这看起来像是一个错字。你不应该使用$aresult-&gt;fetch_assoc()吗?

    【讨论】:

    • 是的,这是一个错字,我已经编辑了我的原始帖子,因为它没有解决问题。
    【解决方案2】:

    你不能用这样的多个查询调用 query。单独查询它们中的每一个(并删除 ;'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");
    

    【讨论】:

      【解决方案3】:

      您有多个查询,不能像您尝试的方式那样直接执行。我正在使用 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();
      

      【讨论】:

        【解决方案4】:

        在研究了 mysqli_multi_query 并考虑了 inhanring0'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));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 2023-02-09
          • 2021-11-27
          • 2017-05-18
          • 2015-01-29
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多