PHP mssql 和 while 循环跳过一个项目


PHP mssql and while loop skips one item

我有一个小问题,我试图回显数据库中所有符合我条件的项目。有 4 个项目 - 但我只打印了其中的 3 个。知道吗?

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
     echo "Connection established.<br />";
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}
$sql = "SELECT Description
        FROM MI_Tracker
        WHERE Status ='In Progress'";
$stmt = sqlsrv_query( $conn, $sql);
$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC);
if( sqlsrv_fetch( $stmt ) === false) {
     die( print_r( sqlsrv_errors(), true));
}
do  
{ echo $row['Description'],'<br>';}
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) );

代码编辑:

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}
$sql = "SELECT Description
        FROM MI_Tracker
        WHERE Status ='In Progress'";
$stmt = sqlsrv_query( $conn, $sql);
if( sqlsrv_fetch( $stmt ) === false) {
     die( print_r( sqlsrv_errors(), true));
}
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) )
{ echo $row['Description'],'<br>';}

静止 - 缺少 1 个项目。

从代码中删除以下行的第一个匹配项:

$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC);

还有您拥有的另一个提取:

if( sqlsrv_fetch( $stmt ) === false) {
     die( print_r( sqlsrv_errors(), true));
}

这就是杀手锏:它使您丢失了其中一行,因为您只是使用此if将指针移动到第三行。相反,直接检查 $stmt 变量上的错误,并使用标准的 while 循环,如下所示:

$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false) {
     die( print_r( sqlsrv_errors(), true));
}
while ($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['Description'],'<br>';
}

它获取一行,但由于稍后有一个 while 循环执行此操作,因此您永远不会处理第一行。循环会在您对其执行任何操作之前再次执行提取,这意味着您丢失了第一行。

只需执行此操作

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) );

如果没有在此之前的声明,如果:

$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC); //Remove this
if( sqlsrv_fetch( $stmt ) === false) {

在此处查看示例。http://php.net/manual/en/function.sqlsrv-fetch-array.php