2017-12-18 16 views
1

データベースから以下の形式でデータをエコーし​​ようとしています。意味PHP - PostgreSQLが1つのセルにデータをエコーする(HTMLテーブル)

|column-1|column-2|column-3|column-4|column-5| 
|--------|--------|--------|--------|--------| 
|My Name | Date |Message | People |Phone #s| 
          | People |Phone #s| 
          | People |Phone #s| 
          | People |Phone #s| 
          | People |Phone #s| 

、私は、データベースから選択していたデータは、列4、5人が列1に人からのメッセージ(カラム3)を受信するようなものです。しかし、dbからのデータをエコーする私のコードによれば、私は、以下に示すように、列4と5のすべての他の人のために新しい列を持っています。

|column-1|column-2|column-3|column-4|column-5| 
|--------|--------|--------|--------|--------| 
|My Name | Date |Message | People |Phone #s| 
|My Name | Date |Message | People |Phone #s| 
|My Name | Date |Message | People |Phone #s| 
|My Name | Date |Message | People |Phone #s| 
|My Name | Date |Message | People |Phone #s| 

以下は、テーブルを生成する私のPHPコードです。

echo "<table id='table'>"; 
while($row=pg_fetch_assoc($result)){echo "<tr>"; 
echo "<td align='left' width='200'>" . $row['message_by'] . "</td>"; 
echo "<td align='left' width='200'>" . $row['message_date'] . "</td>"; 
echo "<td align='left' width='200'>" . $row['message_text'] . "</td>"; 
echo "<td align='left' width='200'>" . $row['phone_number'] . "</td>"; 
echo "<td align='left' width='200'>" . $row['recipient_name'] . "</td>"; 
echo "</tr>";} 
echo "</table>"; 

そこで問題は、どのように出力カラム4および5のデータ1つのセルにまたは代替的には、3列1を繰り返すことなく、異なるセルにデータをエコーすることができますか?

+0

(たとえば)message_byの前の値を格納し、次のループに同じ値がある場合は出力しないでください。 –

+0

'td'の' rowspan'と 'colspan''の' attr'を使います。 – adeltahir

+0

'rowspan'と' colspan'は私にそれらに番号を割り当てる必要があります、どうすればdbから返された人の数に応じて動的にそれを達成できますか? –

答えて

1

問題を処理する典型的な方法は、列の値の変化を追跡する小さな状態マシンを構築することです。あなたの場合、最初の3つの列の値のいずれかが変更された場合、完全なレコードを印刷するように見えます。それ以外の場合は、最後の2つの列を印刷します。以下で使用されるトリックは、タグがのタグを常に落とすということですが、繰り返しの行では空の文字列しか割り当てません。重要

$col1 = NULL; 
$col2 = NULL; 
$col3 = NULL; 
echo "<table id='table'>"; 
while ($row = pg_fetch_assoc($result)) { 
    $text1 = ''; 
    $text2 = ''; 
    $text3 = ''; 
    if ($row['message_by'] != $col1 || 
     $row['message_date'] != $col2 || 
     $row['message_text'] != $col3) { 
     $col1 = $row['message_by']; 
     $col2 = $row['message_date']; 
     $col3 = $row['message_text']; 
     $text1 = $col1; 
     $text2 = $col2; 
     $text3 = $col3; 
    } 
    echo "<tr>"; 
    echo "<td align='left' width='200'>" . $text1 . "</td>"; 
    echo "<td align='left' width='200'>" . $text2 . "</td>"; 
    echo "<td align='left' width='200'>" . $text3 . "</td>"; 
    echo "<td align='left' width='200'>" . $row['phone_number'] . "</td>"; 
    echo "<td align='left' width='200'>" . $row['recipient_name'] . "</td>"; 
    echo "</tr>"; 
} 
echo "</table>"; 

は、この答えはのみ動作し、あなたのPostgresのクエリがORDER BYを使用して結果セットをソートした場合にのみ、理にかなっています。特に、3つのメッセージ列が最初にソートされた状態で、クエリが順序付けされている必要があります。

+0

ありがとう。出来た。そして、はい、私の結果セットは既に注文されました。 –

関連する問題