В то время как циклы внутри циклов и вывод php? - PullRequest
1 голос
/ 20 ноября 2011

У меня есть цикл while для отображения ответов на сообщение на моем веб-сайте.

Значение для parentID, используемого в запросе, равно $ post ['postID'], которое представляет собой массив деталей для просматриваемой записи.

Как видно ниже, он выводит следующее (каждая тема представляет собой ссылку для просмотра полного сообщения)

$q = $dbc -> prepare("SELECT * FROM boardposts WHERE parentID = ?");
$q -> execute(array($post['postID']));
while ($postReply = $q -> fetch(PDO::FETCH_ASSOC)) {
     echo '<p><a href="http://www.example.com/boards?topic=' . $_GET['topic'] . '&amp;view=' . $postReply['postID'] . '">' . $postReply['subject'] . '</a>';
}

Это в настоящее время выводит что-то вроде,

Ответы на это сообщение:

предмет 1
предмет 2
предмет 3
предмет 4

Есть ли способ, которым я могу также включить в список ответы на ответы, что-то вроде

Ответы на это сообщение:

предмет 1
тема 1 ответ
тема 1 ответ
тема 1 ответный ответ
предмет 2
предмет 3
Тема 3 ответа
Тема 3 ответа
Тема 3 Ответить Ответить
предмет 4
Тема 4 ответа
предмет 5
предмет 6
тема 6 ответ
Тема 4 Ответить Ответить

Я понимаю, что все отступы могут быть с css, но я застрял в том, как извлечь данные из базы данных mysql и в правильном порядке, я пробовал циклы while внутри циклов while, но это включало запросы внутри циклов while, плохо!

Спасибо за ваш вклад!

1 Ответ

2 голосов
/ 20 ноября 2011

Я подозреваю, что вам нужно сделать редизайн базы данных, чтобы сохранить отношение потока / субъекта в поле, чтобы вы могли извлечь все потоки в одном запросе и затем программно отсортировать их в php. Если у вас есть поле parent_id, и каждая строка ответа знает, кто является его родителем и каков его порядок (предположительно, это просто id> предыдущий id), то довольно просто организовать их так, как вам нужно.

Затем вы можете просмотреть список ответов и выбросить все элементы в объект JSON (y), в котором все ваши вложенные ответы находятся в правильном порядке / отношении.

Чтобы уменьшить нежелательное раздувание, вы можете также сохранить родительский идентификатор верхнего уровня, чтобы вы могли легко извлекать только те потоки, которые принадлежат конкретным потокам верхнего уровня. Таким образом, вы можете легко захватывать только те потоки, которые принадлежат, например, последним 20 потокам верхнего уровня (чтобы уменьшить ненужные вычисления в древних потоках, которые никому не нужны, и построить своего рода разбиение на страницы).

РЕДАКТИРОВАТЬ ... некоторый псевдокод ...

select * from row order by top_level_id desc limit 0,20 // это даст вам максимум 20 потоков верхнего уровня, так что вы не тянете весь дб. 0 в конце должен быть переменной страницы, которую вы передаете из своего PHP, так что вы можете сделать 20,20 для страницы 2 и 40,20 для страницы 3

теперь вы делаете что-то вроде этого (очевидно, это псевдокод, но вы должны быть в состоянии сделать это на основе этой модели ...

$sortedRows; //this will be a JSON object, or hash array

for($row in result){
   addToThreadObj($row);
}

function addToThreadObj($row){
    if( containsParent($row.parent_id))
         addChildToParent($row.parent_id, $row);
    else
         createNewParent($row);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...