Это код с веб-страницы моего проекта. Здесь я хочу отображать выбранные пользователем категории, а затем показывать свои объекты, относящиеся к категориям. Там пользователи могут иметь более одной категории, и это не проблема. Я могу напечатать все эти категории в моем первом цикле while. Проблема в том, что когда я пытаюсь напечатать объекты, в результате они показывают только одну строку, но в каждой категории есть больше предметов. Может ли кто-нибудь сказать мне, что происходит?
Это мой код.
Примечание. Оба запроса работают правильно. Я попробовал те, которые используют клиентскую программу mysql.
<?php require_once ('../../includes/config.inc.php'); require_once( MYSQL1 ); $q = "SELECT institute_category.category_id, category_name FROM institute_category INNER JOIN category ON institute_category.category_id = category.category_id WHERE institute_category.institute_id = $instituteId"; $r = mysqli_query( $dbc, $q); while ( $row = mysqli_fetch_array ( $r, MYSQLI_ASSOC) ) { $categoryId = $row['category_id']; $category = $row['category_name']; echo '<fieldset class="alt"> <legend><span>Category : <em style="color: red;">' . $category . '</em></span></legend>'; $qy = "SELECT category_subject.category_id, category_subject.subject_id, subjects FROM category_subject INNER JOIN category ON category_subject.category_id = category.category_id INNER JOIN subject ON category_subject.subject_id = subject.subject_id WHERE category_subject.category_id = $categoryId"; $result = mysqli_query( $dbc, $qy); $c = $i = 0; echo '<table class="form_table" ><tr>'; while($row = mysqli_fetch_array( $result, MYSQLI_ASSOC )){ // if remainder is zero after 2 iterations (for 2 columns) and when $c > 0, end row and start a new row: if( ($c % 2) == 0 && $c != 0){ echo "</tr><tr>"; } echo '<td width="50%"><input type="checkbox" name="subject[]" value="' . $row['category_id'] . ":" . $category . ":" . $row['subject_id'] . ":". $row['subjects'] . '" /> ' . $row['subjects'] . '</td>' . "\n"; $c++; } // while.. // in case you need to fill a last empty cell: if ( ( $i % 2 ) != 0 ){ // str_repeat() will be handy when you want more than 2 columns echo str_repeat( "<td> </td>", ( 2 - ( $i % 2 ) ) ); } echo "</tr></table>"; } echo '</fieldset>'; ?>
Превращение моего комментария в ответ:
Посмотрев только на ваш код, я вижу, что вы используете переменную $row
как для внешнего цикла, так и для внутреннего цикла. Попробуйте переименовать переменную $outerRow
внешнего цикла в $outerRow
и переменную $outerRow
из внутреннего цикла в $innerRow
. Это может быть первая проблема. Это может относиться и к другим переменным, например, к переменной $result
.
имя переменной пользователя для внутреннего цикла $result
и $row
например $inresult
и $inrow
Поскольку в обоих циклах вы использовали одну и ту же переменную $row
во inner loop
$row[]
может reference of outer one
и в этом результирующем наборе переменная, которую вы ищете, отсутствует, чтобы не печатать ничего из внутреннего цикла , пожалуйста, измените переменную внутреннего или внешнего цикла.