PHP while 语句重复
PHP while statement echoes duplicates
我是 PHP 的新手,我花了几个小时研究并试图找出我做错了什么。我加入了几个 table 以使用交易 table 中的多个交易填充客户资料页面。页面的其余部分按预期处理查询,但是当使用 while 语句时,结果中的每个事务重复等于结果中的事务总数。例如,如果结果有 3 个交易编号 (1、2、3),则 while 语句将回显“1、1、1、2、2、2、3、3、3”,而不仅仅是“1、2、 3".
我知道这很简单,但它让我抓狂。请帮助:
if(!isset($_GET['PeopleID'])){
header('Location: people.php');
die();
} else {
if(!filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT)){
header('Location: people.php');
die();
} else {
$PeopleID = filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT);
$query = "SELECT *
FROM
people
LEFT JOIN notes ON
PersonID = PeopleID
LEFT JOIN filenumbers ON
id = PeopleID
LEFT JOIN transactions ON
transactions.FileNumberID = filenumbers.FileNumberID
LEFT JOIN filingdetails ON
filingdetails.FileID = filenumbers.FileNumberID
WHERE PeopleID=:PeopleID";
$result = $db_connection->prepare($query);
$result->execute([
'PeopleID' => $PeopleID
]);
}
}
while($row = $result -> fetch()){
echo $row['TransactionNumber'] . ", ";
}
好的...因此,这是您的 SQL
查询的预期行为。
当您 LEFT JOIN
以您所拥有的方式结束时,您最终会多次获取所有数据。最好用一个例子来解释...
例子
假设您有三个 table:
table1
=> 你的主要 table
table2
=> many-to-one 与 table1
的关系
table3
=> many-to-one 与 table1
的关系
table1
id, value
1, a
2, b
3, c
table2
id, fkey, value
1, a, xxxx
2, a, cxcz
3, a, bdtht
4, a, nbtyt
5, b, ngftht
6, b, thhgfj
7, b, gjfhj
8, c, hjghj
9, c, jhgjh
table3
id, fkey, value
10, 2, sdgvgd
11, 2, gjkmhkjk
12, 3, kjhkl
13, 3, kljj
接下来我们想要 SELECT
来自 table1
的数据,同时合并来自 table2
的数据,使用 LEFT JOIN
SELECT
table1.id, table1.value, table2.id, table2.value
FROM table1
LEFT JOIN table2 ON
table2.fkey = table1.id
上面 SQL
的输出看起来像下面这样...
table1.id, table1.value, table2.id, table2.value
1, a, 1, xxxx
1, a, 2, cxcz
1, a, 3, bdtht
1, a, 4, nbtyt
2, b, 5, ngftht
2, b, 6, thhgfj
2, b, 7, gjfhj
3, c, 8, hjghj
3, c, 9, jhgjh
请注意,上面的输出实际上是 table1
中的每个选定行乘以 table2
中相应行的数量;或者...
every row in table1 * table2 rows with fkey=table1.id
所以,这很简单。如果我们现在看一个包含三个 table 和两个 LEFT JOINs
的示例会怎样
SELECT
table1.id, table1.value, table2.id, table2.value
FROM table1
LEFT JOIN table2 ON
table2.fkey = table1.id
LEFT JOIN table3 ON
table3.fkey = table1.id
table1.id, table1.value, table2.id, table2.value, table3.id, table3.value
1, a, 1, xxxx, null, null
1, a, 2, cxcz, null, null
1, a, 3, bdtht, null, null
1, a, 4, nbtyt, null, null
2, b, 5, ngftht, 10, 2, sdgvgd
2, b, 5, ngftht, 11, 2, gjkmhkjk
2, b, 6, thhgfj, 10, 2, sdgvgd
2, b, 6, thhgfj, 11, 2, gjkmhkjk
2, b, 7, gjfhj, 10, 2, sdgvgd
2, b, 7, gjfhj, 11, 2, gjkmhkjk
3, c, 8, hjghj, 12, 3, kjhkl
3, c, 8, hjghj, 13, 3, kljj,
3, c, 9, jhgjh, 12, 3, kjhkl
3, c, 9, jhgjh, 13, 3, kljj
在这里你可以看到我们现在的输出相当于:
every row in table1 * table2 rows with fkey=table1.id * table3 rows with fkey=table1.id
我是 PHP 的新手,我花了几个小时研究并试图找出我做错了什么。我加入了几个 table 以使用交易 table 中的多个交易填充客户资料页面。页面的其余部分按预期处理查询,但是当使用 while 语句时,结果中的每个事务重复等于结果中的事务总数。例如,如果结果有 3 个交易编号 (1、2、3),则 while 语句将回显“1、1、1、2、2、2、3、3、3”,而不仅仅是“1、2、 3".
我知道这很简单,但它让我抓狂。请帮助:
if(!isset($_GET['PeopleID'])){
header('Location: people.php');
die();
} else {
if(!filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT)){
header('Location: people.php');
die();
} else {
$PeopleID = filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT);
$query = "SELECT *
FROM
people
LEFT JOIN notes ON
PersonID = PeopleID
LEFT JOIN filenumbers ON
id = PeopleID
LEFT JOIN transactions ON
transactions.FileNumberID = filenumbers.FileNumberID
LEFT JOIN filingdetails ON
filingdetails.FileID = filenumbers.FileNumberID
WHERE PeopleID=:PeopleID";
$result = $db_connection->prepare($query);
$result->execute([
'PeopleID' => $PeopleID
]);
}
}
while($row = $result -> fetch()){
echo $row['TransactionNumber'] . ", ";
}
好的...因此,这是您的 SQL
查询的预期行为。
当您 LEFT JOIN
以您所拥有的方式结束时,您最终会多次获取所有数据。最好用一个例子来解释...
例子
假设您有三个 table:
table1
=> 你的主要 table
table2
=> many-to-one 与 table1
table3
=> many-to-one 与 table1
table1
id, value
1, a
2, b
3, c
table2
id, fkey, value
1, a, xxxx
2, a, cxcz
3, a, bdtht
4, a, nbtyt
5, b, ngftht
6, b, thhgfj
7, b, gjfhj
8, c, hjghj
9, c, jhgjh
table3
id, fkey, value
10, 2, sdgvgd
11, 2, gjkmhkjk
12, 3, kjhkl
13, 3, kljj
接下来我们想要 SELECT
来自 table1
的数据,同时合并来自 table2
的数据,使用 LEFT JOIN
SELECT
table1.id, table1.value, table2.id, table2.value
FROM table1
LEFT JOIN table2 ON
table2.fkey = table1.id
上面 SQL
的输出看起来像下面这样...
table1.id, table1.value, table2.id, table2.value
1, a, 1, xxxx
1, a, 2, cxcz
1, a, 3, bdtht
1, a, 4, nbtyt
2, b, 5, ngftht
2, b, 6, thhgfj
2, b, 7, gjfhj
3, c, 8, hjghj
3, c, 9, jhgjh
请注意,上面的输出实际上是 table1
中的每个选定行乘以 table2
中相应行的数量;或者...
every row in table1 * table2 rows with fkey=table1.id
所以,这很简单。如果我们现在看一个包含三个 table 和两个 LEFT JOINs
SELECT
table1.id, table1.value, table2.id, table2.value
FROM table1
LEFT JOIN table2 ON
table2.fkey = table1.id
LEFT JOIN table3 ON
table3.fkey = table1.id
table1.id, table1.value, table2.id, table2.value, table3.id, table3.value
1, a, 1, xxxx, null, null
1, a, 2, cxcz, null, null
1, a, 3, bdtht, null, null
1, a, 4, nbtyt, null, null
2, b, 5, ngftht, 10, 2, sdgvgd
2, b, 5, ngftht, 11, 2, gjkmhkjk
2, b, 6, thhgfj, 10, 2, sdgvgd
2, b, 6, thhgfj, 11, 2, gjkmhkjk
2, b, 7, gjfhj, 10, 2, sdgvgd
2, b, 7, gjfhj, 11, 2, gjkmhkjk
3, c, 8, hjghj, 12, 3, kjhkl
3, c, 8, hjghj, 13, 3, kljj,
3, c, 9, jhgjh, 12, 3, kjhkl
3, c, 9, jhgjh, 13, 3, kljj
在这里你可以看到我们现在的输出相当于:
every row in table1 * table2 rows with fkey=table1.id * table3 rows with fkey=table1.id