Php (sqlsrv#u fetch#u array()希望参数1是资源,中给出的布尔值)是否存在语法错误,即I';我失踪了?

Php (sqlsrv#u fetch#u array()希望参数1是资源,中给出的布尔值)是否存在语法错误,即I';我失踪了?,php,sql-server,Php,Sql Server,我需要一个基于datetime列的报告,datetime列实际上是一天中每小时另一列的平均值, 所以我写了一个查询并将其放入for循环中,这样我就可以更改hour变量进行比较,然后我想回显它,这样我就可以使用它创建折线图了 我在同一页上有类似的东西,它工作得很好,但这一个不是 我正在sql Server 2016中使用PHP7 代码如下: for ($i = 1; $i <= $date_hour ; $i++) { $j = $i-1; $query = Query("S

我需要一个基于datetime列的报告,datetime列实际上是一天中每小时另一列的平均值, 所以我写了一个查询并将其放入for循环中,这样我就可以更改hour变量进行比较,然后我想回显它,这样我就可以使用它创建折线图了

我在同一页上有类似的东西,它工作得很好,但这一个不是

我正在sql Server 2016中使用
PHP7

代码如下:

for ($i = 1; $i <= $date_hour ; $i++)
{
    $j = $i-1;
    $query = Query("SELECT AVG(sp_efficiency_r) FROM sp_data_records WHERE sp_detail_id_r =$key_id and sp_sent_time_r >= '2018- $date_month - $date_day   $j  :00:00.000' and sp_sent_time_r <= '2018-$date_month-$date_day   $i:00:00.000'");
    $row = sqlsrv_fetch_array($query,SQLSRV_FETCH_NUMERIC);
    echo $row[0].",";
    if ($flag1 = true) {
        $flag1 = false;
        $date_day++;
    }
    elseif ($flag = true) {
        $date_day = 1;
        $flag = false;
    }
}
for($i=1;$iError
“sqlsrv\u fetch\u array()期望参数1是资源,boolean given”
表示
sqlsrv\u query()
返回false而不是语句资源。在您的情况下,我认为原因是错误的SQL语句

问题可能在于日期字段。例如,SQL Server将字符串值理解为“2010-01-27T15:33:13.343”格式的日期。我还假设定义了
$date\u month
$date\u day
$key\u id
是数字

因此,您可以尝试以下方法:

...
for ($i = 1; $i <= $date_hour ; $i++) {
    $j = $i-1;
    $sql = 
        "SELECT AVG(sp_efficiency_r) 
        FROM sp_data_records 
        WHERE 
            (sp_detail_id_r = ".$key_id.") AND 
            (sp_sent_time_r >= '".sprintf("2018-%02d-%02dT%02d:00:00.000", $date_month, $date_day, $j)."') AND 
            (sp_sent_time_r <= '".sprintf("2018-%02d-%02dT%02d:00:00.000", $date_month, $date_day, $i)."')
        ";
    $query = Query($sql);
    # Next 2 lines are just for test
    echo "Possible error message: ";
    print_r(sqlsrv_errors(), true);
    $row = sqlsrv_fetch_array($query, SQLSRV_FETCH_NUMERIC);
    echo $row[0].",";
}
...
。。。

对于($i=1;$i使用$query=sqlsrv_query(…)。并为该sqlsrv_query()调用设置参数。我为编写了一个函数,正如您在代码中看到的,它是'query',即sqlsrv_query($conn,$stmt)。您可以在$query=query(…)之后执行以下命令:print_r(sqlsrv_errors(),true);然后发布结果?谢谢!@arian.s奇怪,它在我的测试用例中起作用。你能发布$date\u month、$date\u day和$key\u id的值吗?你到底是如何调用sqlsrv\u query()的。谢谢!前面的代码有24个错误!尽管如此,现在是5个,我猜这是一个逻辑问题,来自错误的计算,但即使计算是错误的,查询也不会失败!是吗?值$date\u hour是具有特定id的最新记录的小时,因此与其他记录一样,循环将递增nt从00到$date\U hour的值,例如$date\U hour=5!然后我需要从00到01,01-02,…,04到05的平均值。@arian.s我已经更新了答案。如果你想检查逻辑,只留下SQL语句执行。我找到了,tnx a moon