Div в соответствии с MySQL приводит к циклу

0

Во-первых, извините, если заголовок запутан! Я работаю над блоком, который определяет, как должны отображаться списки последних сообщений (иногда определяемых датой) в категории. В базе данных каждая категория имеет набор "тип", который определяет, является ли div, в котором он находится, является небольшим или большим.

Я могу получить результаты для отображения, но каждая ссылка в списке имеет свой собственный div, а не содержится в одной "основной" категории div.

Более короткое объяснение: База данных извлекает результаты из таблицы категорий и таблицы сообщений, как вы можете видеть в запросе. Затем цикл запускается так, что окна категорий и ссылки в них могут создаваться динамически. Проблема в том, что divs, которые должны размещать список ссылок, вместо этого обертывают каждую отдельную ссылку, а не желаемый набор.

Хотя нижеприведенный код показывает только два "типа", я планировал добавить в будущем больше.

Вот код

                <?
            require("classes/Database.class.php"); 

            $db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE); 
            $time = $_REQUEST['time'];

            $db->connect(); 

            $sql = "SELECT 
                cm.id,
                cm.title AS cmtitle,
                cm.sectionid,
                cm.type AS cmtype,
                cd.id,
                cd.time,
                cd.link,
                cd.title,
                cd.description,
                cd.sectionid AS sectionid
                FROM c_main AS cm
                JOIN c_data AS cd ON cd.sectionid=cm.sectionid
                WHERE cd.sectionid=cm.sectionid AND time = '".$time."' ORDER by id ASC";

            $rows = $db->query($sql); 


            while($record = $db->fetch_array($rows)){

                          //determine what div to use by checking "type"
            if ($record['cmtype'] == 'large') {
            ?>
            <div class="large" >
            <?
            } elseif ($record['cmtype'] == 'small') { 
            ?>
            <div class="small">
            <?

            } 

            for($x =0; $x <= $db->affected_rows; ++$x)
            {
            if ($record['cmtype'] == 'small') {
            echo $record['title'].'<br/>';
            } else {
            echo $record['title'].'<br/>'.$record['description'];

            }
            break;
            }
            echo '</div>';

            }
            $db->close(); 
            ?>  

В основном я пытаюсь сделать это вот так:

    /-------------------\
   |    Category Title  |
   |  -relevant link    |
   |  -relevant link    |
   \____________________/ 
    /-------------------\
   |    Category Title  |
   |  -relevant link    |
   |  -relevant link    |
   \____________________/ 
 .... and so on for each subsequent category

И не это (как это выводится)

/-------------\
\relevant link/
 -------------
/-------------\
\relevant link/
 -------------
 etc.

Вот оболочка mysql, которую я сейчас использую, если она имеет значение http://ricocheting.com/scripts/php_mysql_wrapper.php

Теги:

5 ответов

0
Лучший ответ

ваш код будет эхом div для каждой строки, это ваша проблема/вопрос.

Мое предложение состоит в том, чтобы создать два запроса: выбрать все ссылки типа A и второй запрос, выбрав все ссылки типа B (WHERE type = '…')

тогда вам придется распечатать начальный тег вашего первого div:

echo '<div class="large">';

после этого зациклируйте свой результат и выведите ссылки:

while(($record = $db->fetch_assoc($rows)) !== FALSE){
  echo htmlspecialchars($record['title']),'<br/>';
}

закройте свой div:

echo '</div>';

теперь вы можете начать свою вторую категорию, ту же игру, те же правила:

  • открыть div
  • результаты цикла
  • закрыть div

~~~

другой способ, как и другие, чтобы упорядочить ваш результат по типу, затем по id (ORDER BY type, id), а затем проверить изменение типа строк:

$currenttype = '';
while(($record = $db->fetch_assoc($rows)) !== FALSE) {
  $currenttype = $record['cmtype'];
  echo '<div class="',htmlspecialchars($record['cmtype']),'">';

  while($record['cmtype'] == $currenttype
  && ($record = $db->fetch_assoc($rows)) !== FALSE) {
    // output link according to your type:
    echo htmlspecialchars($record['title']);
  }

  echo '</div>';
}

Я предполагаю, что это то, чего вы хотели добиться в первую очередь

  • 0
    С первым предложением, что если я добавлю больше типов div? В идеале это то, что я буду делать. Со вторым, div все еще выглядят довольно странно. Похоже, что они все объединены в одном div.
  • 0
    с первым предложением вам нужно будет создать новый запрос для каждого типа div. для последнего… я забыл закрыть div, соответственно редактируя мой ответ
Показать ещё 3 комментария
2

Если вам нужно только 2 divs, один большой и один маленький, вы должны сделать ORDER BY cmtype, а затем вам нужно будет только создать div, когда тип изменится или это первый тип.

  • 0
    Я намерен добавить больше типов div, так что это все еще будет решением?
  • 0
    Конечно, нет проблем вообще
0

Возможно, я ошибаюсь в понимании вашего вопроса, но вы пытаетесь добавить все релевантную ссылку в один DIV, а затем проверьте свой php-результат html (browser- > view source)

0

Может быть, я полностью ошибаюсь, но если вы хотите отобразить элементы, сгруппированные по их типу, я думаю, вам следует заказать их по типу сразу, чтобы порядок элементов был правильным, когда вы начинаете выводить HTML-код?

  • 0
    Я немного новичок в php, так что я надеюсь, что вы не возражаете, чтобы я попросил немного разъяснений.
  • 0
    В основном я имел в виду то же самое, что Clash. Если вы хотите иметь один div для каждой категории, вы должны отсортировать результат по SQL. Затем просматривайте результаты, создавая новый div только при изменении cmtype. Это будет хорошо работать, даже если вы добавите новые категории.
0

Если вы уверены в своем содержимом таблицы, вы можете использовать:

echo "<div class='" . $record['cmtype'] . "'>";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню