【问题标题】:MySQLi to SQLSRV migration - MySQLi's fetch_assoc() vs SQLSRV's fetch() [duplicate]MySQLi 到 SQLSRV 迁移 - MySQLi 的 fetch_assoc() 与 SQLSRV 的 fetch() [重复]
【发布时间】:2019-08-25 21:29:35
【问题描述】:

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

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

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

观察我下面的示例解决方案后,是否可以将上面的代码重新创建为 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"]; 
                      }
                  }

【问题讨论】:

  • for 应该是while
  • 我需要该条件,因为如果行等于或小于 0,我的脚本会执行其他操作。尽管删除该位的作用很小。网页只是不打印表格并提示错误。
  • @Barmar 实际上是while 而不是for。我没有注意到它,因为我正在编写一个没有复杂脚本的示例脚本。

标签: php mysql mysqli pdo sqlsrv


【解决方案1】:

摆脱$stmt-&gt;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"]; 
    }
}            

【讨论】:

  • 是的,我意识到我输入了错误的示例代码,因为我没有检查它的while,而不是for。此外,我尝试了您的代码 - 现在我的 $rowCount 返回 -1 并且我没有从数据库中获取任何行。我不确定发生了什么...
  • $stmt-&gt;rowCount() 不适用于所有数据库中的SELECT 查询。
  • 它在documentation 中说:对于大多数数据库,PDOStatement::rowCount() 不会返回受 SELECT 语句影响的行数。
  • 为什么需要使用任何东西?如果没有返回任何行,则循环将立即结束。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2013-12-24
  • 1970-01-01
  • 2023-04-03
  • 2010-11-07
  • 2013-10-05
  • 2015-06-03
相关资源
最近更新 更多