Привет!) Имеется такой код: if($_GET['value'] == student) { $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link)); $query = 'SELECT ID_student, FIO_student, group_name FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group)'; $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link)); $queryGroup = 'SELECT * FROM study_group'; $resultGroup = mysqli_query($link, $queryGroup) or die("Ошибка " . mysqli_error($link)); $dataGroup = mysqli_fetch_assoc($resultGroup); echo '<form method = "POST" action = "edit.php"> <h2>Студенты</h2> <table class = "table table-hover table-striped"> <thead class = "thead-inverse thead-dark"> <tr> <th>Номер студента</th> <th>ФИО студента</th> <th>Название группы</th> </tr> </thead> <tbody>'; while($data = mysqli_fetch_assoc($result)) { echo '<tr> <th scope="row">'.$data['ID_student'].'</th> <th scope="row"> <input type="text" size="30" name="FIO_student" value="'.$data['FIO_student'].'"> </th> <th scope="row"> <select name="ID_group" class="form-control"> <option selected value="'.$data['ID_group'].'">'.$data['group_name'].'</option> <option value="'.$dataGroup['ID_group'].'">'.$dataGroup['group_name'].'</option> </select> </th> </tr>'; } echo '</tbody> </table>'; echo $htmlEnd; } Выводится таблица студентов. В первой колонке порядковый номер, вторая колонка это ФИО студента, а в третьей группа студента. По умолчанию указана текущая группа студента, а внутри списка должны выводиться все остальные существующие группы (их несколько). В чем проблема? Почему выводится лишь одна группа?
потому, что ты забираешь и выводишь из БД всего одну группу студентов ты забираешь и выводишь в цикле, тоже самое должно быть и с группами т.е. <option value="'.$dataGroup['ID_group'].'">'.$dataGroup['group_name'].'</option> должен быть завёрнут в цикл + проверка на совпадение текущей группы студента PHP: while($rowGroup = mysqli_fetch_assoc($dataGroup)) { if ($rowGroup ['ID_group'] != $data['ID_group']) { echo '<option value="'.$rowGroup ['ID_group'].'">'.$rowGroup ['group_name'].'</option>'; } } только не забудь разделить вывод echo на до и после этого цикла ну и смущает INNER JOIN почему именно он, а не LEFT JOIN? или студенты без группы идут лесом?
Упс не увидел. Наверху убрать строку mysqli_fetch_assoc, а в цикле заменить $dataGroup на $resultGroup
Теперь все группы выводит только у одного студента и его текущую группу он дублирует. А у всех остальных один единственный выбор в списке. Есть мысли как это исправить? Полный код исправленный: PHP: if($_GET['value'] == student) { $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link)); $query = 'SELECT ID_student, FIO_student, group_name FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group)'; $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link)); $queryGroup = 'SELECT * FROM study_group'; $resultGroup = mysqli_query($link, $queryGroup) or die("Ошибка " . mysqli_error($link)); echo '<form method = "POST" action = "edit.php"> <h2>Студенты</h2> <table class = "table table-hover table-striped"> <thead class = "thead-inverse thead-dark"> <tr> <th>Номер студента</th> <th>ФИО студента</th> <th>Название группы</th> </tr> </thead> <tbody>'; while($data = mysqli_fetch_assoc($result)) { echo '<tr> <th scope="row">'.$data['ID_student'].'</th> <th scope="row"> <input type="text" size="30" name="FIO_student" value="'.$data['FIO_student'].'"> </th> <th scope="row"> <select name="ID_group" class="form-control"> <option selected value="'.$data['ID_group'].'">'.$data['group_name'].'</option>'; while($rowGroup = mysqli_fetch_assoc($resultGroup)) { if ($rowGroup ['ID_group'] != $data['ID_group']) { echo '<option value="'.$rowGroup ['ID_group'].'">'.$rowGroup ['group_name'].'</option>'; } } '</select> </th> </tr>'; } echo '</tbody> </table>'; echo $htmlEnd; }
@lordconst, сорь туплю, три часа ночи было. Тут два варианта, либо сначала выгрузить данные из БД в массив и уже его использовать в цикле foreach вместо while($rowGroup=mysqli_fetch_assoc($resultGroup)). Либо каждый раз сдвигать указатель и тянуть данные из БД. Первый вариант предпочтительнее, поэтому второй (data_seek) не буду описывать. Верни назад свою строчку $dataGroup = mysqli_fetch_assoc($resultGroup); только взамест mysqli_fetch_assoc иcпользуй mysqli_fetch_all. Соответственно вместо while($rowGroup=mysqli_fetch_assoc($resultGroup)) напиши цикл foreach для $dataGroup
Теперь вот пустоту почему-то выдает( Вот итоговый внешний цикл while с foreach внутри PHP: while($data = mysqli_fetch_assoc($result)) { echo '<tr> <th scope="row">'.$data['ID_student'].'</th> <th scope="row"> <input type="text" size="30" name="FIO_student" value="'.$data['FIO_student'].'"> </th> <th scope="row"> <select name="ID_group" class="form-control"> <option selected value="'.$data['ID_group'].'">'.$data['group_name'].'</option>'; foreach ($dataGroup as $key => $value) { echo '<option value="'.$rowGroup ['ID_group'].'">'.$rowGroup ['group_name'].'</option>'; } '</select> </th> </tr>'; } Причем mysqli_fetch_assoc изменил на ..._all
PHP: foreach ($dataGroup as $key => $value) { echo '<option value="'.$dataGroup ['ID_group'].'">'.$dataGroup['group_name'].'</option>'; } Поправил, все равно не робит. Ту же пустоту выдает во всех строчках
читал) прошу ткнуть меня пальцем в то что нужно. Вместо $value надо $dataGroup, правильно понимаю? если да, то не работает. И вместо value пытался $dataGroup вставить, все равно пустоту выводит
Спойлер: *** PHP: foreach ($dataGroup as $key => $value) { echo '<option value="'.$value['ID_group'].'">'.$value['group_name'].'</option>'; } не надо пытаться вставить что-то вместо чего-то, ты должен отдавать себе отчёт в том, что ты делаешь
последние два дня занимаюсь этим проектом) курсовая работа. не могу сообразить. скажи, пожалуйста, в чем ошибка-то? что не так делаю?
это собственно говоря видно невооружённым глазом тут и соображать нечего, тем более, что код под спойлером который ты процитировал У тебя есть массив $dataGroup котроый надо обойти специально придуманным для этого циклом foreach и вывести. Если у тебя проблема с такими элементарными вещами, то рано ты начал писать курсовой.
написал же, я $value и пробовал использовать внутри цикла. Все равно выводит пустоту Скопировал код из спойлера, так я пробовал уже
@lordconst, значит "шерше ля фам" Распечатай print_r($dataGroup) и посмотри, что у тебя в массиве $dataGroup и если там ничего нет ищи где прощёлкал
ну да, там только текущая группа у каждого из студентов. А в чем может быть причина? Глянул еще раз селект, вроде бы нормально. В недоумении
PHP: if($_GET['value'] == student) { $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link)); $query = 'SELECT ID_student, FIO_student, group_name FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group)'; $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link)); $queryGroup = 'SELECT * FROM study_group'; $resultGroup = mysqli_query($link, $queryGroup) or die("Ошибка " . mysqli_error($link)); $dataGroup = mysqli_fetch_assoc($resultGroup); print_r($dataGroup); echo '<form method = "POST" action = "edit.php"> <h2>Студенты</h2> <table class = "table table-hover table-striped"> <thead class = "thead-inverse thead-dark"> <tr> <th>Номер студента</th> <th>ФИО студента</th> <th>Название группы</th> </tr> </thead> <tbody>'; while($data = mysqli_fetch_assoc($result)) { echo '<tr> <th scope="row">'.$data['ID_student'].'</th> <th scope="row"> <input type="text" size="30" name="FIO_student" value="'.$data['FIO_student'].'"> </th> <th scope="row"> <select name="ID_group" class="form-control"> <option selected value="'.$data['ID_group'].'">'.$data['group_name'].'</option>'; foreach ($dataGroup as $key => $value) { echo '<option value="'.$value['ID_group'].'">'.$value['group_name'].'</option>'; } '</select> </th> </tr>'; } echo '</tbody> </table>'; echo $htmlEnd; } study_group как раз та самая таблица с группами
Будь внимательнее, выкладывай актуальную версию кода. Будь внимательнее, смотри на структуру массива. Будь внимательнее читай но официальном сайте php.net описание функции которую используешь. Будь внимательнее, какой параметр надо передать в функцию mysqli_fetch_all, что бы получить ассоциативный массив. Будь внимательнее - это всё что требуется при написании кода.
вот теперь понял) а не подскажешь как мне теперь обратно все это в базу запихнуть? допустим, в этой таблице я изменю ФИО и группу одного или нескольких студентов. Как мне сделать апдейт таблиц?
Этого я и боялся Сделать апдейт не трудно, труднее собрать нужные данные из формы. Можно конечно захерачить всю форму, и без разбору проапдейтить все строки со страницы. Те которые не изменились, тупо неперезапишутся, но это вроде как не айс. Около года назад я кому-то рисовал подобный код, но боюсь тебе он не подойдёт, так как препод запалит Смысл в том, что бы передать на сервер информацию какие именно строки изменить, например выделив их чекбоксом. Чекбокс на строке можно устанавливать например при помощи js при изменении опшина. --- Добавлено --- Курсовой когда сдавать?
неделя точно есть. Но дальше уже дедлайн. Препод не запалит) потому что изначально курсовая на любом выбранном языке делается у нас. Сам препод топит за Delphi + Sybase SQL Anywhere, но это фигня полная. Я решил делать на php, чтобы набраться опыта для будущего портфолио
а как сделать постраничную обработку таблицы? допустим, будет кнопка Сохранить (тип submit). таблица же не на одну строку если топорно и грубо сразу всю таблицу апдейтить