Опубликован: 24.12.2006 | Уровень: для всех | Доступ: платный
Урок 16:

Написание простой CMS вручную

< Урок 15 || Урок 16: 123456789
  1. В пустой строке, оставленной на предыдущем шаге, введите код, необходимый для извлечения нужных записей.

    Для ASP:

    Set rs_regions = dbConn.Execute("SELECT * FROM tbl_region ORDER BY regionName")

    Для PHP:

    $query_rs_regions = "SELECT * FROM tbl_region ORDER BY regionName";
    $rs_regions = mysql_query($query_rs_regions);
    $row_rs_regions = mysql_fetch_assoc($rs_regions);

    На данный момент этот SQL-код не должен вызывать вопросов. Он извлекает все поля из всех записей таблицы tbl_region и упорядочивает их в алфавитном порядке по названию региона.

    Код ASP и PHP снова может вызвать недоумение. Начнем с ASP. Как известно, dbConn – это не набор записей, а объект соединения. Для формирования набора записей в приведенной строке кода создается объект набора записей (Recordset), содержимое которого эквивалентно данным, извлеченным при помощи переданного через соединение запроса.


    Первые две строки кода PHP отправляют запрос в базу данных. Можно предположить, что в результате отправления запроса обратно передается набор записей, который сохраняется в переменной $rs_regions. Но это не так. При отправлении запроса в базу данных MySQL при помощи функции PHP mysql_query() обратно передается не набор записей, а число, которое указывает на данные. Сами данные не возвращаются. Вместо этого они помещаются в нейтральную область, которая не относится ни к PHP, ни к MySQL. Чтобы получить эти данные, следует извлечь их при помощи функции mysql_fetch_assoc() (или одного из ее вариантов). Эта функция извлекает данные из нейтральной области и создает массив для их хранения. В данном случае этот массив назван $row_rs_regions. После размещения данных в этом массиве он начинает играть роль набора записей, как в ASP или ColdFusion. Для доступа к данным следует ссылаться на $row_rs_regions.

    Этого кода достаточно для создания набора записей и помещения данных на страницу. На панели Bindings (Привязки) этот набор записей отображен не будет, поскольку Dreamweaver не осознает его наличие. К сожалению, это означает и то, что привязать набор записей к объектам формы невозможно. Придется делать это вручную.

  2. В режиме Code (Код) прокрутите страницу вниз, пока не обнаружите форму. Несколькими строками ниже внутри таблицы расположен элемент <select> , который и является списком. Несколько раз нажмите (Enter) или (Return), чтобы с помощью пробелов добавить больше свободного места между открывающим и закрывающим тегами.

    Тег <select> создает раскрывающийся список. Для добавления опций для списка используется тег <option>. Каждый тег <option> соответствует одной опции списка. Для его добавления применяется следующий синтаксис:

    <option value="данные">Label</option>

    В этом примере Label (Надпись) –используется в качестве надписи к списку (она видна пользователям), а data (Данные) – это значения, которое передается после заполнения формы. В качестве надписи следует указать поле regionName, а в качестве значения – regionID.

  3. В пустые строки, расположенные между тегами <select> введите код, необходимый для того, чтобы прикрепить к тегу <option> данные, извлеченные из базы.

    Для ASP:

    <%
    Response.Write("<option value=""" & rs_regions("regionID") & """>" 
       & rs_regions("regionName") & "</option>")
    %>

    Для ColdFusion:

    <cfoutput>
    <option value="#rs_regions.regionID#">#rs_regions.regionName#</option>
    </cfoutput>

    Для PHP:

    <?php
    echo "<option value=\"".$row_rs_regions['regionID']."\">".
      $row_rs_regions ['regionName']."</option>";
    ?>

    Значение поля regionID привязано к параметру value, а значение regionName выступает в качестве надписи к списку.

    К блокам кода ASP и PHP, как обычно, требуются дополнительные пояснения. Как известно из предыдущих уроков, функции Response.Write() и echo позволяют ASP и PHP выводить текст в браузер. В этой строке сервер получает указание вывести строку HTML-кода для тега <option>. Для вывода строки текста в ASP или PHP этот текст заключается в кавычки. Сложность заключается в том, что строка кода ASP <option value="rs_regions("regionID")">rs_regions("regionName")</option> (или эквивалент на PHP) не должна выводиться в браузер буквально. Предварительно сервер должен вычислить значения элементов массива $row_rs_regions['regionID'] и $row_rs_regions['regionName']. После того, как значения получены, обработчик ASP или PHP должен вывести результаты ("6" и "Africa" соответственно) в браузер. Но если не убирать кавычки для этих участков кода, обработчик ASP или PHP вместо того, чтобы вычислить и вывести полученные значения, просто выведет на страницу указанный код.

    Для решения этой проблемы используется прием, называемый конкатенацией, который сводится к созданию текстовых строк путем объединения нескольких отдельных участков кода. В данном случае участками являются строковые литералы, например, "<option value=" и выражения, такие как rs_regions("regionID") и $row_rs_regions['regionID']. Эти участки объединяются при помощи знака & в ASP и при помощи точки ( .) в PHP. Таким образом, ASP и PHP предварительно вычисляют значения выражений, и только после этого прикрепляют их к строке. В ColdFusion для того, чтобы различить строковые литералы и выражения, используется знак #. Благодаря этому отпадает необходимость в объединении элементов. Итак, в итоге, вне зависимости от применяемой технологии (ASP, ColdFusion или PHP), на страницу будет добавлен код <option value="6">Africa</option>.

    В коде ASP и PHP есть еще одна сложность: кавычки используются по двум разным причинам. Как в большинстве языков программирования, в ASP и PHP кавычки употребляются для отделения строк от выражений. Все, что заключено в кавычки, обработчик ASP и PHP игнорирует и выводит на страницу без изменений. К сожалению, в данном случае, в строке, которую требуется вывести на страницу, присутствуют кавычки, поскольку правильная синтаксическая конструкция для параметра HTML-тега выглядит так: <option value="XYZ">. То есть при выводе кода на страницу вычисленное значение переменной rs_regions("regionID") и $row_rs_regions['regionID'] должно быть заключено в кавычки, например, <option value="6">. Но, когда обработчик кода ASP и PHP обнаруживает кавычки, идущие после параметра value, он интерпретирует их как конец строки, хотя, на самом деле, это не так. Чтобы обработчик различал ситуацию, когда кавычки следует вывести, а не и нтерпретировать, используются два набора кавычек (ASP), либо перед кавычками ставится обратный слэш ( \ ) (PHP). Таким образом, в участке кода для ASP "<option value=""" & из трех кавычек, следующих подряд, первые и вторые кавычки соответствуют кавычкам, которые следует добавить в HTML-код, а третьи кавычки обозначают конец строки. Точно так же в участке кода для PHP "<option value=\"". Здесь \" указывает обработчику на то, что следует вывести пару кавычек на страницу, а следующие кавычки (после которых сразу идет точка) указывают на конец строки.

    Сохраните файл, загрузите его на сервер, откройте и обратите внимание на список. В списке появился пункт Africa. В списке стран, отсортированном в алфавитном порядке, Africa идет первой. Это хорошо, но есть одна проблема – в списке пока только один пункт. Необходимо, чтобы сценарий ASP, ColdFusion или PHP для каждой записи из базы данных создавал отдельный тег <option>. Для этого используется программная конструкция, называемая циклом. В цикле один и тот же участок кода выполняется до тех пор, пока не будет выполнено заданное условие. В данном случае требуется создать цикл, выводящий строку с тегом <option> до тех пор, пока в таблице не закончатся записи.

  4. В участок кода, написанный в предыдущем шаге, добавьте строки, необходимые для создания цикла.

    Для ASP:

    <%
    Do Until rs_regions.EOF
        Response.Write("<option value=""" & rs_regions("regionID") & """>" 
      & rs_regions("regionName") & "</option>")
        rs_regions.MoveNext
      Loop
    %>

    Для ColdFusion:

    <cfoutput query="rs_regions">
    <option value="#rs_regions.regionID#">#rs_regions.regionName#</option>
    </cfoutput>

    Для PHP:

    <?php
    do
    {
      echo "<option value=\"".$row_rs_regions['regionID']."\">".$row_rs_regions
             ['regionName']."</option>";
    }
    while ($row_rs_regions = mysql_fetch_assoc($rs_regions));
    ?>

    Пользователям ColdFusion достаточно добавить в тег <cfoutput> атрибут query, после чего цикл будет создан автоматически.

    Пользователям ASP и PHP как обычно будет несколько сложнее. Для создания циклов здесь применяются конструкции Do Until (ASP) и do…while (PHP). Каждая конструкция содержит единственный параметр, который служит условием прерывания цикла. В обоих случаях условием является достижение конца набора записей (метка EOF в ASP означает конец файла – End of File). Следующая строка, как и прежде, служит для выведения на страницу элемента <option>. В PHP код, который обрабатывается в процессе выполнения цикла, заключен в фигурные скобки {}. В ASP для перехода к следующей записи используется метод MoveNext. Последняя строка Loop в коде ASP отправляет обработчик обратно к строке Do Until, а последняя строка с оператором while в коде PHP включает условие, при выполнении которого обработчик снова переходит к началу цикла (оператор do ).

    Если снова протестировать файл в браузере и щелкнуть на списке, появится перечень всех стран (см. рис. вверху следующей страницы).

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

    Для ASP:

    <%
    rs_regions.Close()
    Set rs_regions = Nothing
    %>

    Для PHP:

    <?php
    mysql_free_result($rs_regions);
    ?>

    В верхней части документа размещается сценарий, открывающий соединение и создающий набор записей. Этот набор записей хранится в памяти сервера. Он остается в памяти до тех пор, пока не будет отдано распоряжение о его удалении. Если не удалять данные, которые больше не используются, то через некоторое время сервер может оказаться перегруженным. Участок кода для ASP удаляет все записи из набора ( rs_regions.Close() ), после чего уничтожает объект набора записей ( Set rs_regions = Nothing ). Сценарий для PHP просто очищает от данных массив $rs_regions. Поскольку сценарий добавляется в самый конец страницы, набор записей уничтожается только после того, как обработана вся страница. Если уничтожить набор записей до заполнения списка содержащимися в наборе данными, из этого не выйдет ничего хорошего.

    ColdFusion уничтожает набор записей автоматически в процессе обработки кода, заключенного между тегами <cfquery>, поэтому пользователям ColdFusion выполнять этот шаг не требуется.

< Урок 15 || Урок 16: 123456789
Екатерина Мезенцева
Екатерина Мезенцева
Россия
Маргарита Туктарова
Маргарита Туктарова
Соединенное Королевство, London, kingston university, 2012