0

Time 'Punching' System を開発しており、PHP でテーブルを作成して、2 つのテーブルから水平方向にデータを表示しようとしています。

tb_users AS u

tb_punch AS p

次のようにデータを表示したいと思います。

 u.user   p.punch    p.punch    p.punch    p.punch
+-------+----------+----------+----------+----------+
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |
|User 2 | 08:00:00 | 12:00:00 |          |          |
|User 3 | 09:00:00 |          |          |          |
+-------+----------+----------+----------+----------+

等々...

しかし、代わりに次の結果が得られます。

 u.user   p.punch    p.punch    p.punch    p.punch   p.punch    p.punch    p.punch
+-------+----------+----------+----------+----------+---------+----------+---------+
|User 1 | 10:00:00 |          |          |          |         |          |         |
|User 1 | 10:00:00 | 12:00:00 |          |          |         |          |         |
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 |          |         |          |         |
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |         |          |         |
|User 2 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 |          |         |
|User 2 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 | 12:00:00 |         |
|User 3 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |08:00:00 | 12:00:00 |09:00:00 |
+-------+----------+----------+----------+----------+---------+----------+---------+

つまり、ユーザーごとにパンチをグループ化するために必要なときに、すべての PUNCH を各行で繰り返します。

これが私がこれをやろうとしている方法です:

$query = "SELECT u.user, p.punch FROM users u INNER JOIN punches p ON u.id = p.id_user"
$rt = pg_query($query) or die ("Error: [" . $query . "]");

$punches = array();
echo "<tbody>";
while($nt=pg_fetch_assoc($rt)){

    echo "<tr>";

    echo    "<td>" . $nt[user] . "</td>";

    $punches[] = $nt[punch]; 
    foreach ($punches as $punch){
        echo    "<td>" . date('H:i:s',strtotime($punch)) . "</td>";
    }
}
echo "</tr></tbody>";
?>
</table>

何が間違っている可能性があるかについての手がかりはありますか?ありがとうございました!

4

4 に答える 4

1

SQL クエリをプレゼンテーション レイヤーやワークフロー レイヤーと混在させることはお勧めしません。Pomm を使用すると、次のようにデータベースにクエリを実行できます。

SELECT 
 u.user,
 ... -- other users fields
 array_agg(p.punch) AS punch_times 
FROM 
 users u 
   INNER JOIN punchs p ON u.id = p.id_user
GROUP BY
  u.user,
  ... -- other users fields

そして、という名前のフィールドの DateTime の追加配列で水和された Users オブジェクトのコレクションを直接取得しますpunch_times。したがって、テンプレートは次のようになります。

<tbody>
<?php foreach ($users as $user): ?>
  <tr>
    <td><?php echo $user['user'] ?></td>
    <td>
      <ul>
      <?php foreach ($user['punch-times'] as $punch_time): ?>
        <li><?php echo $punch_time->format('H:i:s') ?></li>
      <?php endforeach ?>
    </td>
  </tr>
<?php endforeach ?>
</tbody>
于 2012-09-17T07:57:29.763 に答える
0

GROUP BY u.idクエリに追加してみてください。

于 2012-09-13T19:34:37.227 に答える
0

試してみてくださいSELECT u.user, string_agg(p.punch,',') AS punches FROM users AS u JOIN punches AS p ON u.id=p.id_user GROUP BY u.user

そして、次のようなもの

while($nt = pg_fetch_assoc($rt)) {
    echo "<tr><td>{$nt['user']}</td>";
    echo "<td>",implode('</td><td>',explode(',',$nt['punches'])),"</td>";
    echo "</tr>";
}

PS また、あなたのコードは不均衡な<tr>/を生成するよう</tr>です。

于 2012-09-13T19:34:40.537 に答える
0

さて、私の友人の助けを借りて、私はそれを理解しました。

クエリ ステートメントは変更しませんでした。特定の条件下で表示されるようにいくつかの TR と TD にフラグを立てただけです。これが私がやったことです:

echo "<tbody>";
$prev_user = "";
$flag = true;

while($nt=pg_fetch_assoc($rt)){

    if ($flag) {
        echo "<tr>";
        echo "<td>" . $nt[user] . "</td>";
        $prev_user = $nt[user];
    }

    if ($prev_user != $nt[user]) {
        echo "</tr>";
        echo "<tr>";
        echo "<td>" . $nt[user] . "</td>";
    }

    echo "<td>" . date('H:i:s',strtotime($nt[punch])) . "</td>";

    $prev_user = $nt[user];

    $flag = false;

}

echo "</tbody>";

これで問題が解決し、次のようなテーブルが得られました。

u.user   p.punch    p.punch    p.punch    p.punch
+-------+----------+----------+----------+----------+
|User 1 | 10:00:00 | 12:00:00 | 13:00:00 | 19:00:00 |
|User 2 | 08:00:00 | 12:00:00 |          |          |
|User 3 | 09:00:00 |          |          |          |
+-------+----------+----------+----------+----------+
于 2012-09-14T13:23:35.820 に答える