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

PHP PDO foreach循环提供额外的表输出,php,mysql,loops,pdo,Php,Mysql,Loops,Pdo,希望有人能解决这个问题 我有以下MySQL查询: $sql = $db->prepare("SELECT dienaren.id, dienaren.achternaam_minister, dienaren.email_minister, dienaren.gemeente, users.achternaam,

希望有人能解决这个问题

我有以下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();
$sql=$db->prepare(“选择
迪纳伦,
迪纳伦·阿切特纳姆(dienaren.achternaam_)部长,
dienaren.u部长,
迪纳伦·格米恩特,
users.achternaam,
用户邮箱:,
用户:periode_van,
用户周期
来自迪纳伦
左加入用户
关于dienaren.id=users.minister\u id
其中users.periode_totexecute();
这给了我29行的结果(我检查的结果是正确的)

现在我想使用一种循环来显示一个表,其中persona有x行与查询对应。B人、C人等也同样计算在内

以下是当前输出的屏幕截图:

正如你所看到的,有两条记录对此人是正确的。但它显示的是两个列表,而不是一个总列表

以下是生成此表的代码:

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

文件
个人ID:
由以下用户控制:
(s)
托特周期
地位
达根上空的维洛普
维洛彭

希望这对想要帮助我的人来说是清楚的。如果不是的话,请让我知道并解释更多。(顺便说一句:我更改了表中的一些结果,因为它包含实际数据,而这些数据是私有的)

提前谢谢

编辑:

只是指出,在数据库中,我有一个dienaren表,它在T2上有很多关系(用一个名为minister_id的字段容纳用户)

在用户表中循环,例如有5个结果。有一个表创建了5次,其中包含所有5个结果(zie屏幕截图2)。相反,我想要的只是一个包含这5个结果的表。我认为我没有使用正确的循环函数,或者我没有正确地使用它

第二次编辑:

我采取了一种不同的方法,这使我接近了我的解决方案。我从连接查询改为从T1选择*。唯一的缺点是,它还显示所有结果为0的记录。那么,如何从T1中的人员创建一个表,而该人员在T2中没有查询结果呢

(在本例中,ID:861保存5条记录,但ID:862没有记录,但它也有一个空表。我想去掉空表)


您可以使用
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();
$sql=$db->prepare(“选择
迪纳伦,
迪纳伦·阿切特纳姆(dienaren.achternaam_)部长,
dienaren.u部长,
迪纳伦·格米恩特,
users.achternaam,
用户邮箱:,
用户:periode_van,
用户周期
来自迪纳伦
左加入用户
关于dienaren.id=users.minister\u id
其中users.periode_totexecute();
似乎您在第一次查询中选择了许多未使用的内容,您可以删除一些内容,或者编辑php代码,只利用第一次查询的左连接,因为它可以提供您所需的所有信息。

成功了:

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; ?>
foreach($sql->fetchAll(PDO::FETCH_OBJ)作为$person):
$person\u id=$person->id;
$query=$db->prepare(“从用户中选择*,其中person\u id='{$person\u id}'和periode\u totexecute();
$total=$query->rowCount();
如果($total>0){
?>
吉米内特
阿彻南(s)
(s)
托特周期
地位
电子邮件
达根上空的维洛普

你的答案不是我想要的。这将只返回一个dienaren列表,只有一条记录。我有两个表。T1和T2。关系是T1的ID字段有许多T2记录,其中包含部长ID字段。我将编辑我的问题,并添加另一个屏幕截图,希望能更好地解释我的问题。我仍然我想我不太明白你到底在问什么。看起来你在第二次查询中选择了所有T2表行。我正试图消除T1中的重复项,这将为每个人提供一个列表。也许显示表结构会使回答更容易。我很高兴你解决了它,并感谢你的帮助反馈、更新和共享您自己的解决方案。您是否可以打印第一个查询,并查看打印了多少个人id,打印861一次或多次time@ImranSaleem我采取了一种不同的方法,比第一种方法效果更好。我会更新我的Q