PHP mysql_fetch_array возвращает не все строки — одна строка всегда игнорируется

#php

#php

Вопрос:

Я выполняю довольно прямой запрос 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 amp;amp;
                      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 в таблице отображаются только строки. Есть идеи?

Спасибо — Дон

Комментарии:

1. В качестве пояснения: вы придерживались do print_r($row) только внутри вашего while -loop?

2. Вы можете подумать об обучении PDO , в любом случае это будет устаревшим.

Ответ №1:

Каждый раз, когда вы вызываете 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()); , поскольку она все равно не служит никакой цели.

Комментарии:

1. Спасибо всем, кто ответил — ответ очевиден, как только указано. Я проверил первый из многих правильных ответов как правильный только для упрощения. Еще раз спасибо.

Ответ №2:

Вы извлекаете первый результат вне вашего цикла while.

Ответ №3:

     $query = "SELECT PartyMstr.PartyMstrID, UserName, FirstName, LastName, XrefPartyRoleID
        FROM PartyMstrRole, PartyMstr 
        WHERE PartyMstr.PartyMstrID = PartyMstrRole.PartyMstrID  amp;amp; 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  amp;amp; PartyMstrRole.XrefPartyRoleID = 1 
        ORDER BY LastName, FirstName ASC
        LIMIT $start,$limit";
    $result = mysql_query($query, $connection);
    $totalitems1 =  mysql_num_rows($result);
  

Ответ №4:

Как и другие, проблема в том, что вы вызываете mysql_fetch_array() один раз, в строке после $result = mysql_query( ... , прежде чем перейти в свой while цикл. Это берет первую строку из ваших результатов, но вы никогда ничего с ней не делаете. Затем, когда вы запускаете цикл while, вы вызываете mysql_fetch_array() снова, но поскольку вы уже взяли первую строку, она начинается со второй строки.

Ответ №5:

хорошо, вы должны понять, почему он игнорирует 1 строку, давайте посмотрим $row = mysql_fetch_array($result) или die(mysql_error()); этот код уже извлекает вашу 1-ю строку, а затем вы выполняете выборку в цикле, чтобы он указывал строку после того, как строка уже извлечена.

  $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 amp;amp;
                      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>