带有“ while循环”的PHP sqlsrv_fetch_array越过第一行

时间:2019-02-21 06:53:57

标签: php sql-server loops while-loop sqlsrv

我从MScost表获取数据以输入到tmp_table。 我将while循环与sqlsrv_fetch_array一起使用,以插入到tmp_table表中。 我创建了getData和addData函数,用于从数据库中获取数据并将数据添加到数据库中。

$resm1 = getData($conn, "years,months,category,ROUND(mfg,0)as ttl", "MScost", "years='2018' and months='NOV'");

if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null){
    while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {
        $category = $row['category'];
        $ttl = $row['ttl'];
        addData($conn, "tmp_table(category,ttl1)", "'$category','$ttl'");
    }
    echo $category."=".$ttl."</br>";
}else {
    addData($conn, "tmp_table(category,ttl1)", "'NON',0");
    echo "Null";
}

没有任何错误。 但是while循环越过存在的第一行。 没有显示。它不会插入数据库。

然后我尝试在IF外循环粘贴时进行复制,它没有越过第一行。它正常工作。

这是为什么?我希望它能在IF中工作而不会越过第一行。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您的问题是您使用if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null)检查从结果集中读取了第一行。删除该支票,您将可以提取所有数据。

您可以尝试使用以下脚本:

<?php
$resm1 = getData($conn, "years,months,category,ROUND(mfg,0)as ttl", "MScost", "years='2018' and months='NOV'");

$rc = 0;
while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {
   $rc++;
   $category = $row['category'];
   $ttl = $row['ttl'];
   addData($conn, "tmp_table(category,ttl1)", "'$category','$ttl'");
   echo $category."=".$ttl."</br>";
}
if ($rc == 0) {
   addData($conn, "tmp_table(category,ttl1)", "'NON',0");
   echo "Null";
}
?>

SQL Server的PHP驱动程序支持sqlsrv_num_rows()函数,该函数返回结果集中的行数。但是只有在对sqlsrv_query()的调用使用客户端,静态或键集游标(默认为前向游标)的情况下,才必须使用此功能。

答案 1 :(得分:1)

让我们看一下这段代码:

if($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC) != Null){
    while ($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) {

if语句中,您已经调用了sqlsrv_fetch_array,这意味着第一行已经被提取。在您的while循环中,您进行了更多的sqlsrv_fetch_array调用,这些调用将返回下一行(在第一行之后)。

if语句本身(尽管必须删除)也不正确,您必须使用方括号来组成有效的语句,使用!==进行比较,并在其中写入null始终小写:

if (($row = sqlsrv_fetch_array($resm1, SQLSRV_FETCH_ASSOC)) !== null) {