0

データベースからデータをロードして、次のようにテーブルに表示しようとしています:

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

データベースには2つのテーブルがあります:

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

たとえば、印刷された 4 つの都市の表は次のようになります。

<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>

この種のテーブルをエコーする PHP ステートメントを知っている人はいますか?

4

3 に答える 3

1
// 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;
于 2009-09-10T01:25:19.907 に答える
1

これはやや実用性の限界に達していますが、私はこの問題を「正しく行う」ための演習として取り組んでいます。

各テーブルの単純な選択を行い、配列に挿入します。

$query1 = "SELECT * FROM 都市";
$query2 = "SELECT * FROM 価格";

$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'],
                                                               $行['名前']
                                                            );

次に、これを使用して 2 つの JavaScript リストを動的に作成します。

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

次に、慎重に作成された各セルの ID を含むテーブルを出力します。最初の回答と非常によく似たコードを使用しますが、各セルに一意の id を付け"cell-<row>-<col>"ます。

私が最後に行うことはonload、適切なペアリングを使用してテーブルにデータを入力する JavaScript を作成することです。私の JavaScript はかなりさびていますが、次のようになります (注: 疑似コードが続きます)。

n = 1;
for( 都市の変数 i )
{
    // 対角線上に都市名を設定
    document.getElementById( 'cell-'&i&'-'&i ).innerHTML = names[i];
    n = n + 1;
}

for( 変数 j in 価格 )
{
    // 価格配列で都市 ID を使用します (初期化する前のコードを参照してください)
    // 価格配列) 価格を配置する
    document.getElementById( 'cell-'&prices[1]&'-'&prices[2] ).innerHTML = 価格[0];
}

私はほぼ間違いなく、その JavaScript の一部を台無しにしました。自己責任。

これは、上記の単純な答えよりもはるかに複雑ですが、これが「意味のある」ようにする唯一の方法だと思います。基本的に、この方法では、あるべき場所にすべてを配置し、奇妙なテーブルや奇妙な選択について心配する必要はありません。

于 2009-09-10T00:30:05.990 に答える
1

クエリの結果を HTML テーブルに変換するために、非常に単純な方法を使用しました。$query_result が true であることをテストし、結果を連想配列として取得します...

$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";
    }
}

編集: 今、私はあなたのテーブルを見ることができました.私はあなたの質問に本当に答えていないことがわかります. クエリは明らかに非常に重要です。質問は、「単純なアプローチでテーブルに変換できる結果を返すクエリを作成するにはどうすればよいですか?」になりますか?

他の誰かがいくつかのアイデアを持っていることを願っています。

于 2009-09-09T23:17:56.840 に答える