Build dynamic HTML table with PHP

Asked

Viewed 6,303 times

0

I’m wondering how to build a dynamic table with PHP.

I am mounting an HTML table in which will be displayed some data registered in a database, already created the SELECT which brings the database information, but I’m doubtful how to build the loop to display the information as the table will have 4 columns.

I tried to make a noose FOR however he displayed the table as follows.

Item 1 | Item 1 | Item 1 | Item 1
Item 2 | Item 2 | Item 2 | Item 2
Item 3 | Item 3 | Item 3 | Item 3

When should I display

Item 1 | Item 2 | Item 3 | Item 4
Item 5 | Item 6 | Item 7 | Item 8
Item 9 | Item 10 | Item 11 | Item 12

Loop structure

<?php while ( $linha = mysqli_fetch_assoc($executaSelect) ) { ?>
  <tr>
    <?php for ($i = 1 ; $i <= 4 ; $i++) { ?>
      <td><?php echo $linha["nome"]; ?></td>
   <?php } ?>
  </tr>
<?php } ?>
  • See if this helps you http://codigofonte.l.com.br/codigos/gerar-uma-lista-em-html-a-partir-de-consulta-mysql-comphp

2 answers

1

Try the following:

<?php
$i=0;
echo '<table border="0">'
while ( $linha = mysqli_fetch_assoc($executaSelect) ) {
    if ($i === 0) echo '<tr>'
    echo '<td>' . $linha["nome"] . '</td>';
    $i++;
    if ($i === 4) { 
        echo '</tr>'; // A cada 4 colunas fecha uma linha
        $i=0; // Zera o contador para abrir nova linha no início do loop
    }
}
if ($i > 0) echo '</tr>'; // Caso a última linha tenha menos de 4 colunas, fecha a linha
echo '</table>';
?>
  • It works fine, except there’s one detail. When the amount of records returned from the database query is not multiple of 4, the last row of the table will be open, which can cause a severe conflict and break the entire page layout.

  • 1

    @bfavaretto, my fault, the first $i=0 obviously should be out of the loop. I tidied up in the example.

  • @Danielomine, I put a "close" for the last row when it has less than 4 columns. Now at most it will not have the right number of columns. [s]

1

I made a very detailed adaptation. The code looks great because of the comments, line breaks, etc. I did so to make it easy to read and understand the code.

<?php 
/*
Inicia o contador geral que será usado para comparar a quantidade de registros retornados do banco de dados.
*/
$c = 0;
/*
Inicia o contador de colunas
*/
$i = 1;
/*
Quantidade de colunas por linha
*/
$l = 4;

/*
Quantidade de registros retornados do banco de dados
*/
$rows = mysqli_num_rows($executaSelect);

/*
Itera a consulta ao banco de dados
*/
while ( $linha = mysqli_fetch_assoc($executaSelect) )
{
    /*
    Se o valor do contador de colunas $i for igual a 1, indica que uma nova linha deve ser aberta.
    Se uma nova linha está sendo aberta, quer dizer que uma linha anterior deve ser fechada. No entando, é preciso verificar se já passou pela primeira linha, pois antes da primeira linha não há o que ser fechado.
    Para verificar isso, podemos aproveitar o contador geral $c
    */
    if( $i <= 1 )
    {
        if( $c > 0 ){echo '</tr>'} // Fecha uma linha
        echo '<tr>'; // Abre uma linha
    }

    /*
    Escreve a coluna com o valor obtido da consulta ao banco de dados
    */
    echo PHP_EOL . '<td>' . $linha["nome"] . '</td>';

    /*
    Checagem para incrementar ou resetar o contador de colunas.
    */
    if($i <= $l )
    {
        /*
        Incrementa o valor de $i para indicar que será escrita a próxima linha 
        */
        $i++;
    }else{
        /*
        Reseta para o valor 1, pois será formada nova linha caso não tenha chegado ao final indicado pela condição $c == $row
        */
        $i = 1;
    }

    /*
    Incrementa o valor do contador geral.
    Deve ser livre, sem condicionais.
    */
    $c++;

    /*
    Verifica se encontrou o final da consulta.
    Esse passo é muito importante para evitar que a última linha fique sem a tag de fechamento pois a quantidade de registros pode ser um número que não seja múltiplo do valor definido na variável $l
    */
    if( $c == $row )
    {
        echo '</tr>';
    }
}
?>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.