PHP mysql_fetch_array不返回所有行-一行总是被忽略


PHP mysql_fetch_array is not returning all rows - one row is always ignored

我正在运行一个相当直接的mysql请求,并将结果返回到一个表。数据库中有三条记录,查询是从两个表中提取的。结果,我得到了三条记录的计数(回显mysql_num_rows),但表中只显示了两条。对数组结果使用print_r命令只显示一条特定的记录—其他记录确实在print-r中显示。我向数据库中添加了另一条记录,现在显示了三条记录—与之前相同的记录没有显示,并且是print_r命令中的唯一记录。以下是相关代码:

<td id="page1"> 
  <?php             
    $limit  = 15;             // Set limit to show for pagination
    $page   = $_GET['page'];  // get page number from submit
    if($page) 
      $start = ($page - 1) * $limit; // first item to display on this page
    else
      $start = 0; // if no page var is given, set start to 0
    $query  = "SELECT PartyMstr.PartyMstrID, UserName, FirstName, LastName, XrefPartyRoleID
                FROM PartyMstrRole, PartyMstr
                WHERE PartyMstr.PartyMstrID = PartyMstrRole.PartyMstrID &&
                      PartyMstrRole.XrefPartyRoleID = 1 
                ORDER BY LastName, FirstName ASC
                LIMIT $start, $limit
              ";
    $result = mysql_query($query, $connection);
    $row = mysql_fetch_array($result) or die(mysql_error());
    $totalitems1 =  mysql_num_rows($result);
  ?>
  <center><h3> Admin User List </h3></center>
  <?php
    echo "<table border='"1'" align='"center'">";
    echo "<tr><th>PartyMaster ID</th>";
    echo "<th>UserName</th>";
    echo "<th>Last, First</th>";
    echo "<th>Link</th></tr>";
    while($row = mysql_fetch_array($result)) {
      echo "<tr><td>";
      echo $row['PartyMstrID'];
      echo "<td>";
      echo $row['UserName'];
      echo "<td>";
      echo " " . $row['LastName'] . ", " . $row['FirstName'] . " ";
      echo "<td>";
      echo "<a href = '"http://www.505575.com/editUser.php?id=" . $row['PartyMstrID'] . "'" >Edit</a>";
      // echo "<td>";
      // echo $row['XrefPartyRoleID'];
      echo "</td></tr>";
    }
    echo "</table><br/><br/> ";
    $paginaton  = getPaginationString( $page, $totalitems, $limit,
                    $adjacents  = 1,
                    $targetpage = "adminUserList.php",
                    $pagestring = "?page="
    ); // Functon found in functions.php
    echo $paginaton; 
  ?>
</td>

我花了很多时间在网上寻找一个解释,但没有成功。我已经关闭了$pagination代码行,但没有效果。我已经尝试了各种其他技巧和回声输出。返回的行数(n)总是正确的,但只有n-1行出现在表中。有什么想法吗?

Thanks - Don

每次调用mysql_fetch_array时,您都从资源中获取一行。当资源没有更多行可提供时,它返回false。这就是while ($a = mysql_fetch_array($resource))循环的工作原理。

    $result = mysql_query($query, $connection);
    $row = mysql_fetch_array($result) or die(mysql_error());    
    $totalitems1 =  mysql_num_rows($result);
    // first row is taken from resource
    ....
    while($row = mysql_fetch_array($result))
    // now take the rest of the rows
如你所见,你的代码正在做你让它做的事情!只要删除第一个$row = mysql_fetch_array($result) or die(mysql_error());,因为它没有任何用途。

在while循环之外获取第一个结果

    $query = "SELECT PartyMstr.PartyMstrID, UserName, FirstName, LastName, XrefPartyRoleID
        FROM PartyMstrRole, PartyMstr 
        WHERE PartyMstr.PartyMstrID = PartyMstrRole.PartyMstrID  && PartyMstrRole.XrefPartyRoleID = 1 
        ORDER BY LastName, FirstName ASC
        LIMIT $start,$limit";
    $result = mysql_query($query, $connection);
    $row = mysql_fetch_array($result) or die(mysql_error());    
    $totalitems1 =  mysql_num_rows($result);

必须是:

    $query = "SELECT PartyMstr.PartyMstrID, UserName, FirstName, LastName, XrefPartyRoleID
        FROM PartyMstrRole, PartyMstr 
        WHERE PartyMstr.PartyMstrID = PartyMstrRole.PartyMstrID  && PartyMstrRole.XrefPartyRoleID = 1 
        ORDER BY LastName, FirstName ASC
        LIMIT $start,$limit";
    $result = mysql_query($query, $connection);
    $totalitems1 =  mysql_num_rows($result);

正如其他人所说,问题是在进入while循环之前,在$result = mysql_query( ...之后的行中调用mysql_fetch_array()一次。这将从结果中取出第一行,但您不会对它做任何操作。然后,当您开始while循环时,您再次调用mysql_fetch_array(),但由于您已经取了第一行,因此它从第二行开始。

好的,你必须明白为什么它忽略了1行,让我们看看$row = mysql_fetch_array($result)或die(mysql_error());这段代码已经获取了你的第一行,然后你在循环中获取,所以它指向行后已经获取。

 $limit  = 15;             // Set limit to show for pagination
    $page   = $_GET['page'];  // get page number from submit
    if($page) 
      $start = ($page - 1) * $limit; // first item to display on this page
    else
      $start = 0; // if no page var is given, set start to 0
    $query  = "SELECT PartyMstr.PartyMstrID, UserName, FirstName, LastName, XrefPartyRoleID
                FROM PartyMstrRole, PartyMstr
                WHERE PartyMstr.PartyMstrID = PartyMstrRole.PartyMstrID &&
                      PartyMstrRole.XrefPartyRoleID = 1 
                ORDER BY LastName, FirstName ASC
                LIMIT $start, $limit
              ";
    $result = mysql_query($query, $connection);
    $row = mysql_fetch_array($result) or die(mysql_error());
    $totalitems1 =  mysql_num_rows($result);
  ?>
  <center><h3> Admin User List </h3></center>
  <?php
    echo "<table border='"1'" align='"center'">";
    echo "<tr><th>PartyMaster ID</th>";
    echo "<th>UserName</th>";
    echo "<th>Last, First</th>";
    echo "<th>Link</th></tr>";
    while($row = mysql_fetch_array($result)) {
      echo "<tr><td>";
      echo $row['PartyMstrID'];
      echo "<td>";
      echo $row['UserName'];
      echo "<td>";
      echo " " . $row['LastName'] . ", " . $row['FirstName'] . " ";
      echo "<td>";
      echo "<a href = '"http://www.505575.com/editUser.php?id=" . $row['PartyMstrID'] . "'" >Edit</a>";
      // echo "<td>";
      // echo $row['XrefPartyRoleID'];
      echo "</td></tr>";
    }
    echo "</table><br/><br/> ";
    $paginaton  = getPaginationString( $page, $totalitems, $limit,
                    $adjacents  = 1,
                    $targetpage = "adminUserList.php",
                    $pagestring = "?page="
    ); // Functon found in functions.php
    echo $paginaton; 
  ?>
</td>