PHP sqlsrv_fetch_array 和 "while loop" 越过第一行

PHP sqlsrv_fetch_array with "while loop" crosses the first row

我从 MScost table 获取数据以输入到 tmp_table。 我使用带 sqlsrv_fetch_array 的 while 循环插入 tmp_table 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外复制while循环粘贴,它没有穿过第一行。正常工作。

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

您的问题是您使用 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";
}
?>

PHP SQL 服务器支持的驱动程序 sqlsrv_num_rows() function, which returns the number of rows in a result set. But you must use this function only if your call to sqlsrv_query() 使用客户端、静态或键集游标(默认为前向游标)。

让我们看一下这段代码:

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 调用 return 你的下一行(在第一行之后)。

if语句本身(虽然必须删除)也不正确,必须用括号组成有效语句,使用!==进行比较并写成null 总是小写:

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