У меня есть данные, возвращаемые из запроса. Это может быть соединение или просто простая таблица, выбирая все. Я хотел бы, чтобы данные были представлены в порядке убывания даты. И каждый год в отдельной таблице. Нет необходимости использовать функции даты. Просто покажите два столбца, с годами, сгруппированными в отдельные таблицы.
create table myTable123 ( id int auto_increment primary key, ayr int not null, otherStuff varchar(100) not null ); insert myTable123 (ayr,otherStuff) values (2001,'here is stuff for 2001'), (2001,'here is stuff for 2001'), (2002,'here is stuff for 2002'), (2009,'here is stuff for 2009'), (2005,'here is stuff for 2005'), (2001,'here is stuff for 2001'), (2001,'here is stuff for 2001'), (2002,'here is stuff for 2002'), (2009,'here is stuff for 2009'), (2005,'here is stuff for 2005');
По правде говоря, это повторная публикация аналогичного вопроса, над которым я только работал (пользователь Day1). Но я не хочу, чтобы это просто исчезло, если этот op. Если вы понимаете, о чем я. Я надеюсь. Я собирался опубликовать его там, но, честно говоря, не понравилось имя пользователя.
<?php // MYSQLI_REPORT_ALL remmed out to avoid //Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'No index used in query/prepared statement' // which is certainly the case with the demo query //mysqli_report(MYSQLI_REPORT_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // so go with this one error_reporting(E_ALL); // report all PHP errors ini_set("display_errors", 1); //echo "start<br/>"; try { $mysqli= new mysqli('hostname', 'dbuser', 'password', 'dbname'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } // your query can be a join. No difference. Just plug yours in and tweak everywhere as necessary $query = "select ayr,otherStuff from myTable123 order by ayr desc"; // The following variable is used to pick up a "year change" while processing the data to segment tables $curYear="^^junk^^"; // so set it to junk first, so first time in is a change $bOneYet=false; // has there been any output at all yet. I mean anything? So far, no if(!$result = $mysqli->query($query)){ die('There was an error running the query [' . $mysqli->error . ']'); } while ($row = $result->fetch_assoc()) { if ($row['ayr']!=$curYear) { // the year has changed (including the first time in this while) if (!$bOneYet) { $bOneYet=true; // will one get in here once } else { // must end previous table echo "</table><p><p>"; } // regardless, we need a new table echo "<table border=1><tr><th>The Year</th><th>The other thing</th></tr>"; } echo "<tr><td>" . $row['ayr'] . "</td><td>" . $row['otherStuff'] . "</td></tr>"; $curYear=$row['ayr']; // kind of important. Facilitates subsequent year table segments } echo "</table><p>"; // close up the last dangling table $result->free(); $mysqli->close(); } catch (mysqli_sql_exception $e) { throw $e; }
Надеемся, что комментарии исходного кода достаточны для описания того, как годы сегментируются таблицами. Сосредоточьтесь на переменной $curYear
которая подбирает это изменение по мере обработки данных, по убыванию, по годам.
Переменная $bOneYet
ложна только один раз через цикл. Рациональное состоит в том, что, когда происходит изменение года, </table>
выписывается, за исключением первого раза.
Не забывайте о важности сообщений об ошибках, как показано в верхней части кода. И направляйтесь к mysqli
или pdo
.
Отображать ошибки для тестирования и постановки, а не для производства.
Мне не понравилось, как другой ответ сгенерировал таблицы из значений базы данных, поэтому я решил написать новый ответ.
Одна вещь, которую я всегда рекомендую делать, – это поместить код для извлечения данных из базы данных в функцию, чтобы его можно было легко использовать в нескольких местах.
Еще одна вещь, которую я хотел бы порекомендовать, – использовать HTML больше как шаблон, а не эхо всей таблицы.
Остальная часть конкретной информации содержится в комментариях в коде.
<?php function getData() { $mysqli= new mysqli('localhost', 'root', '', 'test'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } $query = "select id, ayr, otherStuff from myTable123 order by ayr desc"; if(!$result = $mysqli->query($query)){ die('There was an error running the query [' . $mysqli->error . ']'); } $data = array(); while ($row = $result->fetch_assoc()) { //Use the "$row['ayr']" value here to group by year. The "$row['id']" is optional but recommended as it is always unique and handy to have in some cases. $data[$row['ayr']][$row['id']] = array( "id" => $row['id'], "ayr" => $row['ayr'], "otherstuff" => $row['otherStuff'], ); } $result->free(); $mysqli->close(); return $data; } //The data returned by getData() is already sorted so you only have to loop through it to generate the table. $data_per_year = getData(); ?> <!--This loop will run for each seperate year in the array--> <?php foreach($data_per_year as $year => $data) : ?> <table border="1"> <thead> <tr> <th>Year</th> <th>Other stuff</th> </tr> </thead> <tbody> <!--This loop will run for each seperate row of data in that specific year--> <?php foreach ($data as $id_row => $row) : ?> <tr> <td><?php echo $row['ayr']; ?></td> <td><?php echo $row['otherstuff']; ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php endforeach; ?>