Перед тем как начать выборку данных из результирующего набора, нам необходимо сформировать HTML-таблицу. Как можно ожидать, это можно сделать с помощью тега начала таблицы. Заглавная строка была создана с серым фоном, а остальное оформление таблицы осталось заданным по умолчанию. Теперь, после того как заглавная строка таблицы напечатана, можно выбрать строки результирующего набора. Быстрее всего это можно сделать с помощью функции mysql_fetch_assoc, которая позволяет отобразить столбцы результирующего набора в качестве элемента ассоциативного массива. Имена столбцов используются в качестве индексов массива. Можно также использовать функции mysql_fetch_row и mysql_fetch_object, которые являются одинаково эффективными. Следует избегать использования функции mysql_result, так как она производит неэффективный поиск в двухмерном массиве.
Если строк больше не осталось, возвращается значение FALSE. Для подчеркивания такого поведения функции строка была размещена в цикле while. Строка HTML-таблицы содержит в ячейках таблицы свойства объекта. Если строк больше не осталось, таблица закрывается. О закрытии соединения с базой данных беспокоиться не надо, поскольку PHP сделает это автоматически.
Это достаточно простой пример, но он затрагивает практически все основные нюансы работы с базами данных. Поскольку все строки создаются в цикле, они все одинаковы. Если данные изменяются, то нет никакой необходимости менять PHP-код, который превращает их в HTML-код. Достаточно изменить данные в базе данных.
Хорошим примером использования этого метода в работе является генератор случайных наименований ансамблей (Random Band Name Generator), который можно найти по адресу <http://www.leonatkinson.com/random/index.php?SCREEN=band>, который создает случайные названия музыкальных ансамблей на основе слов, хранящихся в базе данных MySQL, куда любой желающий может добавить слово. Каждое обновление страницы дает новые десять имен. 
23.2. Отслеживание посещения с помощью идентификаторов сеансов
По мере того как Web-узлы становятся Web-приложениями, возникает проблема анализа их состояния. Задача заключается в том, чтобы приложение запоминало посетителей страницы. Подключаясь к серверу, браузер запрашивает на нем один или несколько файлов, а затем закрывает соединение. Пятью минутами позже, когда вы снова подключитесь к странице, все повторится сначала. Даже если сервер все регистрирует, он вас не запоминает. Любая информация, которую вы о себе сообщали до того, где-то сохраняется, но она с вами уже никак ассоциироваться не будет.
Представим себе некий интерфейс, предназначенный для заказа пиццы. Сначала у вас спрашивают, сколько порций пиццы вы заказываете, и вы делаете заказ. Затем на странице запрашиваются ваше имя и адрес. После чего ваш заказ пересылается по почте ближайшему к вам пункту доставки пиццы. Одним из способов решения этой задачи является передача собранной информации с каждой формой. По мере того как посетитель переходит от страницы к странице, объем этих данных постоянно возрастает. Такой метод работает, но требует большой пропускной способности.
Использование базы данных и идентификатора сеанса позволяет сохранять данные по мере их поступления. Сам идентификатор используется в качестве ключа к информации. Имея в своем распоряжении идентификатор сценария, можно запомнить то, что происходило прежде.
Сценарий может получить идентификатор двумя способами. Одним из них является передача идентификатора как переменной внутри каждой ссылки или формы. В форме это можно сделать с помощью скрытых переменных. В ссылке для этого необходимо добавить знак вопроса, а после него - определение переменной. Например, если идентификатор сеанса хранится в переменной session, тогда для передачи значения этой переменной на следующую строку можно вывести что-то наподобие print("<a href="page2.php?session=$session">next</a>");. Такой метод работает с любым браузером, даже с Lynx.
Другим способом является передача файлов cookie. Подобно тому как команды GET и POST формируют переменные, файлы cookie тоже преобразуются PHP в переменные. Таким образом, можно создать файл cookie по имени session. Основное различие заключается в том, что поскольку файлы cookie устанавливаются только в заголовках, их необходимо отправлять в браузер до того, как будет отправлен любой HTML-код. Если вы выбираете такую стратегию, обратитесь к описанию функции setcookie (см. главу 8, "Браузер ввода-вывода"). Более сложная стратегия заключается в использовании файлов cookie, но по необходимости можно работать и с переменными GET.