Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Получение результатов запроса




Разнообразие функций дает возможность получить результат различными способами. Идентификатор результата — это ключ доступа к строкам, возвращенным запросом, которых может быть нуль, одна и более.

 

В нашем примере использовались две функции:

mysql_num_rows()

 

 

и mysql_fetch_array().

 

Функция mysql_numrows() сообщает количество строк, которые возвращает запрос. В нее следует передать идентификатор результата.

 

Это полезно знать, если планируется обрабатывать или отображать результаты. Зная их количество, можно организовать цикл:

 

for ($i=0; $i <$num_results; $i++num){

// обработка результатов

}

На каждой итерации цикла происходит вызов mysql_fetch_array(). Цикл не будет выполняться, если нет строк. Эта функция берет каждую строку из списка результата и возвращает ее в виде ассоциативного массива, с ключом как именем атрибута и значением как соответствующим значением массива:

 

$row = mysql_fetch_array($result);

 

Имея $row в ассоциативном массиве, можно пройти каждое поле и должным образом его отобразить:

 

 

Задание 2.Проверка и фильтрация данных, исходящих от пользователя. Использование объектно-ориентированного синтаксиса PHP

 

Представленный на рис. 3.268 обработчик ввода в форму на рис. 3.266, обладает рядом недостатков, которые проявляются в процессе эксплуатации системы. Преобразуем форму на рис. 3.266 к виду показанному на рис. 3.272 (http://localhost/php/lab15_02.php).

 

Рис. 3.272. Модифицированная форма ввода информации.

В форме показанной на рис. 3.272(a) добавлена кнопка , а на рис. 3.272(б) для примера раскрыт список типов возможного поиска.

Код HTML формы для рис. 3.272, отличается от кода формы представленного на рис. 3.267 строкой объявления добавления кнопки (рис. 3.273):

 

Листинг кода формы для рис. 3.272:

Рис. 3.273. Код HTML создания формы. Файл Lab15_02.php.

 

Обработчик приведенной формы представлен в файле Lab15_03.php, содержимое которого показано на рис. 3.274.

 

Листинг обработчика HTML формы (файл Lab15_03.php).

 

Рис. 3.274. Код обработчика формы. Файл Lab15_03.php.

Если пользователь нажмет кнопку , то сработает условие в строке 16 и будет сформирован запрос к базе в виде следующей строковой переменной (строка 18, рис. 3.274):

На основании этого запроса будет сформирован ответ, показанный на рис. 3.275.

Рис. 3.275. Результат запроса на показ всех книг.

 

Если пользователь нажмет кнопку (рис. 3.272(a)), и не заполнит поле для ввода информации:

, то сработает условие в строках 19, 20 обработчика формы (рис. 3.274):

и будет сформировано следующее сообщение для пользователя (строка 21-24, рис. 3.274):

Рис. 3.276. Результат запроса без указания аргумента поиска.

В операторе вывода сообщения на экран (для закрепления материала по использованию тегов в PHP) использован тег установки цвета (font color=”red”), перевода строки (br) и тег вывода жирного шрифта (strong).

 

Ниже приведен пример заполненной формы и результат работы обработчика формы.

Рис. 3.277. Результат запроса c указанием аргумента поиска.

 

Для того чтобы обработчик корректно обрабатывал вводимые значения пользователя, в теле обработчика использован ряд стандартных функций и приемов PHP.

В начале необходимо объявить все переменные использованные в программе, во избежании фокусов со стороны используемых браузеров.

 

Напомним, что для доступа к переменным можно использовать также глобальный массив с именем $_REQUEST.

Далее необходимо убрать все лишние пробелы по краям слова, которые мог случайно набрать пользователь в поисковом значении переменной term. Для этого использована функция trim(), применяемая к переменной term (критерий поиска).

 

 

Следующий этап — убедиться, что пользователь указал критерий и тип поиска. Заметьте, это проверяется лишь тогда, когда критерий поиска не содержит лишние пробелы. Если поменять эти этапы местами, может возникнуть ситуация, когда критерий вроде и введен, сообщения об ошибке быть не должно, однако критерий содержит только пробелы, которые полностью удаляются функцией trim().

В этом случае выдается сообщение о том, что критерий поиска не введен (рис. 3.276). Мы проверили переменную $search (имя поля по которому ведется поиск) даже в том случае, когда она поступает из оператора SELECT. Вас может заинтересовать, зачем проверять входные данные. Не забывайте, что база данных может иметь не один интерфейс. Например, фирма по продаже книг может располагать большим количеством филиалов, которые используют свои поисковые интерфейсы. Вследствие того, что пользователи могут заходить с разных рабочих станций, возникает и потенциальная угроза безопасности.

 

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

 

В нашем случае к критерию поиска применяется функция addslashes():

 

К данным, исходящим из базы, применяется stripslashes(). Введенные данные не содержат косых линий, равно как и управляющих символов. То есть вызов stripslashes() не поможет. При построении Web-интерфейса для базы данных велики шансы того, что потребуется вносить данные о новых книгах, а детали, внесенные пользователем, могут содержать специальные символы. Сохраняя их в базе данных, мы обращаемся к addslashes(), а это означает, что при извлечении данных необходимо будет вызывать stripslashes().

 

Функцию htmlspecialchars() применяют для кодировки символов, которые имеют специальное значение в HTML. В наших тестовых данных нет амперсандов (&), знаков "меньше" (<), "больше" (>), двойных кавычек ("), однако в названиях многих книг может повстречаться амперсанд. Использование этой функции застраховывает от грядущих ошибок.

 

Как уже упоминалось, stripslashes() вызывают для того, чтобы "подчистить" значение, прежде чем отображать его пользователю, иначе косые черты будут видны на экране.

 

В нашем примере в обработчике (Lab15_03.php, рис. 3.274) использована функция get_magic_quotes_gpc (), которая указывает, выполняется ли автоматическое взятие в кавычки. Буквы “gpc” в имени функции (директивы) означают GET, POST и COOKIE. Это означает, что все переменные, поступающие из упомянутых источников, автоматически помещаются в кавычки.

 

Установка соединения в объектно–ориентированном PHP

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

Если пользователь нажмет кнопку (рис. 3.272(a)), и заполнит поле для ввода информации, то будет сформирована строка запроса $query:

 

Сконструированное значение переменной $query, далее используется для получения результата (строка 45, рис. 3.274 или строка 45 в файле Lab15_03.php), сформированного операцией (методом) экземпляра объекта класса , который создается строкой 37 рассматриваемого сценария.

 

В приведенной строке создается экземпляр объекта класса и предпринимается попытка соединения с хостом с использованием имени пользователя и пароля . Соединение будет использовать базу данных . В нашем случае имя базы BOOKS.

В PHP5 появилась новая библиотека для подключения к MySQL, называемая mysqli (“i” означает “improved” - улучшенная). Данная библиотека позволяет использовать как объектно-ориентированный, так и процедурный синтаксис.

Если использовать процедурный синтаксис PHP5, то подключение к MySQL должно быть записано в виде следующей строки:

@ $db =mysqli_connect ($Host, $User, $Password, $DBName);

В отличие от результата функции (приведенной в строке 37), функция mysqli_connect () возвращает ресурс, а не объект.

Этот ресурс при использовании процедурного интерфейса должен передаваться во все использованные функции mysqli (данный подход напоминает работу с файловыми функциями наподобие Fopen()).

Обратите внимание, что строка, в которой выполняется попытка подключения к базе данных, начинается с операции подавления выдачи ошибок @.

Как и в процедурном подходе, так и в объектно-ориентированном интерфейсе результат попытки подключения к базе данных должен быть проверен (0 – если результат соединения успешен, иначе номер ошибки).

Следующая строка сценария (рис. 3.274) возвращает результат построенного запроса:

 

Если Вы предпочитаете процедурный интерфейс, то запрос следует записать в виде:

$result = mysqli_query ($db, $query);

В любом случае возвращаемое значение сохраняется в переменной $result для дальнейшего использования.

Существуют несколько вариантов получения результата из идентификатора результата. В нашем примере, использующим объектно-ориентированный подход, количество возвращаемых строк хранится в переменной класса объекта результата с именем

При процедурном подходе для получения количества возвращаемых строк используется функция mysqli_num_rows($result), которой необходимо передать идентификатор результата:

$num_res = mysqli_num_rows($result);

В задании 1 данной темы, аналогичный результат получен функцией: mysql_num_rows($result) (рис. 3.268).

 

Зная значение $num_res, можно отобразить результаты запроса используя цикл (строки 49-61).

В каждой итерации этого цикла происходит вызов метода класса

$row=$result->fetch_assoc() (строка 51). Именно этот метод извлекает из результирующего набора запись и преобразует ее в ассоциативный массив, в котором каждый ключ является именем атрибута, а каждое значение – элементом ячейки массива

Естественно, если использовать процедурный подход в строке с номером 51, должна быть указана функция:

$row = mysqli_fetch_assoc($result);

Используя массив $row можно пройти по всем полям и должным образом отобразить каждое из них (строки 52-59).

 

Кроме рассмотренных вариантов получения результата из идентификатора запроса можно вместо ассоциативного массива воспользоваться нумерованным массивом, применив при процедурном подходе функцию mysqli_fetch_row():

 

$row = mysqli_fetch_row($result);

 

При объектном подходе используется метод

$row = $result -> fetch_row ();

 

Значения атрибутов будут храниться в каждом порядковом значении $row[0], $row[l] и т.д.

 

С помощью функции mysqli_fetch_object() можно выбрать строку внутрь объекта и получать доступ к атрибутам как к свойствам объекта $row-> title, $row-> author и так далее.

 

$row = mysqli_fetch_object($result);

 

При объектном подходе используется метод:

$row = $result -> fetch_object ();

 

После этого к каждому атрибуту можно получить доступ через $row->title, $row->author и так далее.

 

Каждый из этих вариантов подразумевает выборку строки за раз. Другой вариант — получить доступ, используя mysql_result(). Для этого потребуется указать номер строки (от 0 до количества строк минус 1) и название поля, например:

 

$row = mysqli_result($result, $i, "title");

 

Название поля можно задать в виде строки (либо в форме "title" либо в форме "books.title") или номером (как в mysqli_fetch_row()). He стоит смешивать mysqli_result() с другими функциями выборки.

Строчно-ориентированные функции выборки намного более эффективны, нежели mysqli_result(), так что лучше использовать одну из них.

 




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 537; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.061 сек.