Russ Teicheira
Russ Teicheira

Reputation: 3

PHP while-for nested loops not showing all MySQL results

I've looked through some of the other answers on this, but they don't seem to solve my particular issue (or I am coding them wrong, which is also possible).

I know my SQL code works right, as I get all 19 rows of output, but when I output it to a PHP page, the page shorts me by 5 rows.

If I don't try to show the results in three columns by whatever (and just use one column) everything shows. When I try to do three by 'X', is when it starts cutting off results.

Here is my old, not working PHP code:

$fleet_query_results = @mysql_query($fleet_query, $connection) or die(mysql_error());

while($row = mysql_fetch_array($fleet_query_results)) {
    $display_fleet .= "<tr>";

    for($i = 1; $i < 4 && $row = mysql_fetch_array($fleet_query_results); $i++) {
        $ship_info = $row['ship_info'];
        $mem_info = $row['mem_info'];
        $ship_link = $row['ship_link'];

        $display_fleet .= "
            <td valign=\"top\"><div id=\"fleet\"><div id=\"fheader\">$ship_info</div><br/><img align=\"center\" height=\"210\" width=\"350\" alt=\"$ship_name\" src=\"$ship_link\" /><br /><div id=\"fmem\">$mem_info</div></div></td>
        ";
    }

    $display_fleet .= "</tr>";
}

Any ideas? It's cutting off the first, fourth, ninth, thirteenth and seventeenth results.

Example page results:

<table border="1">
  <tr><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td></tr>
  <tr><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td></tr>
  <tr><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td><td>Header<br />Image<br />People</td></tr>
</table>

New code that works, but is UGLY:

    $fleet_query_results = @mysql_query($fleet_query, $connection) or die(mysql_error());

while($row = mysql_fetch_array($fleet_query_results)) {
    $display_fleet .= "<tr>";
    $ship_info = $row['ship_info'];
    $mem_info = $row['mem_info'];
    $ship_link = $row['ship_link'];

    $display_fleet .= "
        <td valign=\"top\"><div id=\"fleet\"><div id=\"fheader\">$ship_info</div><br/><img align=\"center\" height=\"210\" width=\"350\" alt=\"$ship_name\" src=\"$ship_link\" /><br /><div id=\"fmem\">$mem_info</div></div></td>
    ";

    for($i = 1; $i < 3 && $row = mysql_fetch_array($fleet_query_results); $i++) {
        $ship_info = $row['ship_info'];
        $mem_info = $row['mem_info'];
        $ship_link = $row['ship_link'];

        $display_fleet .= "
            <td valign=\"top\"><div id=\"fleet\"><div id=\"fheader\">$ship_info</div><br/><img align=\"center\" height=\"210\" width=\"350\" alt=\"$ship_name\" src=\"$ship_link\" /><br /><div id=\"fmem\">$mem_info</div></div></td>
        ";
    }

    $display_fleet .= "</tr>";
}

Upvotes: 0

Views: 87

Answers (1)

Jasen
Jasen

Reputation: 12412

Your while was eating some of the data rows.

$fleet_query_results = @mysql_query($fleet_query, $connection) or die(mysql_error());
$rows=1;
while($rows) {
    $display_fleet .= "<tr>";

    for($i = 1; $i < 4 && $row = mysql_fetch_array($fleet_query_results); $i++) {
        $rows=$row;
        if (!$row) break;
        $ship_info = $row['ship_info'];
        $mem_info = $row['mem_info'];
        $ship_link = $row['ship_link'];

        $display_fleet .= "
            <td valign=\"top\"><div id=\"fleet\"><div id=\"fheader\">$ship_info</div><br/><img align=\"center\" height=\"210\" width=\"350\" alt=\"$ship_name\" src=\"$ship_link\" /><br /><div id=\"fmem\">$mem_info</div></div></td>
        ";
    }

    $display_fleet .= "</tr>";
}

or, as discussed below:

$i=0
while($row = mysql_fetch_array($fleet_query_results)) {

    if( $i % 4 = 0 )
        $display_fleet .= "<tr>";

    $ship_info = $row['ship_info'];
    $mem_info = $row['mem_info'];
    $ship_link = $row['ship_link'];

    $display_fleet .= "
            <td valign=\"top\"><div id=\"fleet\"><div id=\"fheader\">$ship_info</div><br/><img align=\"center\" height=\"210\" width=\"350\" alt=\"$ship_name\" src=\"$ship_link\" /><br /><div id=\"fmem\">$mem_info</div></div></td>
        ";

    if( ++$i % 4 = 0 )
        $display_fleet .= "</tr>\n";

}

// clean add the missing cells to last row.
if( $i % 4 != 0 )
{
    while($i++ %4)
      $display_fleet .= "<td></td>";
    $display_fleet .= "</tr>\n";
}

Upvotes: 1

Related Questions