Pergunta

Estou tentando carregar dados do banco de dados e exibi -los na tabela como aqui:

http://img196.imageshack.us/img196/1857/cijene.jpg

No banco de dados, tenho duas tabelas:

cities (id, name)
prices (id, city1_id, city2_id, price)

Por exemplo, a tabela impressa para 4 cidades ficaria assim:

<table>
 <tr>
  <td>city1</td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>

 <tr>
  <td> price_city1-city2</td>
  <td>city2</td>
  <td> </td>
  <td> </td>
 </tr>

 <tr>
  <td> price_city1-city3</td>
  <td> price_city2-city3</td>
  <td>city3</td>
  <td> </td>
 </tr>

 <tr>
  <td> price_city1-city4</td>
  <td> price_city2-city4</td>
  <td> price_city3-city4</td>
  <td>city4</td>
 </tr>
</table>

Alguém sabe qual é a declaração do PHP para ecoar esse tipo de mesa?

Foi útil?

Solução

// This single query gets all required data
// NOTE: this query assumes that your price data is entered
//   such that from_city always alphabetically precedes to_city!
$sql =
    "SELECT a.name AS from_city, b.name AS to_city, price ".
    "FROM prices ".
    "INNER JOIN cities AS a ON a.id=prices.city1_id ".
    "INNER JOIN cities AS b ON b.id=prices.city2_id";


// connect and do query
$conn = mysql_connect($host, $user, $pass);
mysql_select_db($db, $conn);
$q = mysql_query($sql, $conn);


// Stuff all data into an array for manipulation;
//   keep list of all cities mentioned
$price = array();
$cities = array();
while (($res = mysql_fetch_assoc($q)) !== false) {
    $from = $res['from_city'];
    $cities[ $from ] = true;

    $to = $res['to_city'];
    $cities[ $to ] = true;

    $price[$to][$from] = $res['price'];
}

// Invert to get alphabetical list of cities
$cities = array_keys($cities);
sort($cities);
$num = count($cities);


// some utility functions
function table($rows) {
    return '<table>'.join($rows).'</table>';
}
function row($cells) {
    return '<tr>'.join($cells).'</tr>';
}
function cell($text) {
    $text = (string) $text;
    if (strlen($text)==0)
        $text = '&nbsp;';
    return '<td>'.$text.'</td>';
}


// The data is now in the desired order;
// produce output as HTML table
$rows = array();
for ($to = 0; $to < $num; ++$to) {
    $t = $cities[$to];
    $cells = array();

    for ($from = 0; $from < $to; ++$from) {
        $f = $cities[$from];

        if isset($price[$t]) && isset($price[$t][$f])
            $text = $price[$t][$f];
        else
            $text = '';

        $cells[]= cell($text);
    }

    $cells[]= cell($t);    // add destination-label

    for ($from = $to+1; $from < $num; ++$from)   // pad to proper number of cells
        $cells[]= cell('');

    $rows[]= row($cells);
}
$html = table($rows);


// show results!
echo $html;

Outras dicas

Eu usei uma abordagem muito simples para converter os resultados de uma consulta em uma tabela HTML. Teste que $ query_result é verdadeiro e busco os resultados como uma matriz associativa ...

$query_result = mysqli_query($db, $query);

if ($query_result) {

    while ($columns = mysqli_fetch_assoc($query_result)) {

        echo "<tr>\n";

        foreach ($columns as $name => $column) {
            echo "<td>";
            printf("%s",$columns[$name]);
            echo "</td>\n";
        }

        echo "</tr>\n";
    }
}

EDIT: Agora pude olhar para a sua mesa, posso ver que realmente não respondi sua pergunta. A consulta é obviamente muito importante. A questão se torna 'como faço para criar uma consulta que retorne resultados que podem ser transformados em uma mesa pela minha abordagem de mente simples?'

Espero que outra pessoa tenha algumas idéias.

Isso está um pouco à beira da praticidade, mas estou abordando esse problema mais como um exercício em "fazer certo".

Eu faria uma simples seleção de cada tabela e inseriria em uma matriz:

$query1 = "SELECT * FROM cities";
$query2 = "SELECT * FROM prices";

$results1 = mysql_query( $query1 );
$results2 = mysql_query( $query2 );

while( $rows = mysql_fetch_array( $results1 ) ) $cities[] = $row['name'];
while( $rows = mysql_fetch_array( $results2 ) ) $prices[] = array(
                                                               $row['city1_id'],
                                                               $row['city2_id'], 
                                                               $row['name']
                                                            );

Eu usaria isso para criar dinamicamente duas listas JavaScript:

$java_array1 = "var Cities = new Array;\n";
foreach( $cities as $key=>$city ) $java_array1 .= "Cities[$key] = \"$city\";\n";
$java_array2 = "var Prices = new Array;\n";
foreach( $cities as $key=>$price ) $java_array2 .= "Prices[$key] = new Array(
                                                                     \"{$price[0]}\",
                                                                     \"{$price[1]}\",
                                                                     \"{$price[2]}\",
                                                                  );\n";

Em seguida, eu emitiria uma tabela com IDs cuidadosamente criados para cada célula. Eu usaria código muito parecido com o da primeira resposta, mas daria a cada célula um ID único de "cell-<row>-<col>".

A última coisa que eu faria seria a criação de alguns onload JavaScript que preencheria a tabela usando os pares apropriados. Meu JavaScript está bastante enferrujado, mas seria algo assim (Nota: Pseudocode segue):

n = 1;
for( var i in cities )
{
    // set city names on the diagonal
    document.getElementById( 'cell-'&i&'-'&i ).innerHTML = names[i];
    n = n + 1;
}

for( var j in prices )
{
    // use the city IDs in the prices array (see earlier code initializing
    // prices array) to place the prices
    document.getElementById( 'cell-'&prices[1]&'-'&prices[2] ).innerHTML = prices[0];
}

Eu quase certamente estraguei alguns desses javascript; Use por sua conta e risco.

Isso é muito mais complexo do que a resposta mais simples dada acima, mas essa é a única maneira de pensar em fazê -lo para que faça "sentido". Basicamente, com este método, você coloca tudo onde ele deve Seja, e você não precisa se preocupar com mesas estranhas e seleções estranhas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top