php while цикл внутри цикла while - нужно присоединиться? - PullRequest
1 голос
/ 02 июня 2011

Хорошо, я работаю над некоторым программным обеспечением, где пользователи могут отправлять заявки на ошибки, найденные на веб-сайте. Я использую несколько флажков, чтобы пользователи могли проверять все браузеры, на которые повлияла ошибка. Ошибка bugId, title, type и т. Д. Хранится в одной таблице с именем bugs, а уязвимые браузеры - в другой таблице с именем affectedbrowsers. Общность между двумя таблицами - bugId. У меня есть форма, отправляющая все правильно.

Моя проблема с возвратом данных. У меня есть HTML-таблица, которая имеет одну строку для каждой ошибки в таблице базы данных bugs. Есть один столбец под названием «Затронутые браузеры», который я хотел бы заполнить данными из таблицы affectedbrowsers. Я попытался использовать цикл while для обхода ошибок и вывода строк в html-таблице и использовать второй цикл while в этом первом цикле while, который будет запрашивать таблицу affectedbrowsers и находить все записи с одинаковыми значениями * 1012. *. Это не возвращает никаких данных во втором цикле 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 ]

3 голосов
/ 02 июня 2011

Вы хотите получить браузеры для текущей ошибки, поэтому вы должны иметь

$bugID = $rowBug['bugId'];

вместо

$bugID = $_POST['bugId'];
1 голос
/ 02 июня 2011

В дополнение к предложению @AlexAtNet я бы добавил группирование , чтобы каждая ошибка возвращалась только один раз (даже если затронуто несколько браузеров)

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"
1 голос
/ 02 июня 2011

Не выполнять запрос внутри цикла - вместо этого используйте соединения.

 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 непосредственно в запрос.

...