【问题标题】:SQL Server query returning no results in PHP, but runs fine in Management StudioSQL Server 查询在 PHP 中没有返回结果,但在 Management Studio 中运行良好
【发布时间】:2015-01-27 14:54:42
【问题描述】:

我有一个相当大的查询,在 Microsoft SQL Server Management Studio 中运行良好。但是,当我尝试在 PHP 中运行相同的查询时,我没有得到任何结果。这是我的代码,我知道这是连接数据库的最糟糕的方式。

Public function GetClockedHours() {
    $conn = odbc_connect('easydo', '', '');
    if (!$conn) {
        exit("Connection Failed: " . $conn);
    }
    $sql = "WITH ByDays AS ( -- Number the entry register in each day
SELECT 
EventTm AS T,
CONVERT(VARCHAR(10),EventTm,102) AS Day,
FLOOR(CONVERT(FLOAT,EventTm)) DayNumber,
ROW_NUMBER() OVER(PARTITION BY FLOOR(CONVERT(FLOAT,EventTm)) ORDER BY EventTm) InDay 
FROM CHINA_VISION_DorEvents
Where DorCtrls_Ref = '16' AND CardCode = '000006f1' AND CONVERT(Date,EventTm) >  dateadd(day, -7, getdate())
)

,Diffs AS (
SELECT 
E.Day,
E.T ET, O.T OT, O.T-E.T Diff, 
DATEDIFF(S,E.T,O.T) DiffSeconds -- difference in seconds
 FROM 
(SELECT BE.T, BE.Day, BE.InDay 
 FROM ByDays BE 
 WHERE BE.InDay % 2 = 1) E -- Even rows
INNER JOIN
    (SELECT BO.T, BO.Day, BO.InDay 
 FROM ByDays BO 
 WHERE BO.InDay % 2 = 0) O -- Odd rows
ON E.InDay + 1 = O.InDay -- Join rows (1,2), (3,4) and so on
AND E.Day = O.Day --  in the same day
)


SELECT Day, 
SUM(DiffSeconds) Seconds, 
CONVERT(VARCHAR(8), 
(DATEADD(S, SUM(DiffSeconds), '1900-01-01T00:00:00')),
108) TotalHHMMSS -- The same, formatted as HH:MM:SS
FROM Diffs GROUP BY Day
ORDER BY Day desc";
    $rs = odbc_exec($conn, $sql);
    if (!$rs) {
        exit("Error in SQL");
    }
    $array = array();
    $i = 1;
    while ($row = odbc_fetch_array($rs, $i)) {
        foreach ($row AS $key => $value) {
            $array[$i][$key] = $row[$key];
        }
        $i++;
    }
    var_dump($array);
    return $array;
} 

预期的结果是一个结果数组,结果是:

   Date    Seconds   hours
2015.01.27  18055   05:00:55
2015.01.26  33491   09:18:11
2015.01.23  32649   09:04:09
2015.01.22  31554   08:45:54
2015.01.21  31889   08:51:29

然而得到的却是一无所有。

【问题讨论】:

  • 你应该完全质量你的对象 - databasename.schema.object
  • 您的 foreach 循环毫无意义。为什么不只是while(...) { $array[] = $row; }?
  • 你试过打印$key和$value吗?为什么您期望输出中有三个数据点,但只将 $key 分配给您的数组?

标签: php sql sql-server


【解决方案1】:

您会返回多少个结果集?如果大于 1,那么您需要选择正确的结果集:

bool odbc_next_result ( resource $result_id )

http://php.net/manual/en/function.odbc-next-result.php

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。就我而言,我是这样执行的

    $sql = "SELECT * FROM table1";
    $resultSet = odbc_exec($sqllink, $sql);
    
    while ($data = odbc_fetch_array($resultSet)) {
        $sql = "SELECT * FROM table2";
        $resultSet2 = odbc_exec($sqllink, $sql);//failed here
        while ($data2 = odbc_fetch_array($resultSet2)) {
    
               //something here
    
        }
    }
    

    我就这样改了,效果很好

    $sql = "SELECT * FROM table1";
    $resultSet = odbc_exec($sqllink, $sql);
    
    // Create an array and store the results
    
    $queryResult = array();
    
    while ($data = odbc_fetch_array($resultSet)) {
    
        // push the required content into the array
    
        $queryResult[$data['id']]['name'] = $data[name];
    }
    
    foreach($queryResult as $row) {
        $sql = "SELECT * FROM table2";
        $resultSet2 = odbc_exec($sqllink, $sql);
        while ($data2 = odbc_fetch_array($resultSet2)) {
    
            // something here
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多