PHP PDO foreach循环提供额外的表输出

时间:2017-01-03 21:34:04

标签: php mysql loops pdo

希望有人能解决这个问题。

我有以下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条记录适用于此人。但它显示了两个列表而不是一个总列表。

这是我生成此表的代码:

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

希望能够帮助我的人明白这一点。如果不是让我知道解释更多。 (顺便说一句:我在表格中改变了一些结果,因为它保存了私人的实际数据)

提前致谢。

编辑:

只是指出在数据库中我有一个dienaren表,在T2上有许多关系(用户名为minister_id持有用户)

循环访问具有例如的用户表。 5结果有一个表创建5次,所有5个结果(zie screenshot 2)enter image description here。我想要的只是一个表,其中包含这5个结果。我想我没有使用正确的循环功能,或者我还没有正确使用它。

screenshot2

第二次编辑:

我采取了一种不同的方法让我接近我的解决方案。我从JOIN查询更改为SELECT * FROM T1。唯一的缺点是它还显示了所有具有0结果的记录。那么我怎样才能从T1中没有查询T2结果的人那里创建一个表?

(在这种情况下ID:861保存5条记录,但ID:862没有记录,但也有一个空的表。我想摆脱空的表)

screenshot new situation

2 个答案:

答案 0 :(得分: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; ?>

答案 1 :(得分: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代码只使用左连接的第一个查询,因为它可以给你所有的信息你需要我相信。