2017-01-03 11 views
2

誰かがこれを解決できることを願っています。PHP PDOのforeachループで余分なテーブル出力が得られる

私は、次のMySQLのクエリを持っている:

$sql = $db->prepare("SELECT 
       dienaren.id, 
       dienaren.achternaam_minister, 
       dienaren.email_minister, 
       dienaren.gemeente, 
       users.achternaam, 
       users.email, 
       users.periode_van, 
       users.periode_tot 
       FROM dienaren 
       LEFT JOIN users 
       ON dienaren.id = users.minister_id 
       WHERE users.periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY) 
       ORDER BY dienaren.id,users.periode_tot ASC"); 
$sql->execute(); 

これは

(私がチェックして正しいです)私に29行の結果を与えている今、私は示すために、ループのようなものを使用したいです人物Aがクエリに対応するx行を有するテーブル。人物B、人物Cなどここで

は電流出力とスクリーンショットであるため、同じカウントは:あなたが見ることができるように

screenshot

この人のために真である2つのレコードがあります。しかし、1つのリストの代わりに2つのリストを表示しています。

ここでは、このテーブルを作成する私のコードです:

<?php 
$count = $sql->rowCount(); 
echo '<p>Total result SQL query: '.$count.'</p>'; 
?> 

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 

<?php foreach($sql->fetchAll(PDO::FETCH_OBJ) as $voorganger): ?> 

    <div><strong>Person ID: <?= $voorganger->id;?></strong></div> 
    <div>Is in control of the following users:</div> 

    <table> 
     <tr> 
     <th>Voorletter(s)</th> 
     <th>Periode Tot</th> 
     <th>Status</th> 
     </tr> 

    <?php 
    $query = $db->prepare("SELECT * FROM users WHERE minister_id = '{$voorganger->id}' AND periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY) ORDER BY minister_id ASC"); 
    $query->execute(); 

    foreach($query->fetchAll(PDO::FETCH_OBJ) as $user) : ?> 

     <?php $date = new DateTime($user->periode_tot); ?> 

     <tr style="background:rgba(244, 65, 55, 0.35);"> 
      <td><?= $user->voorletters; ?></td> 
      <td><?= $date->format('d-m-Y'); ?></td> 

      <?php if (dateDifference($user->periode_tot,$currentdate) > 0 && dateDifference($user->periode_tot,$currentdate) <= 30) { ?> 
       <td>Verloopt over&nbsp;<?= dateDifference($user->periode_tot,$currentdate); ?>&nbsp;dagen</td> 
      <?php } else { ?> 
       <td>Verlopen</td> 
      <?php } ?> 
     </tr> 

    <?php endforeach; ?> 

    </table> 
    <hr> 

<?php endforeach; ?> 

</body> 
</html> 

ホープこれはには、私を助けるために望んでいるものには明らかです。私にもっと説明するだけではない場合は、 (Btw:プライベートな実際のデータを保持しているため、テーブルの結果を一部変更しました)

ありがとうございます。

EDIT:

ちょうどデータベースに私は例えばを持つusersテーブルをループT2上の多くの関係(minister_idというフィールドを持つユーザーを保持している)

を持ってdienarenテーブルを持っていることを指摘。 5つの結果が5つの結果(zieスクリーンショット2)enter image description hereで5回作成されたテーブルがあります。代わりに私が望むのは、これらの5つの結果を保持するただ1つのテーブルです。私は正しいループ機能を使用していないと思うか、とにかくそれを正しく使用していないと思います。

screenshot2

SECOND EDIT:

私は私の解決策の近くに私を得た異なるアプローチを取りました。私はJOINクエリからSELECT * FROM T1に変更しました。欠点は、結果が0のすべてのレコードも表示することだけです。だから私はどのようにT2のクエリからの結果がないT1の人からテーブルの作成をすることができますか?

(この場合はID:861は5つのレコードを保持しているが、ID:862にレコードを持っていませんが、またある空であるテーブルを持っている私が空のテーブルを取り除きたい)

screenshot new situation

+0

最初のクエリを印刷して、何人の人物IDが印刷されているかを調べることができます。これは1回または複数回の印刷です。 –

+0

@ImranSaleem私は最初のものよりもうまくいった別のアプローチを採用しました。私はあなたの答えは私が探していますものではありません – Brnovich

答えて

0

GROUP BY dienaren.idを使用すると、最初のクエリでIDを繰り返す必要がないようです。

$sql = $db->prepare("SELECT 
       dienaren.id, 
       dienaren.achternaam_minister, 
       dienaren.email_minister, 
       dienaren.gemeente, 
       users.achternaam, 
       users.email, 
       users.periode_van, 
       users.periode_tot 
       FROM dienaren 
       LEFT JOIN users 
       ON dienaren.id = users.minister_id 
       WHERE users.periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY) 
       GROUP BY dienaren.id 
       ORDER BY dienaren.id,users.periode_tot ASC"); 
$sql->execute(); 

あなたは、あなたには、いくつかのものを削除するか、多分それだけが与えることができるので、左の最初のクエリが参加利用するPHPコードを編集することができ、未使用のあるあなたの最初のクエリで多くのものを選択しているように思えますあなたが必要とするすべての情報を私は信じています。

+0

私のQを更新します。このウィルはジエナレンのリストを返すだけで、1レコードしか返しません。私は2つのテーブルを持っています。 T1およびT2。 T1のIDフィールドには、minister_idフィールドを保持するT2のレコードが多数あるという関係です。私は私の質問を編集し、私のQをうまく説明する別のスクリーンショットを追加します。 – Brnovich

+0

私はまだあなたが私が推測求めていた正確に理解していません。 2番目のクエリですべてのT2テーブル行を選択していたようです。私はT1からの重複を取り除こうとしていましたが、それはあなたにそれぞれの人のための1つのリストを与えました。たぶん、テーブル構造を表示すると答えやすくなりました。私はあなたがそれを解決してうれしく思います、フィードバック、更新、およびあなた自身のソリューションを共有してくれてありがとう。 –

1

解決済み:それほど多くのフィディーリングの後で動作しました!どのような援助になるようにしようとした人たちに感謝し 。

============================================== =========================

foreach($sql->fetchAll(PDO::FETCH_OBJ) as $person): 

$person_id = $person->id; 

$query = $db->prepare("SELECT * FROM users WHERE person_id = '{$person_id}' AND periode_tot < DATE_ADD(CURDATE(), INTERVAL + 31 DAY)"); 
$query->execute(); 

$total = $query->rowCount(); 

if ($total > 0) { 
?> 
    <div><?= $person_id; ?></div> 
    <div><?= $person->achternaam_person; ?></div> 
    <div><?= $person->gemeente; ?></div> 

    <table> 
     <tr> 
     <th>Gemeente</th> 
     <th>Achternaam(s)</th> 
     <th>Voorletter(s)</th> 
     <th>Periode Tot</th> 
     <th>Status</th> 
     <th>Email</th> 
     </tr> 
<?php 
    while ($user = $query->fetch(PDO::FETCH_OBJ)) { 
     $date = new DateTime($user->periode_tot); 
?> 
    <tr style="background:rgba(244, 65, 55, 0.35);"> 
     <td><?= $user->gemeente; ?></td> 
     <td><?= $user->achternaam; ?></td> 
     <td><?= $user->voorletters; ?></td> 
     <td><?= $date->format('d-m-Y'); ?></td> 
     <td>Verloopt over&nbsp;<?= dateDifference($user->periode_tot,$currentdate); ?>&nbsp;dagen</td> 
     <td><?= $user->email; ?></td> 
    </tr> 

<?php } } ?> 

    </table> 

<?php endforeach; ?> 

================ ========================================== =====これは他の人が将来的にaswell役立つ

希望。

関連する問題