[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод на экран данных таблиц
paa66
У меня такая вот проблема. Есть главная таблица SQL, содержащая инфу о классах школы, и связанная с ней таблица с ФИО учеников по классам. Мой php-файл выдаёт всю эту инфу на экран в виде:

Иванов Ваня
Петров Петя
Сидоров Егор
и т.д.

Трофимов Сева
Куклачёв Марк
и т.д.

Мне надо:
1а ........................................................ 1б
Иванов Ваня ........................... Трофимов Сева
Петров Петя ........................... Куклачёв Марк
Сидоров Егор .......................... и т.д.
и т.д.
1в ............................... ... ..................... 2а
Панченко Сергей ..................... Медведев Дима
Путин Володя ........................... Грызлов Лёша
и т.д. .... ................... ............................. и т.д.

Как это сделать (без точек разумеется, пришлось их наставить, чтобы показать нужный мне вид)?



Спустя 16 минут, 16 секунд (30.01.2012 - 07:50) Игорь_Vasinsky написал(а):
в виде таблицы формируй вывод, это же обычный HTML

Спустя 5 минут, 46 секунд (30.01.2012 - 07:56) paa66 написал(а):
Я тоже так думал. На самом деле не всё так просто. Я сделал так, что у меня в HTML выводится инфа в 2 столбца, как мне и надо, но выводится "лесенкой": в первом столбце "1а", ниже ФИО учеников, потом с новой строки, но во 2-м столбце "1б", а под "1б" ФИО. Потом опять с новой строки в 1-м столбце и т.д.

Спустя 1 минута, 46 секунд (30.01.2012 - 07:58) Игорь_Vasinsky написал(а):
лесенкой выводиться т.к. ты не правильно HTML обёртку пишешь для вывода.

столбцы в таблицах в <tr></tr> заключаються.

Спустя 16 минут, 24 секунды (30.01.2012 - 08:14) paa66 написал(а):
Нет, дело не в этом. Давай, объясню подробнее. Сначала делаю запрос к таблице классов школы и помещаю все данные таблицы в массив. Этот массив я делю пополам, на чётные и нечётные записи. Это я делаю для того, чтобы одна часть массива выводилась в первый столбец, вторая - во второй. Затем я проверяю, чётный или нечётный элемент массива. Если чётный, то <tr><td> и с помощью foreach начинаю перебирать строки (или элементы, не знаю как правильно сказать) первой половины массива: сначала беру "1а" и отправляю запрос в подчинёную таблицу с ФИО учеников. Из подчинённой таблицы выбираю все ФИО, которые учатся в 1а и вывожу 1а и ФИО в первый столбец </td>. Потом опять проверяю чётный или нечётный элемент, со следующим элементом массива делаю то же самое и вывожу во 2-й столбец и закрываю строку </tr>. Всё это получается лесенкой.

Спустя 2 минуты, 58 секунд (30.01.2012 - 08:17) Игорь_Vasinsky написал(а):
зачем формировать новый массив?

когда при mysql_fetch_assoc($query) - уже есть массив...

при foreach - для подстановы <tr> и </tr> - использовать if($i%2==0) echo '<tr>' до вывода <td></td> и закрывающий if($i%2==0) echo '</tr>' - после.

Спустя 20 минут, 30 секунд (30.01.2012 - 08:38) paa66 написал(а):
Судя по твоему предложению, надо сделать так: foreach ($i as $klass) {здесь делаю запрос к подчинённой таблице, получаю фамилии 1а класса и помещаю их в массив. Потом проверяю: if($i%2==0) (я так понял, что это проверит чётный элемент массива или нечётныый) и вывожу в первый столбец первой строки echo '<tr><td>$i и ФИО </td> Но строку тегом </tr> не закрываю. А дальше для меня вообще не понятно, как возьмётся второй элемент первого массива (1б класс) создастся запрос к подчинённой таблице, получатся ФИО из неё в виде массива и всё это запишется во 2-й столбец.

Спустя 4 минуты, 28 секунд (30.01.2012 - 08:42) nugle написал(а):
Ты лучше свой код выложи и дамп массива

Спустя 30 минут, 10 секунд (30.01.2012 - 09:12) paa66 написал(а):
<?php
$i=0; /* здесь я объявляю переменную, которая потом будет делить массив классов школы на левый и правый столбцы */
$query = "SELECT * FROM #__a_rubric"; /* здесь делаю запрос в таблицу классов школы */
$db = &JFactory::getDBO();
$db->setQuery($query);
$list = $db->loadAssocList();
foreach($list as $rubric) {здесь я из массива $list выбираю только столбец с данными о классах школы $rubric и начинаю перебирать с 1а класса */
?>
<table align=center table-layout=auto cellspacing=0 align=center cellpadding=0 width="100%" border=0>

<?php
$query = "SELECT * FROM #__a_categories WHERE rubric_id=$rubric[rubric_id]"; /*здесь я делаю запрос в подчинённую таблицу, чтобы найти все ФИО из 1а класса*/
$db = &JFactory::getDBO();
$db->setQuery($query);
$lis = $db->loadAssocList(); /*здесь загружаю в массив выбранные ФИО*/
if ($i<1){ /* проверяю условие для вывода данных в 1-й столбец. Т.к. изначально $i=0, то выполнится печать данных в первый столбец. Если условие не выполнится, то будет выполняться код else (смотри ниже)*/
$i=$i+1; /*меняю значение переменной, чтобы вывести следующий элемент массива во 2-й столбец*/

echo "<tr><td width='100%'> <font size=3><b>$rubric[rubric]</font>"; /*здесь вывожу запись первого элемента 1-го массива, а именно 1а в первый столбец*/

foreach($lis as $categories) {/* перебираю по порядку элементы массива с ФИО*/
echo "<a href=index.php?option=com_my1&categorie_id=$categories[categorie_id]} /*вывожу ФИО в виде гиперссылки в первый столбец*/
</a><br></td>"
;
}
}

else /*т.к. значение переменной $i я изменил выше ($i=$i+1;), то условие if ($i<1) выполняться не будет, поэтому на печать отправится второй элемент первого массива, а именно 1б класс*/
{
echo "<td width='100%'> <font size=3><b>$rubric[rubric]</font><br>"; /*здесь я печатаю 1б во второй столбец*/
$i=$i-1; /*здесь опять меняю значение $i, чтобы 1В класс распечатался в первом столбце с новой строки*/
foreach($lis as $categories) {/*здесь перебираю все ФИО 1б класса*/
echo "<a href=index.php?option=com_my1&categorie_id=$categories[categorie_id]}/*здесь вывожу в виде ссылки все ФИО 1б класса по порядку*/
</a><br></b></td></tr>"
;
}
?>
</table>
<?php
}
}

?>

Спустя 13 минут, 18 секунд (30.01.2012 - 09:26) inpost написал(а):
<table><tr>
<?php
$i = 0;
$res = mysql_query("query") or die(mysql_error());
while($row = mysql_fetch_assoc($res))
{
if(++$i%2 == 0)
echo '</tr><tr>';

echo '<td>';
$res2 = mysql_query("query2") or die(mysql_error());
while($row2 = mysql_fetch_assoc($res))
{
echo $row2['name'].'<br />';
}
echo '</td>';
}
?>
</tr></table>

Спустя 17 минут (30.01.2012 - 09:43) paa66 написал(а):
Не понятно вот это место:
while($row = mysql_fetch_assoc($res))
{
if(++$i%2 == 0)
echo '</tr><tr>';
В строке echo '</tr><tr>'; мне надо вывести 1а класс. Т.к. $row - это массив, то то он содержит ИД и номер класса, а надо вывести только класс. Как это сделать?
Всё, разобрался.

Спустя 16 минут, 26 секунд (30.01.2012 - 09:59) inpost написал(а):
paa66
Что где и какой пишется внутри <td>.

Спустя 10 минут, 14 секунд (30.01.2012 - 10:09) paa66 написал(а):
Цитата
Что где и какой пишется внутри <td>.

Вопроса не понял, но попробую объяснить smile.gif
Там, где if, выполняется условие и 1а класс заносится в первый столбец, потом по ИД этого класса делается выборка из таблицы ФИО и данные этой выборки заносятся в этот же столбец. Потом берётся следующий элемент массива 1б класс. Т.к. $i после вывода в первый столбец меняется, то условие if не выполняется и идёт на else, где 1б класс заносится во 2-й столбец, потом по ИД этого класса делается выборка из таблицы ФИО и данные этой же выборки заносятся в этот же столбец, где закрывается </tr>.

Спустя 2 минуты, 59 секунд (30.01.2012 - 10:12) paa66 написал(а):
inpost, сделал, как ты сказал:
<?php 
defined('_JEXEC') or die('Restricted access');
?>
<table>
<
tr>
<?php
$i = 0;
$query = "SELECT * FROM #__a_rubric";
while($row = mysql_fetch_assoc($query))
{
if(++$i%2 == 0)
echo $row[rubric].'</tr><tr>';

echo '<td>';

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$row[rubric_id]";
while($row2 = mysql_fetch_assoc($query2))
{
echo $row2[categorie].'<br />';
}
echo '</td>';
?>
</tr></table>
<?php
}
?>

Потом попробовал запустить, но выдало ошибку в строке while($row = mysql_fetch_assoc($query)). И что означает условие if(++$i%2 == 0)?

Спустя 10 минут, 15 секунд (30.01.2012 - 10:22) inpost написал(а):
1. Оформляй код
[php]code[ /php]

Спустя 2 минуты, 23 секунды (30.01.2012 - 10:25) paa66 написал(а):
inpost, т.к. код пишу для Джумлы, то пришлось немного предыдущий код подредактировать и сделал так:
<?php 
defined('_JEXEC') or die('Restricted access');
?>
<table>
<
tr>
<?php
$i = 0;
$query = "SELECT * FROM #__a_rubric";
$db = &JFactory::getDBO();
$db->setQuery($query);
while($row = $db->loadAssocList($query))
{
if(++$i%2 == 0)
echo $row[rubric].'</tr><tr>';

echo '<td>';

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$row[rubric_id]";
$db = &JFactory::getDBO();
$db->setQuery($query2);
while($row2 = $db->loadAssocList($query2))
{
echo $row2[categorie].'<br />';
}
echo '</td>';
}
?>
</tr></table>

Теперь ошибок не выдаёт, но и на экран ничего не выводит. :( Что означает if(++$i%2 == 0) ?

Спустя 1 минута, 3 секунды (30.01.2012 - 10:26) inpost написал(а):
paa66
Ругается, потому что ты не сделал запрос в БД: функция: mysql_query, но для того, чтобы она работала - надо перед этим соединиться с БД: mysql_connect, mysql_select_db.
Условие означает, что:
++$i - каждый раз в начале мы увеличиваем число на 1.
Далее %2 - делим на 2 и получаем остаток. В школе когда разбирал деление учил, если в остатке 0, значит 2/2, 4/2. Или в остатке может быть другое число, если делишь 5/2 1/2 3/2... Вот если в остатке 0 == 0, то мы пишем </tr><tr>. Итого каждая четная запись будет разделителем.

Какой класс выводиться должен внутрь <td>CLASS</td>, <tr> тут лишь разметка таблицы.

Спустя 7 минут, 17 секунд (30.01.2012 - 10:33) paa66 написал(а):
inpost, как ты и просил, добавил соединение с базой, получилось так:
<?php 
defined('_JEXEC') or die('Restricted access');
?>
<table>
<
tr>
<?php
$i = 0;
$db = mysql_connect("localhost", "root", "");
mysql_select_db("joomla159",$db);
$query = "SELECT * FROM #__a_rubric";
$db = &JFactory::getDBO();
$db->setQuery($query);
while($row = $db->loadAssocList($query))
{
if(++$i%2 == 0)
echo $row[rubric].'</tr><tr>';

echo '<td>';

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$row[rubric_id]";
$db = &JFactory::getDBO();
$db->setQuery($query2);
while($row2 = $db->loadAssocList($query2))
{
echo $row2[categorie].'<br />';
}
echo '</td>';
}
?>
</tr></table>

/*На экран всё равно ничего не выводится*/

Спустя 13 минут, 14 секунд (30.01.2012 - 10:46) paa66 написал(а):
Цитата
Какой класс выводиться должен внутрь <td>CLASS</td>, <tr> тут лишь разметка таблицы.
Как я понял, это код после else, значит должен выводиться 1б класс, а под ним ФИО учеников.
Чтобы было понятно, я хочу, чтобы моя страничка выгладела как http://www.e1.ru/info/jarmarka/ , т.е. Средства связи (а у меня это будет 1а класс), а ниже Сотовые телефоны, Пейджеры (а у меня Иванов Ваня, Сидоров Петя). Правее Средств связи Недвижимость (а у меня 1б класс) и т.д.

Спустя 1 час, 17 минут (30.01.2012 - 12:03) paa66 написал(а):
inpost, ты писал, что
Цитата
В школе когда разбирал деление учил, если в остатке 0, значит 2/2, 4/2. Или в остатке может быть другое число, если делишь 5/2 1/2 3/2... Вот если в остатке 0 == 0, то мы пишем </tr><tr>.
Но 4 разделить на 2 будет 2, а 2 не == 0.

Спустя 19 минут, 55 секунд (30.01.2012 - 12:23) paa66 написал(а):
Сейчас я добился того, что на экран выводится последняя запись из списка классов, другие записи не выводятся почему-то. Код при этом сейчас выглядит так:

?><table>
<?php
$i = 0;
$query = "SELECT * FROM #__a_rubric"; /*здесь делается запрос в таблицу классов школы*/
$db = &JFactory::getDBO();
$db->setQuery($query);
$row = $db->loadAssocList($query);/*здесь загружается таблица классов в массив*/
foreach($row as $rubric)/* пришлось заменить while на foreach, т.к. в Джумле можно наверно только так*/
{
if(++$i%2 == 0){/*как я понял, выясняю равен ли остаток от деления нулю*/

echo '<tr>'.'<td>'.$rubric[rubric_id], $rubric[rubric].'<br />';/*печатаю в первую строку в первый столбец 1 класс*/

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$rubric[rubric_id]";
$db = &JFactory::getDBO();
$db->setQuery($query2);/*здесь делаю выборку из подчинёной таблицы ФИО учеников 1 класса*/
$row2 = $db->loadAssocList($query2);/*загружаю ФИО в массив*/
foreach($row2 as $categories)/*перебираю по порядку ФИО*/
{
echo $categories[categorie].'<br />';/*печатаю ФИО из 1 класса в том же столбце, что и 1 класс напечатал*/
}
echo '</td>';/*итак, в первый столбец я внёс 1 класс и ФИО этого класса, теперь по замыслу следующим пойдёт 2 класс и ФИО из этого класса, которые попадут во второй столбец*/
}
else {/*если остаток от деления не равен нулю, то выполняется этот код, который повторяет приведённый выше, но с нечётными элементами массива школьных классов*/
echo '<td>'.$rubric[rubric_id], $rubric[rubric].'<br />'; /*здесь выводится 2 класс во второй столбец, во всяком случае должен выводиться, но пока не выводится*/

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$rubric[rubric_id]";
$db = &JFactory::getDBO();
$db->setQuery($query2);
while($row2 = $db->loadAssocList($query2))
{
echo $row2[categorie].'<br />';/*здесь должны выводиться ФИО учеников 2 класса во второй столбец*/
}
echo '</td>'.'</tr>'; /*здесь строка таблицы закрывается и цикл повторяется уже с новой строки*/
}
}


?> </table>

Я уже вижу ошибку: <tr> стоит не в том месте. Но переставив этот тэг после тэга <table> я уверен, что толку не будет.

Спустя 25 минут, 49 секунд (30.01.2012 - 12:49) inpost написал(а):
Ты читаешь, что я говорю? Оформи php тегами КОД! Чтобы нормальный вид был, и можно было читать...

Спустя 1 минута, 53 секунды (30.01.2012 - 12:51) inpost написал(а):
4%2 - делятся целые числа, в остаток идёт 0
3%2 - в остаток идёт 0.5 , снова же целые числа делятся.

Спустя 19 минут, 11 секунд (30.01.2012 - 13:10) paa66 написал(а):
На предыдущие коды можно не смотреть, я сейчас последний вариант выложу.

Спустя 17 минут, 30 секунд (30.01.2012 - 13:28) paa66 написал(а):
<?php 
defined('_JEXEC') or die('Restricted access');
?>
<table>
<?php
$i = 0;
$query = "SELECT * FROM #__a_rubric";/*шаблон запроса к таблице классов школы*/
$db = &JFactory::getDBO();
$db->setQuery($query); /*делаю запрос*/
$row = $db->loadAssocList($query);/*загружаю данные в массив*/
foreach($row as $rubric) /*перебираю классы школы по порядку*/
{
if(++$i%2 == 0) { /*сравниваю остаток с нулём*/
$id1 = $rubric[rubric_id]; /*присваиваю переменной значение первого элемента массива классов школы, у нас это ИД 1 класса*/
echo '<td>'.$rubric[rubric].'</td>'.'<br />'; /*вывожу 1 класс в первую строку первого столбца. Условие выполнилось и цикл
возвращается на foreach, берётся второй элемент массива, это уже 2 класс. Т.к. условие в этот раз не выполняется (if(++$i%2 == 0)) , выполнение продолжается с else */

}
else {
$id2 = $rubric[rubric_id];/*здесь переменной присваивается значение второго элемента массива, у нас это 2 класс*/
echo '<td>'.$rubric[rubric].'</td>'.'</tr>'.'<br />';/*выводится в первую строку, но во 2 столбец второй класс. Строка закрывается и код выполняется дальше*/

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$id1";/*здесь берётся переменная со значением ИД первого класса в качестве критерия отбора для таблицы ФИО*/
$db = &JFactory::getDBO();
$db->setQuery($query2);
$row2 = $db->loadAssocList($query2);/*здесь загружается в массив все ФИО 1 класса*/
foreach($row2 as $categories)
{
echo '<tr>'.'<td>'.$categories[categorie].'<br />';/*здесь ФИО выводятся во вторую строку первого столбца*/
}
echo '</td>';/*здесь столбец закрываетя*/

$query2 = "SELECT * FROM #__a_categories WHERE rubric_id=$id2";/*здесь берётся переменная со значением ИД 2 класса в качестве критерия отбора из таб. ФИО*/
$db = &JFactory::getDBO();
$db->setQuery($query2);
$row2 = $db->loadAssocList($db);/*здесь загружаются все ФИО из 2 класса школы*/
foreach($row2 as $categories)
{
echo '<td>'.$categories[categorie].'<br />'; /*здесь по очереди все ФИО из 2 класса выводятся во второй столбец второй строки*/
echo '</td>'.'</tr>'; /*столбец и строка закрываются*/
}
}
}

?>
</table>

Спустя 9 минут, 3 секунды (30.01.2012 - 13:37) inpost написал(а):
У Джумлы есть другие методы работы. В любом случае ты перековеркал то, что я показал выше.

Спустя 13 минут, 21 секунда (30.01.2012 - 13:50) paa66 написал(а):
Если знаешь как можно сделать то, что я хочу, через Джумлу, подскажи.
Цитата
В любом случае ты перековеркал то, что я показал выше.
Я нашёл ошибки в предыдущем своём коде. Сейчас я подправил, стали данные из таблиц выводиться на экран. Теперь попробую вернуться к твоему коду и сообщу о результате. Боюсь, что не получится smile.gif Я тут повалялся на диванчике, покумекал и пришёл к выводу, что тот твой код надо изменить. Дело в том, что твой код во второй столбец будет выводить только ФИО такого-то класса. Но всё-таки я прислушаюсь к тебе и верну твой код, посмотрю что получится. Кстати, большое спс!!!

Спустя 22 минуты, 27 секунд (30.01.2012 - 14:13) inpost написал(а):
Так фио он и должен выводить. Помимо этого перед циклом вывода фио пишешь вывести название и всё.
Я дал полностью готовый код, достаточно лишь запросы в БД поставить правильные, соответственно и функции. Разбирайся.

Спустя 2 минуты, 58 секунд (30.01.2012 - 14:15) paa66 написал(а):
Запрос сделал по предложенному тобой методу:
[php]$cnn = mysql_connect("localhost", "root", "");
mysql_select_db("joomla159",$cnn);
$res = mysql_query("SELECT * FROM #__a_rubric");
while($row = mysql_fetch_assoc($res)){[/php
В общем, в строке while показывает ошибку. Я думаю, что этот метод в Джумле не канает. Сейчас думаю оставить это место как у меня, а дальше вернуть твой код.

Спустя 1 минута, 51 секунда (30.01.2012 - 14:17) inpost написал(а):
Да используй свой код запросов, я лишь пример показал. Вместо моего запроса подставь свой запрос, я говорю о том, чтобы ты не менял саму логику приложения, вот там, где стоит if - там его и оставляй.

Спустя 2 часа, 17 минут, 38 секунд (30.01.2012 - 16:35) neadekvat написал(а):
О, мне так никто и не ответил, зачем здесь:
$db = &JFactory::getDBO();

символ &

Спустя 4 минуты, 27 секунд (30.01.2012 - 16:39) inpost написал(а):
neadekvat
Те, кто работают в Джумле, в том числе и данный ТС, явно ничего не смыслят в классах, поэтому ответ ты не получишь smile.gif
Кто-то один, вроде Попова, показал как выводятся данные, остальные все повторяют. Менеджеры, что с них возьмешь smile.gif

Спустя 20 минут, 4 секунды (30.01.2012 - 16:59) paa66 написал(а):
Всё, получилось! Осталось оформить в цвет и разметить относительно экрана браузера. inpost, ещё раз спс тебе.
Тему можно считать закрытой.

Спустя 3 минуты, 37 секунд (30.01.2012 - 17:03) paa66 написал(а):
Цитата
О, мне так никто и не ответил, зачем здесь:
$db = &JFactory::getDBO();

символ &
По-моему, в последней версии Джумлы символ & наоборот в подобных выражениях не надо использовать. Синтаксис, я думаю, такой.

Спустя 1 минута, 15 секунд (30.01.2012 - 17:04) inpost написал(а):
paa66
В последних версиях не Джумлы, а PHP smile.gif

Спустя 1 час, 19 минут, 51 секунда (30.01.2012 - 18:24) paa66 написал(а):
Цитата
В последних версиях не Джумлы, а PHP
Всё может быть smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.