php while while循环中的while循环 - 需要连接吗?

时间:2011-06-02 16:34:38

标签: php mysql join while-loop

好的,所以我正在研究一些用户可以提交网站上发现的错误的门票的软件。我使用多个复选框,以便用户可以检查受该错误影响的所有浏览器。错误bugIdtitletype等存储在一个名为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>";
?>

3 个答案:

答案 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"