好的,所以我正在研究一些用户可以提交网站上发现的错误的门票的软件。我使用多个复选框,以便用户可以检查受该错误影响的所有浏览器。错误bugId
,title
,type
等存储在一个名为bugs
的表中,受影响的浏览器存储在另一个名为affectedbrowsers
的表中。两个表之间的共性是bugId
。我有正确提交所有内容的表单。
我的问题是返回数据。我有一个html表,对于bugs
数据库表中的每个错误都有一行。有一列名为“受影响的浏览器”,我想填充affectedbrowsers
表中的数据。我尝试使用while循环遍历错误并回显出html表中的行,并在第一个while循环中使用第二个while循环,该循环将查询affectedbrowsers
表并查找具有相同内容的所有记录bugId
。这不会在第二个while循环中返回任何数据。我想尽可能使用JOINS
,但我并不熟悉它们。你有什么想法?
我的代码:
<?php
echo "<table>";
$resultBug = mysql_query("SELECT * FROM bugs WHERE projectId = '$projectId' ORDER BY bugId ASC");
echo "<tr> <th>Case Title</th> <th>Affected Browsers</th> </tr>";
while($rowBug = mysql_fetch_array( $resultBug )){
$bugId = $_POST['bugId'];
echo "<tr><td>";
$rowBugTitle = htmlspecialchars($rowBug['title']);
echo $rowBugTitle;
echo "</td><td>";
$resultAffectedBrowsers = mysql_query("SELECT * FROM affectedbrowsers WHERE bugId = '$bugId' ORDER BY id ASC");
while($rowAffectedBrowsers = mysql_fetch_array( $resultAffectedBrowsers )){
$affectedBrowsers = $rowAffectedBrowsers['label'];
echo $affectedBrowsers . " - ";
}
echo "</td></tr>";
}
echo "</table></div>";
?>
答案 0 :(得分:3)
您希望获取当前错误的浏览器,因此您应该
$bugID = $rowBug['bugId'];
而不是
$bugID = $_POST['bugId'];
答案 1 :(得分:1)
不要在循环内执行查询 - 改为使用连接。
SELECT b.bugId, b.title, ab.label FROM bugs b
INNER JOIN affectedbrowsers ab
ON ab.bugId = b.bugId
WHERE b.projectId = '$projectId' ORDER BY b.bugId, ab.id ASC
也不要混用HTML和PHP - 至少将查询移到单独的函数并渲染到另一个函数。
并清理输入 - 不要将_POST变量直接放入查询中。
答案 2 :(得分:1)
在@AlexAtNet建议的基础上,我会添加grouping,以便每个错误只返回一次(即使多个浏览器受到影响)
SELECT b.bugId, b.title,
GROUP_CONCAT(ab.label ORDER BY ab.label ASC SEPARATOR ' - ') AS browsers
FROM bugs b
INNER JOIN affectedbrowsers ab ON ab.bugId = b.bugId
WHERE b.projectId = '$projectId'
GROUP BY b.bugId
ORDER BY b.bugId ASC
结果看起来像
bugId | title | browsers
------+-------------+-----------------------
1 | "Bug-one" | "Chrome - IE"
2 | "Bug-2" | "Firefox"
3 | "Bug-three" | "Chrome - Safari - IE"