PHP PDO foreach循环提供额外的表输出
希望有人能解决这个问题 我有以下MySQL查询: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,
$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 <?= dateDifference($user->periode_tot,$currentdate); ?> 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 <?= dateDifference($user->periode_tot,$currentdate); ?> 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