Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2015, 12:58   #1
conflictogen
Пользователь
 
Регистрация: 12.05.2015
Сообщений: 15
Вопрос Правильно записать условие

Приветствую.

Есть бд, в ней таблицы - студенты, предметы, оценки.

Оценки относятся к студентам (student_id) и предметам (subject_id)

Нужно вывести таблицу, с такими строками и столбцами: 1)имя студента; 2) предмет , тип оценки, оценка, функции (редактировать, удалить). Причем, предмет должен выводиться не каждый по порядку, что есть в базе, а тот, по которому есть оценка у данного студента.

В следующей таблице примерно описано как я представляю вывести такую задачу.

Делаю таблицу с условиями вывода:

Код HTML:
<table>
 <?php for($i = 0; $i < count(СТУДЕНТЫ); $i++) { ?>
    <tr>
                <td style="font-weight:bold;" colspan="4"><?=СТУДЕНТ[$i]["name]?></td>
        </tr>
    <tr>
        <td>Предмет</td>
        <td>Тип</td>
        <td>Оценки</td>
        <td>Функции</td>
    </tr>
       <?php for($j = 0; $j < count(ПРЕДМЕТЫ); $j ++) { ?>
 
         <?php for($o = 0; $o < count(ОЦЕНКИ); $o++) { ?>
             <?php if( (ОЦЕНКА[$o]["subject_id"] == ПРЕДМЕТ[$j]["id"] )) { ?>
            <tr>
        <td><?=ПРЕДМЕТ[$j]["title"]?></td>
            <td>
              <table>
             <tr class="type"><td>Лабораторные</td></tr>
                 <tr class="type"><td>Расчетные</td></tr>
             <tr class="type"><td>Модуль</td></tr>
               </table>
        </td>
               <td>.....
               </td>....
         </tr>
          <?php } ?>
         <?php } ?>            
       <?php } ?>
     ....</tr>
<?php } ?>
</table>
Таблица создается правильная, но проблема в том, что некоторые предметы выводятся по несколько раз (потому что в таблице с оценками есть 3 записи, которые относятся к одному subject_id, так как оценка имеет свой тип (лаба, расчетка, модуль)).

Нужно чтобы предмет у i-го студента выводился 1 раз, если по нему есть хотя бы 1 оценка с любых из 3х типов (лаба, модуль, расчетка).

Подскажите, как можно исправить такую проблему?
conflictogen вне форума Ответить с цитированием
Старый 18.05.2015, 19:57   #2
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Код:
<?php for($o = 0; $o < count(ОЦЕНКИ); $o++) { ?>
             <?php if( (ОЦЕНКА[$o]["subject_id"] == ПРЕДМЕТ[$j]["id"] )) { ?>
            <tr>
        <td><?=ПРЕДМЕТ[$j]["title"]?></td>
Здесь нужно выйти из цикла.
Как то так получится:
Код:
if( (ОЦЕНКА[$o]["subject_id"] == ПРЕДМЕТ[$j]["id"] )){
    echo ПРЕДМЕТ[$j]["title"];
    break;
}

Последний раз редактировалось Lucky beggar; 18.05.2015 в 20:15.
Lucky beggar вне форума Ответить с цитированием
Старый 18.05.2015, 21:25   #3
conflictogen
Пользователь
 
Регистрация: 12.05.2015
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Lucky beggar Посмотреть сообщение
Здесь нужно выйти из цикла.
Как то так получится:
Код:
if( (ОЦЕНКА[$o]["subject_id"] == ПРЕДМЕТ[$j]["id"] )){
    echo ПРЕДМЕТ[$j]["title"];
    break;
}
Спасибо. Уже понял, всё работает))
conflictogen вне форума Ответить с цитированием
Старый 21.05.2015, 14:24   #4
conflictogen
Пользователь
 
Регистрация: 12.05.2015
Сообщений: 15
По умолчанию

Есть еще одна проблема с этой таблицей. Подскажите, как решить подобную ошибку в циклах ? :

Если у данного студента по данному предмету , есть любая оценка (лабораторная, расчетка или модуль), то выводится строка с этим предметом , и строки (<tr>) в которых столбцы с типами оценок (лабораторные, расчётки, модули) и рядом строки - в них столбцы (<td>) c оценками этого типа. Нужно чтобы оценка с типом лабы выводилась из БД, если она есть и принадлежит этому студенту и этому предмету, а иначе если оценок нет, то вывести : "<td>Оценок нет</td>".

Таблица с оценками имеет такую структуру:

- id,
- subject_id (принадлежность к предмету),
- student_id (принадлежность к студенту),
- type (тип оценки, может иметь значение 'лабораторные', 'расчетки' или 'модули'),
- values (строка с оценками).

Как я пробовал ? Написал функцию, которая ищет в БД все оценки где `type` = 'лабораторные' , и дальше циклом прохожусь по всем записям и пишу условие: если оценка относится к этому студенту и данному предмету то вывожу значение оценок: "<td><?=$this->labs[$i]['values']?></td>" , а иначе вывожу "<td>Оценок нет</td>".

Проблема в том, что если допустим в таблице с оценками, есть N записей с типом "лабораторные" и они не принадлежат данному студенту или данному предмету то "Оценок нет" и выводиться N раз. Если использовать break; или contnue; то выведеться 1 раз, но оценки не будут найдены, которые могут быть в [$i+1] или в [$i+2]-й (и т.д.) итерации.

Ниже привожу код что есть, и скрин таблицы с ошибкой.

Код:
<?php for($q = 0; $q < count($this->marks_labs); $q++) { ?>
	<?php if(($this->students[$i]["id"] == $this->marks_labs[$q]["student_id"]) && ($this->marks_labs[$q]["subject_id"] == $this->subjects[$k]["id"]) && ($this->marks_labs[$q]["values"] != "")) { ?>
		<td><?=$this->marks_labs[$q]["values"]?></td>
	<?php } else { ?>
		<td>Оценок нет</td>
	<?php } ?>
<?php } ?>
Как можно исправить такое?
Изображения
Тип файла: png Image 1.png (16.8 Кб, 51 просмотров)
conflictogen вне форума Ответить с цитированием
Старый 21.05.2015, 19:54   #5
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Я правильно понимаю, если студент имеет 3 оценки, он занимает 3 строки в таблице? Если я Вас правильно понял, предлагаю изменить структуру. Для каждого типа оценки завести отдельный столбец (для студентов без оценки можно поставить, к примеру, 0). Это поможет структурировать немного инфу с таблиц , что , думаю, поможет решить Вашу проблему.

PS.
Код:
<td>Оценок нет</td>
находится в цикле => пока цикл не закончится, запись "Оценок нет" будет добавляться N раз
Lucky beggar вне форума Ответить с цитированием
Старый 21.05.2015, 20:46   #6
conflictogen
Пользователь
 
Регистрация: 12.05.2015
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Lucky beggar Посмотреть сообщение
Я правильно понимаю, если студент имеет 3 оценки, он занимает 3 строки в таблице?
Не совсем, структура таблицы видна в прикрепреленном скрине выше. Таблица такая: студент - первая строка в таблице, предмет по которому есть оценка - вторая строка , и в ней есть 3 строки (в любом случае) с типами оценок , и там столбцы td с значениями оценок каждого типа...а если , например нет оценки с типом "модули" то должно выводиться "Оценок нет".

Для наглядности, код таблицы со всеми циклами и комментариями ниже:

Код:
<table class="info marks">
	<?php for ($i = 0; $i < count($this->students); $i++) { ?> // цикл проходит по таблице со студентами
		<?php for ($j = 0; $j < count($this->marks); $j++) { ?> // цикл проходит по таблице с оценками
			<?php if($this->students[$i]["id"] == $this->marks[$j]["student_id"]) { ?>  // условие проверяет принадлежность записи с оценкой данному студенту, и если оценка принадлежит ему вывести следующее:
				<tr>
					<td style="font-weight:bold;" colspan="4"><?=$this->students[$i]["name"];?></td>
				</tr>
				<tr>
					<td>Предмет</td>
					<td>Тип</td>
					<td>Оценки</td>
					<td>Функции</td>
				</tr>
				<?php for($k = 0; $k < count($this->subjects); $k++) { ?> // цикл проходит по записям с предметами
					<?php for($l = 0; $l < count($this->marks); $l++) { ?> // цикл проходит по записям с оценками (предыдущий останавливается break`ом)
						<?php if(($this->subjects[$k]["id"] == $this->marks[$l]["subject_id"]) && ($this->students[$i]["id"] == $this->marks[$l]["student_id"])) { ?> // условие проверяет принадлежность оценки к предмету и данному студенту , и выводит после следующее:
							<tr>
								<td><?=$this->subjects[$k]["title"]?></td> // Выводиться название предмета
								<td>
									<table>
										<tr class="type"><td>Лабораторные</td></tr>
										<tr class="type"><td>Расчетные</td></tr>
										<tr class="type"><td>Модуль</td></tr>
									</table>
								</td>
								<td>
									<table>
										<tr>
											<td class="color">
												<table>
													<tr>  
<?php for($q = 0; $q < count($this->marks_labs); $q++) { ?>
	<?php if(($this->students[$i]["id"] == $this->marks_labs[$q]["student_id"]) && ($this->marks_labs[$q]["subject_id"] == $this->subjects[$k]["id"]) && ($this->marks_labs[$q]["values"] != "")) { ?> // создается цикл который проходит по записям с оценками с ТИПОМ ЛАБЫ, и проверка if`ом принадлежности оценки за лабы этому студенту и этому предмету
		<td><?=$this->marks_labs[$q]["values"]?></td> // тут выводяться оценки, если есть 
			
	<?php } else { ?>
				// Если оценки с типом ЛАБЫ у этого студента по этому предмету нет, то здесь должно быть условие, при котором выведется  1 раз (не в цикле) "<td>Оценок нет</td>".
	<?php } ?>
<?php } ?>
											
													</tr>
												</table>
.........
.........
</table>
								</td>
							</tr>
						<?php break; } ?>
					<?php } ?>
				<?php } ?>
			<?php break; } ?>
		<?php } ?>
	<?php } ?>
</table>
conflictogen вне форума Ответить с цитированием
Старый 21.05.2015, 21:17   #7
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Кажется , я плохо изъяснился. Если студент имеет все 3 типа оценок , то ему в таблице в базе данных выделяется 3 строки ? Если да , то следуйте советам выше. Это позволит сократить код и избавиться от лишних циклов.

Создайте таблицу в бд со следующей структурой:
- id,
- subject_id (принадлежность к предмету),
- student_id (принадлежность к студенту),
- 'лабораторные',
- 'расчетки',
- 'модули',
- values (строка с оценками).
Lucky beggar вне форума Ответить с цитированием
Старый 21.05.2015, 22:12   #8
conflictogen
Пользователь
 
Регистрация: 12.05.2015
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Lucky beggar Посмотреть сообщение
Кажется , я плохо изъяснился. Если студент имеет все 3 типа оценок , то ему в таблице в базе данных выделяется 3 строки ? Если да , то следуйте советам выше. Это позволит сократить код и избавиться от лишних циклов.
Я вас понял. Спасибо за идею, действительно, так может быть намного проще. Но сразу есть вопрос, как вы представляете такую структуру таблицы оценок ?

Цитата:
Сообщение от Lucky beggar Посмотреть сообщение
- id,
- subject_id (принадлежность к предмету),
- student_id (принадлежность к студенту),
- 'лабораторные',
- 'расчетки',
- 'модули',
- values (строка с оценками)
А точнее, поле values ?
Допустим, нужно вытащить оценку за вторую лабораторную? Или за 3-тью по модулям, но там нет оценки. Как в таком случае выглядит поле 'values' ?
conflictogen вне форума Ответить с цитированием
Старый 22.05.2015, 20:07   #9
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Сори, не углядел когда копировал. Поле values надо убрать насовсем. А структуру оценок можно расширить (создать столбцы модуль1,...,модуль4 ; лаба1,...,лаба5 ; расчетка1,...,расчетка4). Думаю , такая структура подойдет
Lucky beggar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно записать условие С++ Валера1984 Помощь студентам 1 25.02.2014 16:33
Как правильно записать условие выборки данных из структуры (нападающих из основного состава команды) ( на C ) Валера1984 Помощь студентам 7 15.02.2014 13:34
Записать условие в виде одного оператора (Help) kalugin19 Паскаль, Turbo Pascal, PascalABC.NET 14 22.11.2013 23:34
Как правильно записать условие VP86 Общие вопросы C/C++ 7 17.09.2013 14:34