PHP и MySQL - список результатов запроса под заголовком и подзаголовком

Я борюсь с концепцией, которая была частично рассмотрена здесь, но я пытаюсь расширить ее, и нахожусь в тупике. Мой запрос извлекает данные из трех таблиц (я использую хранимую процедуру):

Select a.adID, a.typeID, l.description, l.available, l.cost, a.heading, 
a.adDate, a.adActive, a.plannerID, t.typename
From advertisements as a, advert_types as t, locations as l
Where a.plannerID = 1 And a.typeID = t.typeID And l.locationID = 
a.locationID
Order by a.adDate, a.typeID;

Вывод выглядит нормально при использовании редактора запросов в рабочей среде MySQL, но я пытаюсь записать результаты, используя месяц (a.adDate) в качестве первого заголовка, а затем поле t.typename в качестве второго заголовка, поэтому он должен выглядят примерно так:

January
___________________________________________________
Bistro    Heading    Date
------------------------------
E-newsletter  $100  ...
Digital Ad    $50   ...
Magazine Ad   $150  ...


February
___________________________________________________
Kitchen   Heading    Date
-------------------------------
Social Media   $200  ...
E-flyer Ad     $180  ...


March
___________________________________________________
Restaurant  Heading   Date
-------------------------------
Front cover   $500    ...
Back cover    $350    ...

Под каждым месяцем есть подзаголовок (Бистро, Кухня, Ресторан и т. д.), Тогда должны быть элементы, перечисленные под каждым соответствующим подзаголовком, а также под правильным месяцем.

Мой код PHP:

$query = "Call listads_per_planner('$planner');";
$result = mysqli_query($conn, $query) or die("Query failed: " . 
                                             mysqli_error($conn));
$num_rows = mysqli_num_rows($result);

$priorDate = null;
$priorType = null;
$counter = 0;
while ($row = $result->fetch_assoc()) {
    $theDate = $row['adDate'];
    $thestrDate = strtotime($theDate);
    $theadYear = date('Y', $thestrDate);
    $theadMonth = date('F', $thestrDate);
    $adMonthInt = date('m', $thestrDate);
    $typeName = $row['typename'];
    $heading = $row['heading'];
    $thetypeID = $row['typeID'];

    if ($priorDate != $adMonthInt) {

        if ($priorDate != null) {
            echo "";
        }  
        if ($counter > 0){
            echo "<br /><br />\n";
        }

        echo "<h3>". $theadMonth ."</h3>\n";
        echo "<hr style=\"padding: 0; margin: 0\"/>\n";
        ($priorDate = $adMonthInt);
    }

    if ($thetypeID != $priorType){
        echo "<table border=\"0\" style=\"width: 100%; cellpadding: 2px; 
     cellspacing: 1px\" >\n";
        echo "<tr>\n";
        echo "<td style=\"background-color: #cccccc; heigh: 26px; width: 30%\">\n";
        echo "<span style=\"margin-left: 3px\"><strong>". $typeName ."</strong> 
     </span></td>\n";
        echo "<td style=\"background-color: #cccccc;\"><input type=\"text\" 
     name=\"heading\" size=\"22\" maxlength=\"100\" value=\"". $heading ."\"> 
     </td>\n";
        echo "<td style=\"background-color: #cccccc;\"><span style=\"margin-left: 
     2px\">Date: <select name=\"day\">\n";
        echo "<option value=\"1\">1</option>\n";
        echo "<option value=\"2\">2</option>\n";
        echo "<option value=\"3\">3</option>\n";
        echo "<option value=\"4\">4</option>\n";
        echo "<option value=\"5\">5</option>\n";
        //...                               
        echo "<option value=\"31\">31</option>\n";
        echo "</select>&nbsp;<select name=\"month\">\n";
        echo "<option value=\"1\">January</option>\n";
        echo "<option value=\"2\">February</option>\n";
        echo "<option value=\"3\">March</option>\n";
        echo "<option value=\"4\">April</option>\n";
        //...                       
        echo "<option value=\"12\">December</option>\n";
        echo "</select></span></td>\n";
        echo "<td style=\"background-color: #cccccc;\"><div align=\"right\"> 
     </td>\n";
        echo "<td style=\"background-color: #cccccc;\"><table border=\"0\" 
     style=\"width: 100%\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><div 
     align=\"right\"><button type=\"submit\" class=\"btn btn- 
     success\">Save</button></div></td><td></td><td><div align=\"right\"><button 
     type=\"button\" class=\"btn btn-danger\">Remove</button></td></tr></table> 
     </td>\n";
        echo "</tr>\n";
        echo "<tr>\n";
        echo "<td><strong>Location</strong> <a href=\"#\">> Add Location +</a></td> 
     <td><strong>Available</strong></td><td><strong>Cost</strong></td><td> 
     <strong>Default Cost</strong></td><td><strong>Delete?</strong></td>\n";
        echo "</tr>\n";
        $priorType = $thetypeID;
    }

    echo "<tr>\n";
    echo "<td style=\"height: 26px\">". $row['description'] ."</td>\n";
    echo "<td><input type=\"text\" name=\"avail\" size=\"2\" value=\"". 
        $row['available'] ."\"></td>\n";
    echo "<td><input type=\"text\" name=\"cost\" size=\"7\" maxlength=\"8\" 
     value=\"". $row['cost'] ."\"></td>\n";
    echo "<td>". $row['cost'] ."</td>\n";
    echo "<td><div align=\"left\" style=\"padding-left: 4px\"><a href=\"#\" 
     title=\"Delete this location?\"><img src=\"img/delete.png\" border=\"0\"> 
     </a></div></td>\n";
    echo "</tr>\n";

    $counter++;
}

echo "</table>\n";

Я вижу неожиданные результаты в выводе браузера: подзаголовки не заполняются должным образом, а результаты списка отображаются не в том месяце. Если бы кто-нибудь мог поделиться некоторыми мыслями, я был бы очень признателен. Я могу заставить его работать только с одним заголовком, но не могу понять его с подзаголовком. Большое спасибо.

Обновление: вот несколько примеров данных из БД:

PHP и MySQL - список результатов запроса под заголовком и подзаголовком

Вот скриншот результата, который я получаю: в январе должно быть указано два местоположения, а в ноябре должно быть только одно.

PHP и MySQL - список результатов запроса под заголовком и подзаголовком

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый раз, когда вы начинаете новый месяц, вам необходимо завершить таблицу для идентификатора предыдущего типа и сбросить $priorType на null. В противном случае он не запустит новую таблицу, если у вас будет один и тот же идентификатор типа в течение нескольких месяцев подряд.

При запуске идентификатора нового типа необходимо завершить таблицу для идентификатора предыдущего типа.

    $query = "Call listads_per_planner('$planner');";
    $result = mysqli_query($conn, $query) or die("Query failed: " . 
                                                 mysqli_error($conn));
    $num_rows = mysqli_num_rows($result);

    $priorDate = null;
    $priorType = null;
    $counter = 0;
    while ($row = $result->fetch_assoc()) {
        $theDate = $row['adDate'];
        $thestrDate = strtotime($theDate);
        $theadYear = date('Y', $thestrDate);
        $theadMonth = date('F', $thestrDate);
        $adMonthInt = date('m', $thestrDate);
        $typeName = $row['typename'];
        $heading = $row['heading'];
        $thetypeID = $row['typeID'];

        if ($priorDate != $adMonthInt) {
            if ($priorDate != null) {
                if ($priorType != null) {
                    echo "</table>\n";
                    $prioType = null;
                }
                echo "";
            }  
            if ($counter > 0){
                echo "<br /><br />\n";
            }

            echo "<h3>". $theadMonth ."</h3>\n";
            echo "<hr style=\"padding: 0; margin: 0\"/>\n";
            ($priorDate = $adMonthInt);
        }

        if ($thetypeID != $priorType){
            if ($priorType != null) {
                echo "</table>\n";
            }
            echo "<table border=\"0\" style=\"width: 100%; cellpadding: 2px; 
         cellspacing: 1px\" >\n";
            echo "<tr>\n";
            echo "<td style=\"background-color: #cccccc; heigh: 26px; width: 30%\">\n";
            echo "<span style=\"margin-left: 3px\"><strong>". $typeName ."</strong> 
         </span></td>\n";
            echo "<td style=\"background-color: #cccccc;\"><input type=\"text\" 
         name=\"heading\" size=\"22\" maxlength=\"100\" value=\"". $heading ."\"> 
         </td>\n";
            echo "<td style=\"background-color: #cccccc;\"><span style=\"margin-left: 
         2px\">Date: <select name=\"day\">\n";
            echo "<option value=\"1\">1</option>\n";
            echo "<option value=\"2\">2</option>\n";
            echo "<option value=\"3\">3</option>\n";
            echo "<option value=\"4\">4</option>\n";
            echo "<option value=\"5\">5</option>\n";
            //...                               
            echo "<option value=\"31\">31</option>\n";
            echo "</select>&nbsp;<select name=\"month\">\n";
            echo "<option value=\"1\">January</option>\n";
            echo "<option value=\"2\">February</option>\n";
            echo "<option value=\"3\">March</option>\n";
            echo "<option value=\"4\">April</option>\n";
            //...                       
            echo "<option value=\"12\">December</option>\n";
            echo "</select></span></td>\n";
            echo "<td style=\"background-color: #cccccc;\"><div align=\"right\"> 
         </td>\n";
            echo "<td style=\"background-color: #cccccc;\"><table border=\"0\" 
         style=\"width: 100%\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><div 
         align=\"right\"><button type=\"submit\" class=\"btn btn- 
         success\">Save</button></div></td><td></td><td><div align=\"right\"><button 
         type=\"button\" class=\"btn btn-danger\">Remove</button></td></tr></table> 
         </td>\n";
            echo "</tr>\n";
            echo "<tr>\n";
            echo "<td><strong>Location</strong> <a href=\"#\">> Add Location +</a></td> 
         <td><strong>Available</strong></td><td><strong>Cost</strong></td><td> 
         <strong>Default Cost</strong></td><td><strong>Delete?</strong></td>\n";
            echo "</tr>\n";
            $priorType = $thetypeID;
        }

        echo "<tr>\n";
        echo "<td style=\"height: 26px\">". $row['description'] ."</td>\n";
        echo "<td><input type=\"text\" name=\"avail\" size=\"2\" value=\"". 
            $row['available'] ."\"></td>\n";
        echo "<td><input type=\"text\" name=\"cost\" size=\"7\" maxlength=\"8\" 
         value=\"". $row['cost'] ."\"></td>\n";
        echo "<td>". $row['cost'] ."</td>\n";
        echo "<td><div align=\"left\" style=\"padding-left: 4px\"><a href=\"#\" 
         title=\"Delete this location?\"><img src=\"img/delete.png\" border=\"0\"> 
         </a></div></td>\n";
        echo "</tr>\n";

        $counter++;
    }

if ($priorType != null) {
    echo "</table>";
}

Спасибо, Бармар! Это прекрасно работает ... иногда я не вижу леса за деревьями.

PaulT 10.08.2018 18:22

Другие вопросы по теме