【问题标题】:PHP mssql and while loop skips one itemPHP mssql和while循环跳过一项
【发布时间】:2016-01-22 19:48:27
【问题描述】:

我有一个小问题,我试图从数据库中回显所有符合我条件的项目。有 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 项。

【问题讨论】:

  • 作为查询过滤器,缺少的项目是否具有“进行中”状态?
  • 是的,完全没问题。

标签: php sql sql-server sql-server-2008


【解决方案1】:

从您的代码中删除第一次出现的以下行:

$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC);

还有你拥有的其他 fetch:

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 循环执行此操作,因此您永远不会处理第一行。循环在您对其执行任何操作之前再次执行提取,这意味着您丢失了第一行。

【讨论】:

  • 我的错,有 2 件丢失,现在只丢失了 1 个。仍然 - 不够好
  • 啊!谢谢解释!
【解决方案2】:

暂时这样做

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

【讨论】:

  • 抱歉,没有看到您的编辑。更改 if for if( $stmt === false) {
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2017-11-11
  • 2017-04-27
相关资源
最近更新 更多