【问题标题】:Missing the first row of a SELECT statment缺少 SELECT 语句的第一行
【发布时间】:2016-10-17 09:24:01
【问题描述】:

我有一个名为“模块”的数据库表,我正在尝试从该表中选择所有行并将它们显示在一个表中。每行都有一个名为 MOrder 的列,范围从 1 - 可用的模块数量。

这是我的代码:

    $sql_query = "SELECT * FROM Modules WHERE CourseID = ". $CourseID ." ORDER BY MOrder ASC";
    $result = mysqli_query($dbconfig, $sql_query);
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    $count = mysqli_num_rows($result);

    echo '<div class="row">';
        echo '<div class="col-md-12">';
            echo '<table class="table">';
            if($count > 0) {
                $_SESSION['countMOrder'] = $count;

                echo '<tr>';
                    echo '<th>Module Title</th> ';
                    echo '<th></th>';
                echo '</tr>';
                while ($row = mysqli_fetch_array($result)) {
                    echo '<tr>';
                        echo '<td>'. $row['Title'] .'</td> ';
                        echo '<td><a href="user-view-module-revised.php?CourseID='. $row['CourseID'] .'&ModuleID='. $row['ID'] .'&MOrder='. $row['MOrder'] .'" title="Take Module" class="btn btn-success" id="'. $row['MOrder'] .'">Take Module</a></td>';
                    echo '</tr>';
                }
            }
            echo '</table>';
        echo '</div>';
    echo '</div>';
?>

但是,无论出于何种原因,该语句都缺少 MOrder 1 的模块并且总是以 2 开头?

这是为什么?

【问题讨论】:

  • mysqli_fetch_array 按顺序返回行。您在查询后立即调用它,因此您的 while 循环将看到的第一行是第 2 行。
  • 只删除第三行代码$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
  • 去掉这行$row = mysqli_fetch_array($result, MYSQLI_ASSOC);,应该没问题!
  • MySQL skipping first row的可能重复

标签: php mysql


【解决方案1】:

您在粘贴代码的第三行调用$row = mysqli_fetch_array($result, MYSQLI_ASSOC);,这将从结果中提取第一个数组。

这将在您的 while 循环中被覆盖:

while ($row = mysqli_fetch_array($result)) { // <-- overwritten here with item 2
    //...
}

【讨论】:

    【解决方案2】:

    因为你在代码的第三行调用了

    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    

    一次,然后在循环中开始调用

    $row = mysqli_fetch_array($result)
    

    再次,从而用第二行覆盖 $row 变量。去掉第一个$row = mysqli_fetch_array($result) 行。

    【讨论】:

      【解决方案3】:

      试试这个代码。

      $sql_query = "SELECT * FROM Modules WHERE CourseID = ". $CourseID ." ORDER BY MOrder ASC";
          $result = mysqli_query($dbconfig, $sql_query);
          $count = mysqli_num_rows($result);
      
          echo '<div class="row">';
              echo '<div class="col-md-12">';
                  echo '<table class="table">';
                  if($count > 0) {
                      $_SESSION['countMOrder'] = $count;
      
                      echo '<tr>';
                          echo '<th>Module Title</th> ';
                          echo '<th></th>';
                      echo '</tr>';
                      while ($row = mysqli_fetch_array($result)) { //for every fetch we'll get one row.
                          echo '<tr>';
                              echo '<td>'. $row['Title'] .'</td> ';
                              echo '<td><a href="user-view-module-revised.php?CourseID='. $row['CourseID'] .'&ModuleID='. $row['ID'] .'&MOrder='. $row['MOrder'] .'" title="Take Module" class="btn btn-success" id="'. $row['MOrder'] .'">Take Module</a></td>';
                          echo '</tr>';
                      }
                  }
                  echo '</table>';
              echo '</div>';
          echo '</div>';
      

      【讨论】:

        【解决方案4】:

        一开始,您获取第一行。

        $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
        

        在while循环中,fetch函数返回第二行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-27
          • 1970-01-01
          • 1970-01-01
          • 2023-02-02
          • 1970-01-01
          • 2012-12-24
          • 2023-02-21
          相关资源
          最近更新 更多