【问题标题】:PHP PDO foreach loop gives extra table outputPHP PDO foreach 循环提供额外的表格输出
【发布时间】:2017-05-18 02:09:01
【问题描述】:

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

我有以下 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 截图 2)。相反,我想要的只是一张包含这 5 个结果的表。我认为我没有使用正确的循环函数,或者我没有正确使用它。

第二次编辑:

我采用了不同的方法,使我接近了我的解决方案。我从 JOIN 查询更改为 SELECT * FROM T1。唯一的缺点是它还显示所有结果为 0 的记录。那么如何防止从 T1 中的人创建一个表,而 T2 中的查询没有结果呢?

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

【问题讨论】:

  • 你能打印第一个查询吗,看看打印了多少人id,打印861一次还是多次
  • @ImranSaleem 我采用了一种不同的方法,效果比我的第一种方法更好。我会更新我的Q

标签: php mysql loops pdo


【解决方案1】:

您可以使用 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 代码以仅使用第一个查询与左连接,因为它可以为您提供所有信息你需要我相信。

【讨论】:

  • 你的答案不是我想要的。这只会返回一个 dienaren 列表,并且只有 1 条记录。我有 2 张桌子。 T1 和 T2。关系是 T1 的 ID 字段有很多 T2 的记录,T2 中保存着 Minister_id 字段。我将编辑我的问题并添加另一个屏幕截图,希望能更好地解释我的 Q。
  • 我猜我仍然不明白你在问什么。看起来您在第二个查询中选择了所有 T2 表行。我试图摆脱 T1 中的重复项,这将为每个人提供一份清单。也许显示表格结构会更容易回答。我很高兴您解决了它,并感谢您的反馈、更新和分享您自己的解决方案。
【解决方案2】:

搞定了:

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

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2015-10-29
    • 2013-03-05
    • 2016-09-12
    • 1970-01-01
    • 2014-03-15
    • 2016-09-02
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多