首页 > 解决方案 > MySQLi 到 SQLSRV 的迁移 - MySQLi 的 fetch_assoc() 与 SQLSRV 的 fetch()

问题描述

对于我的罪过,我必须迁移(或者简单地说,重写)为仅与 MySQLi 一起工作而编写的支持功能。现在我正在尝试在 PDO 中做所有事情,但是对于一些代码,我认为可以通过重用旧脚本的一些部分并重新调整它们的用途来加快它的速度。

到目前为止,它的作用就像一个魅力——稍微改变功能,并对代码进行小到几乎微不足道的更改以使其正常工作。但在这里我被难住了。

我一直习惯于while($row = $result->fetch_assoc())打印数据库中的所有行。我真的很想保持代码与旧代码的结构相似。下面是我尝试打印行的尝试,但在 SQLSRV 中它的工作方式不同。我可以通过使用类似 for 循环的方式轻松显示行(没有内容),for ($i=0; $i < $rowCount; $i++)但这与我的代码相差太大。

在观察了我下面的示例解决方案之后,是否可以将上面的代码重新创建为 SQLSRV 解决方案并保持相同的结构?


我的工作 MySQLi 解决方案:

                  $sql = "SELECT * FROM tasks ORDER BY PRIORITY DESC;";
                  $result = $conn->query($sql);// $conn is `$conn = new mysqli($servername, $username, $password, $db);`
                  if ($result->num_rows > 0) 
                  {
                     while($row = $result->fetch_assoc()) 
                     {
                        echo "<br> FROM :".$row["FROM"];
                        echo "<br> DEPT :".$row["DEPT"];
                        echo "<br> TASK_NAME :".$row["TASK_NAME"];
                        echo "<br> PRIORITY :".$row["PRIORITY"];    
                     }
                  }

这是我使用 MS SQLSRV 解决问题的尝试:

                $stmt = $GLOBALS['conn']->prepare("SELECT * FROM tasks;"); 
                $stmt->execute();
                $stmt->fetchAll();
                //
                $rowCount = $stmt->rowCount();   

                //echo "<br> Row Count: ". $rowCount; 

                  while ($rowCount > 0)
                  {
                      for ($row = $stmt->fetch())// For evident reasons that doesn't not work 
                      {     
                            echo "<br> FROM :".$row["FROM"];
                            echo "<br> DEPT :".$row["DEPT"];
                            echo "<br> TASK_NAME :".$row["TASK_NAME"];
                            echo "<br> PRIORITY :".$row["PRIORITY"]; 
                      }
                  }

标签: phpmysqlmysqlipdosqlsrv

解决方案


摆脱$stmt->fetchAll();. 这是获取所有行,所以没有任何东西可供循环处理。并且循环应该使用while,而不是for

或者将结果分配fetchAll()给一个变量,然后循环。

$rows = $stmt->fetchAll();
if (count($rows) > 0) {
    foreach ($rows as $row) {
        echo "<br> FROM :".$row["FROM"];
        echo "<br> DEPT :".$row["DEPT"];
        echo "<br> TASK_NAME :".$row["TASK_NAME"];
        echo "<br> PRIORITY :".$row["PRIORITY"]; 
    }
}            

推荐阅读