Опубликован: 24.12.2006 | Доступ: свободный | Студентов: 2672 / 212 | Оценка: 4.51 / 4.22 | Длительность: 23:31:00

Урок 10: Фильтрация и отображение данных

< Урок 9 || Урок 10: 1234567 || Урок 11 >

Блок ASP

Для ASP был сгенерирован приведенный ниже код:

<%
While ((Repeat1_numRows <> 0) AND (NOT rs_countryNames.EOF))
%>
<a href="profiles_detail.asp?countryid=<%=(rs_countrynames.Fields.Item
("countryid").Value)%>"><%=rs_countrynames.Fields.Item  
    ("countryName").Value)%>
	</a>
<%
Repeat1_index=Repeat1_index+1
Repeat1_numRows=Repeat1_numRows-1
rs_countryNames.MoveNext()
Wend
%>

Для тех, кто раньше не занимался программированием, многое может показаться не совсем понятным, но все же важно иметь хотя бы общее представление о том, что происходит в этом коде. Интересующий нас фрагмент содержит два блока ASP (расположенных между открывающим и закрывающим тегами <% %> ). В верхнем блоке содержится оператор while, используемый для запуска цикла, а в скобках заключено условие, при выполнении которого цикл завершается. В языке VBScript метка EOF указывает на конец файла, так что цикл будет прерван, когда в наборе закончатся все записи. В нижнем блоке содержится код, в котором и осуществляется переход от одной записи к другой, а также завершение цикла ( Wend ).

Между этими блоками содержится код ссылки, который повторно выводится на страницу. Следует обратить внимание, что после закрывающего тега </a> отсутствует тег <br />, добавляющий после ссылки разрыв строки. Для правильного отображения страницы следует самостоятельно добавить этот тег в конец строки (что и будет сделано в следующем шаге).

Блок ColdFusion

Как и ожидалось, код ColdFusion намного проще.

<p><a href="profiles_detail.cfm?countryID=<cfoutput> 				
#rs_countryNames.countryID# </cfoutput>">
<cfoutputquery="rs_countryNames">
#rs_countryNames.countryName#</cfoutput></a></p>

Первое, на что следует обратить внимание (подразумевается, что вы проанализировали код на ASP): в коде отсутствует явная конструкция цикла. На самом деле, цикл применяется и здесь, но ColdFusion скрывает его для упрощения синтаксиса. Каждый раз при использовании тега <cfoutput> и указании запроса в качестве его атрибута (query), автоматически создается цикл. Условие завершения цикла (достижение конца набора записей) точно так же подразумевается.

Особой проблемой является то, что цикл выполняется только в рамках тегов <cfoutput>, но между ними нет тегов <br /> или <p>, создающих разрыв строки. Вторая проблема заключается в том, что Dreamweaver сгенерировал два блока тегов <cfoutput>, в то время как требуется только один.

Через некоторое время обе проблемы будут решены.

Блок PHP

Код PHP в основном подобен коду ASP:

<?php do { ?>
<p><a href="profiles_detail.php?countryID=<?php echo $row_rs_countryNames['countryID']; 
?>"><?php echo $row_rs_countryNames['countryName']; ?></a></p>
<?php while ($row_rs_countryNames = mysql_fetch_assoc($rs_countryNames)); ?>

В PHP для создания цикла применяется условная конструкция do…while. Участок кода, связанный с выполнением тела цикла, следующий за ключевым словом do, содержится в первой строке блока, а участок после ключевого слова while, включающий условие, – в последней. Между ними присутствует код, формирующий строку с именем и ссылкой, содержащей в качестве параметра URL-адреса значение поля countryID.

Для определения необходимого количества повторений цикла в код добавляется ссылка на набор записей (функция mysql_fetch_assoc() ). При отправке запроса в базу данных с помощью функции mysql_query() и оператора SELECT PHP получает возвращаемые данные, однако это происходит не сразу. Для получения данных требуется извлечь их при помощи одной из предназначенных для этой цели функции PHP. В данном случае это функция mysql_fetch_assoc(). За каждое прохождение цикла она возвращает одну запись (или строку) из массива данных, который в предшествующем блоке кода записан в переменную $row_rs_countryNames. Таким образом, для возвращения всех строк следует перебрать набор записей при помощи циклической структуры. Каждый раз значение переменной $row_rs_countryNames меняется и, соответственно, выводится в HTML-код.

Примечание.При первом прохождении цикла используется значение, присвоенное переменной $row_rs_countryNames по умолчанию. Это значение задается в блоке формирования запроса, расположенном в верхней части документа (в моем случае, это строка 6).

После того, как мы проанализировали действие ключевых блоков кода, стало понятным решение проблемы отображения списка на странице: при каждом прохождении цикла на страницу добавляется абзац, который помещается внутри тегов <p> </p>. Как известно, тег <p> является блоковым элементом HTML, следом за которым всегда добавляются отступы. Следовательно, для уменьшения расстояния между названиями стран следует заменить теги <p> на теги <br />, применение которых приводит к принудительному переходу на следующую строку. Вскоре это изменение будет внесено.

Таким образом, при обработке цикла все три серверные модели (ASP, ColdFusion и PHP) выводят не совсем то, что нужно, и в результате страница отображается не вполне корректно. В любом случае, требуется изменить код так, чтобы добавляемая ссылка не помещалась в отдельный абзац, и чтобы после каждой ссылки присутствовал тег разрыва строки. Это решение является простым и очевидным, но только в том случае, если потратить время на изучение кода.

В зависимости от серверной модели решение будет разным.

  1. Для всех пользователей. Найдите внутри цикла закрывающий тег </a> и сразу после него добавьте тег <br /> .

    На этом проблема корректного отображения страницы для ASP и PHP оказывается решенной. Пользователям ColdFusion потребуется выполнить еще один шаг.

  2. Только пользователям PHP. Переместите открывающий тег <p> таким образом, чтобы он находился перед <?php do . Точно так же переместите закрывающий тег </p> , чтобы он находился после строки <?php } while , но перед закрывающим тегом </td> .

    В этом шаге решается проблема вложенности. Теперь все элементы, выводимые на страницу при выполнении цикла, будут расположены внутри одного абзаца и отделены друг от друга разрывами строки ( <br /> ).

    В итоге, код PHP должен выглядеть следующим образом:

    <p><?php do { ?>
    <a href="profiles_detail.php?countryID=<?php echo  
    $row_rs_countryNames['countryID']; ?>"><?php echo 				  
    $row_rs_countryNames['countryName']; ?></a><br /> 
    <?php while ($row_rs_countryNames = mysql_fetch_assoc($rs_countryNames));   ?> </p></td>
  3. Только пользователям ColdFusion. Перепишите код, чтобы он выглядел таким образом (весь код помещался в одной строке):
    <p><cfoutput query="rs_countryNames"><a 						
    href="profiles_detail.cfm?countryID=#rs_countryNames.countryID#"> 			
    #rs_countryNames.countryName#</a><br /></cfoutput></p></td>

    В код внесено два изменения. Во-первых, два блока <cfoutput> объединены в один. Поскольку <cfoutput> позволяет выводить на страницу как статический HTML, так и переменные ColdFusion, нецелесообразно использовать два отдельных блока. Теперь весь участок, который выводится при каждом прохождении цикла, заключен между тегами <cfoutput>.

    После внесения указанных правок значительно проще устранить проблему, связную с корректным отображением списка. Как и в случае с ASP и PHP, цель заключается в том, чтобы поместить весь код, полученный в результате выполнения цикла, внутри одного абзаца (между тегами <p></p> ) и поместить в цикл тег <br /> для создания разрывов строки.

  4. Сохраните файл, загрузите его на сервер и протестируйте.

Теперь страница работает и отображается надлежащим образом.

< Урок 9 || Урок 10: 1234567 || Урок 11 >