Изучаем PHP, Часть 1: Страница регистрации, формы и взаимодействие с базой данных |
|
Уровень сложности: средний Никлас Чейз, Независимый автор, Backstop Media 11.01.2007
Из этого учебного пособия, первого из трех в серии "Изучаем PHP", вы узнаете, как использовать PHP для создания простейшего приложения, поддерживающего workflow. Вы научитесь строить PHP-страницы с использованием HTML-форм и получать доступ к базам данных. В этом учебном пособии Если вам раньше не приходилось сталкиваться с PHP, но вы хотите научиться писать Web-ориентированные приложения, то начните изучение с данного пособия, которое является первой частью в серии из трех учебных пособий. PHP является языком скриптового типа, он очень прост в изучении, но с его помощью можно строить достаточно сложные приложения с широкой функциональностью. Это учебное пособие научит вас писать несложные приложения, строить PHP-страницы с использованием HTML-форм и получать доступ к базам данных. Требуемый опыт В этом учебном пособии предполагается, что у вас нет никакого опыта работы с PHP. Знакомство с концепциями и форматом HTML может быть полезно, но никакого другого опыта программирования не требуется. Системные требования Вам необходимо иметь Web-сервер, PHP и базу данных. Если у вас есть доступ к сети, в которой установлен сервер PHP V5 с доступом к базе данных MySQL, то вы можете им воспользоваться. В противном случае загрузите и установите следующие пакеты:
Форматы html, pdf
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Формы и PHP Создание и использование форм в PHP Язык PHP изначально разрабатывался как язык для Web-программирования. Конечно, вы можете запустить PHP из командной строки, но фактически случаи использования PHP вне Web-приложений очень редки. Как правило PHP используется вместе с HTML-формами. Вы создаете форму с использованием HTML, затем пользователь вводит данные в эту форму и инициирует ее передачу, браузер пересылает данные серверу в форме массива. В этом разделе мы определим, что такое массив данных, рассмотрим способы работы с данными в формах. Вы также познакомитесь с конструкциями, управляющими ходом выполнения PHP-скрипта, такими как циклы и условные операторы if-then.
Начнем с создания страницы регистрации для вашего приложения. На этой странице пользователи будут вводить свои данные, а вы будете утверждать их, то есть выполнять некоторые проверки, прежде чем переслать данные в базу. Для начала просто создадим форму для ввода. Создадим новый файл registration.php и поместим в него следующий текст:
Таким образом, мы имеем простую форму, которая содержится внутри HTML-тега Рисунок 3. Форма для регистрации
Обратите внимание на то, что в поле для ввода пароля не отображаются символы, которые вы набираете, вместо этого появляются звездочки. Что же происходит, когда пользователь нажимает клавишу GO?
Рассмотрим подробнее формат элемента
В этом элементе определено два параметра. Первый, Посмотрим, как это работает. Введите какие-либо данные и нажмите кнопку GO. Вы увидите нечто похожее на Рисунок 4. Рисунок 4. Вывод данных, введенных в форму
В том случае, если вы не ввели данные, но нажали кнопку, форма будет работать также, поскольку у нас пока еще не налажен прием введенных данных. Обратите внимание на URL, который появился в поле адреса браузера.
Заметьте, что каждому элементу формы в URL соответствует пара имя-значение и эти пары разделены амперсандами.
Такой вид URL обусловлен тем, что мы использовали в качестве метода передачи
Рассмотрим, каким образом данные, введенные в HTML-форму, можно сделать доступными в принимающей PHP-странице. Внесите следующие изменения в файл registration_action.php:
Значения переменных будут теперь выбираться по имени из массива Рисунок 5. Введенные данные отображаются в браузере
Вы можете извлечь любую часть переданной информации по имени, но есть и другие возможности работы с массивами.
В PHP можно организовывать массивы данных, то есть списки значений, это позволяет легко перемещать одновременно целые группы данных. Например, создадим массив из трех элементов и передадим его для вывода на страницу:
Функция Результат работы этого скрипта будет такой:
Заметьте, что первое значение в массиве имеет индекс,
равный 0, но не 1. Заметьте также, что мы выделяем нужное значение,
добавив индекс в квадратных скобках к имени массива. Подобным же
образом мы получали доступ к значениям переменной формы. Переменная В тот момент, когда вы отсылаете свою форму, вы по существу дела создаете ассоциативный массив:
Именно этот факт позволяет вам впоследствии выделить отдельные значения, например,
Получение информации о массиве Ассоциативные массивы крайне полезны при передаче данных между формами, но при их использовании может возникнуть трудность, далеко не всегда известна структура массива. Такая ситуация может быть, например, если ассоциативный массив был получен в результате выполнения запроса к базе данных. В PHP есть две функции, которые облегчают использование таких массивов:
Функции Рисунок 6. Извлечение данных из массива с использованием числовых индексов
Этот способ работы с массивами также имеет неудобства. Например, вы можете не знать, сколько всего элементов в ассоциированном массиве. В PHP существуют и другие способы обращения с ассоциированными массивами. Следующим шагом мы рассмотрим два таких способа.
Задача последовательный обработки некоторого числа однотипных значений возникает очень часто. Для ее выполнения применяется такая конструкция как цикл. Вот один из примеров цикла:
Результат его работы будет следующим:
Рассмотрим синтаксис выражения Поскольку у нас есть возможность узнать, сколько всего значений содержит массив
Функция Рисунок 7. Использование функции sizeof для остановки цикла
Для работы с ассоциированным массивом
Ассоциированные
массивы настолько часто используются в PHP, что для работы с ними была
создана специальная конструкция, которая позволяет получать доступ к
данным, минуя ключи. Вместо этого вы можете использовать цикл
На первом шаге цикла будет извлечено первое значение из массива
Эта конструкция позволяет извлекать не только значения элементов ассоциированного массива, но и ключи:
Такой вариант кода приведет нас к результату, который мы уже видели выше: Рисунок 8. Исходный вариант вывода
Повторяющиеся значения в формах Иногда
возникает ситуация, когда в форме должно быть введено несколько
значений для переменной с одним и тем же именем. Примером может служить
поле пароля
Заметьте, что имя поля
При этом в процессе обработки будет создан массив:
В этом варианте для просмотра значения пароля вы должны обращаться к соответствующей переменной как к массиву с числовым индексом:
Если вы отошлете форму (не забудьте обновить страницу), то можете заметить некоторые изменения, как показано ниже на Рисунке 9. Рисунок 9. Новый вариант вывода
Обратите внимание, в поле, где раньше отображался пароль, появилось слово
До сих пор для передачи данных из формы мы использовали метод Согласно принятым стандартам технологии Web-программирования, метод Тот факт, что метод Поэтому в большинстве случаев имеет смысл пользоваться методом
Внешне использование метода
При отсылке формы вы увидите, что содержание URL-адреса изменилось:
Изменения нужны и в файле registration_action.php, для приема данных вместо массива
Дальнейшая работа с массивом
Контроль данных: условный оператор if-then Выше мы попросили пользователя ввести пароль дважды. Теперь посмотрим, как можно проверить, не было ли сделано ошибки при вводе пароля. Для этого используем условный оператор if-then:
В заголовке условного оператора в скобках помещено некоторое выражение (в нашем примере это
Обратите внимание на то, что мы написали Ниже, на Рисунке 10, показана страница, которую увидит пользователь в том случае, если он сделал ошибку при вводе пароля. Рисунок 10. Предупреждение об ошибке при вводе пароля
Для формирования более сложных логических выражений можно применять логические операторы, например, оператор И
(
Значение логического выражения в скобках будет истина (TRUE) в том случае, если сегодня понедельник (Monday) И этот день не является праздничным.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Функции Когда вы разрабатываете значительную по размеру программу, то в ней, как правило, есть сегменты кода, которые выполняются несколько раз. Кроме того, выделение фрагментов, отвечающих за определенные действия, делает программу более прозрачной, ее будет легче читать и модифицировать. Именно для этих целей и служат функции. Например, вы можете выделить проверку пароля в отдельную функцию:
Когда сервер будет обрабатывать эту страницу и дойдет до ключевого слова Рисунок 11. Выполнение цикла foreach
Для того чтобы использовать функцию, ее надо вызвать.
Вызов функции состоит из указания ее имени, следом за которым должна идти пара круглых скобок. В том случае, если функция принимает какие-либо параметры, их помещают в скобках через запятую, например:
Когда PHP выполняет эту страницу, то описание функции пропускается, выполняется цикл Рисунок 12. Выполнение функции checkPasswords() после цикла foreach
Если у вас есть опыт программирования на других языках, то вы могли заметить, что это больше похоже на работу процедуры, а не функции, поскольку произошли некоторые действия, а главным признаком функции является то, что она возвращает некоторое значение. В PHP функции используются в обоих этих ролях.
Кроме задачи выполнения некоторого сегмента кода, функции могут возвращать некоторые значения. Например, создадим функцию полной проверки правильности ввода данных таким образом, чтобы она возвращала одно значение в случае успеха и другое при наличии ошибок:
В качестве аргумента функция будет принимать массив
Итак, мы написали функцию, которая проверяет данные и возвращает некоторое значение. Посмотрим теперь, как можно использовать это значение:
В условном операторе if-then одновременно вызывается функция Рисунок 13. Вывод сообщения об ошибке
Сделаем два замечания. Во-первых, мы надеемся, что вы оценили удобство использования функции, которая позволяет свести всю проверку к одной легко читаемой строке вместо сложной конструкции из нескольких операторов if-then. Во-вторых, заметьте, что использование функции здесь не оптимально, она вызывается дважды с одними и теми же параметрами. В большой программе это может привести к существенному снижению продуктивности, правильнее было бы вызвать функцию один раз и присвоить возвращаемое значение некоторой переменной. Теперь наши данные готовы для записи их в базу данных.
|
||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Взаимодействие с базой данных MySQL Сначала выполним необходимые подготовительные действия непосредственно в MySQL. Мы должны создать базу данных, добавить в нее таблицу и создать нового пользователя, который будет иметь доступ к базе. Находясь в консоли MySQL, наберите следующие команды:
Итак, мы создали базу данных, добавили в нее таблицу
Наконец, создадим пользователя
Теперь мы можем перейти к использованию базы с PHP.
Соединение с базой данных MySQL Практически невозможно создать серьезное Web-приложение без обращения к той или иной базе данных. В нашем учебном приложении мы будем использовать базу данных MySQL для хранения имени пользователя и пароля. В этом разделе мы научимся соединяться с базой данных, принимать данные со страницы регистрации, проверять, уникально ли переданное имя пользователя и добавлять данные в базу, также вы увидите, каким образом можно вывести на страницу информацию из базы данных. Начнем с установки соединения. В PHP существует ряд функций, предназначенных для работы с MySQL, в этом разделе мы рассмотрим некоторые их них. Прежде всего, введем функцию, которая будет устанавливать соединение с базой данных, которую мы только что создали:
Итак, у нас теперь есть функция Вы могли заметить, что наша функция пытается открыть соединение с базой на локальной машине, об этом говорит параметр Если установить соединение с базой не удалось, то процесс останавливается (для этого служит опция dies) и PHP выводит текстовое сообщение об ошибке. Если все пошло успешно, то соединение с базой будет оставаться открытым до тех пор, пока вы не закроете его, или до того, когда будет закрыта страница. Все остальные команды обращения к базе данных будут ссылаться на это соединение. Последний выделенный оператор и есть, собственно, вызов нашей функции.
Поскольку один сервер может поддерживать несколько баз данных, то следующим шагом после открытия соединения нужно выбрать, с какой именно базой данных мы будем работать:
Функцию выбора базы данных можно использовать повторно для выбора другой базы того же сервера. Следует заметить, что наши дальнейшие действия будут в известном смысле независимы от выбранной базы. Написанная нами только что функция будет единственным местом, где нужно будет внести изменения, если потребуется работать с другой базой. Теперь мы готовы к тому, чтобы добавить данные в нашу базу.
Для того чтобы вставить запись в таблицу базы данных, нужно сначала написать соответствующий SQL-запрос, а затем выполнить его. Запрос будет иметь следующую форму:
Вы могли заметить, что в этом запросе использованы не все поля таблицы
Обратите внимание на то, что функция, которая выполняет запрос, Если возникли какие-либо проблемы, MySQL передаст сообщение об ошибке в функцию Посмотрим теперь, как извлекается информация из базы данных.
Итак, мы умеем записывать наши данные в базу. Но как мы можем узнать, уникально ли предложенное имя пользователя? Посмотрим, как можно проверить имя, прежде чем добавлять данные:
Первый SQL-запрос выбирает из базы все записи, у которых значение поля Поскольку мы хотим вставлять только уникальные имена, то для нас желательным значением переменной Что произойдет, если совпадающее значение будет найдено и переменная
Безусловно, в реальных условиях никому не придет в голову в подобной ситуации показать все записи таблицы. Мы выведем данные только в качестве тренировки, чтобы вы посмотрели, как это делается. Выше мы создали и выполнили SQL-запрос, который выбирает все записи из таблицы
Итак, для извлечения данных из переменной Да, но такой способ позволяет работать только с одной строкой таблицы. Каким образом получить доступ ко всем данным?
Просмотр результатов: цикл Если в результате выполнения запроса была выбрана хотя бы одна строка, то логическое значение переменной
Цикл будет продолжаться до тех пор, пока остаются строки для обработки. После того как обработана последняя строка, функция Будьте
внимательны. Если вы пропустите последний шаг в цикле, то есть не
извлечете следующую строку, то значение условного выражения всегда
будет истинным и ваш цикл станет бесконечным. Хорошим правилом при
написании циклов
Закрыть соединение с базой данных Прежде чем двигаться дальше, закроем соединение с нашей базой данных:
Теперь настало время навести порядок в структуре наших файлов.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Наведем порядок: включение кода из файлов Зачем нужно включение кода из файлов? До сих пор весь код нашего скрипта хранился в одном PHP-файле. В этом разделе мы перераспределим его по нескольким файлам и изучим операторы включения. Причина появления такого механизма, как включение, в том, что некоторые сегменты кода используются на многих страницах, и выделение их в отдельный файл помогает избежать дублирования и упростить сопровождение кода. В PHP существует два оператора включения файлов. Один из них используется для включения обычной информации, например, заголовков или сообщений, а другой -- для критической, например, для включения функций, вызываемых из Web-страницы.
Начнем работу с создания файла, который будет впоследствии использоваться в операторе включения. Как бы ни выглядела ваша Web-страница, у нее должен быть заголовок и нижний колонтитул, в которых содержатся элементы навигации. Мы поместим заголовок в отдельный файл и затем будем включать его в большое число страниц, все они будут выглядеть однотипно. Если мы захотим внести изменения во внешний вид наших страниц, то нам надо будет сделать это только один раз. Для начала создадим файл с именем top.txt и включим в него следующий текст:
Во второй файл, который мы назовем bottom.txt, добавьте следующие строки:
Сохраните файлы в том же каталоге, где уже находится файл registration.php.
Теперь включим созданные нам файлы в страницу регистрации. Внесите в файл registration.php следующие изменения:
Мы убрали текст, с которого начинается и которым заканчивается обычно HTML-страница и добавили два оператора
Обновите страницу регистрации в браузере и вы увидите, что ее внешний вид сильно переменился, новый вариант показан на Рисунке 14. Рисунок 14. Новый вид регистрационной страницы
Если вы нажмете клавишу просмотра исходного кода страницы в своем браузере, то увидите, что в нем объединены все три файла:
Внесите такие же изменения в файл registration_action.php и отошлите данные регистрации, ваша вторая страница будет иметь новый внешний вид, сходный с первой. Конечно, нашу страницу нельзя назвать произведением искусства, но она работает. Позже, когда вы найдете дизайнера и придумаете как сделать ее красивее, вам придется внести все изменения только один раз, во включаемые файлы, и внешний вид всех ваших страниц изменится как по волшебству.
Если
PHP не может найти файла заголовка или нижнего колонтитула, то это
плохо, но не катастрофично, приложение все равно будет работать. Если
отсутствует файл, указанный в операторе Однако в некоторых случаях отсутствие включаемого файла является катастрофой. Например, мы могли решить, что полезно поместить описание функций
В целом оператор
Предупреждение возникновения дубликатов. Нет никаких препятствий к тому, чтобы включаемый файл сам содержал в себе оператор
Когда PHP встречает операторы
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Подведем итоги В этом пособии мы начали знакомство с языком программирования PHP с создания простого Web-приложения. Вы изучили основы синтаксиса PHP-скриптов, узнали как можно передавать данные при помощи HTML-форм, познакомились с такими базовыми понятиями как переменная, условный оператор и цикл. Мы определили понятие массива данных, рассмотрели ассоциативные массивы и массивы с числовыми индексами, способы доступа к данным массивов. Вы научились просматривать и отсылать данные в базу данных MySQL при помощи формирования и выполнения SQL-запросов, узнали каким образом можно обработать строку данных из таблицы базы. Наконец, мы рассмотрели операторы включения файлов, которые позволяют оптимизировать структуру Web-приложения. Цель этой серии учебных пособий -- научить вас создавать с помощью PHP приложения, поддерживающие workflow. В первой части серии мы начали процесс с создания страницы, на которой пользователь вводит новую учетную запись, мы проверяем ее и помещаем в базу данных. В следующей части этой серии мы научимся использовать процедуру HTTP-аутентификации и загрузку документов с сервера, рассмотрим использование формата XML и другие вопросы, которые помогут вам в освоении программирования на PHP.
|
|||||||||||||||||||||||||||||
Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных |
Получить продукты и технологии
Обсудить
|
||||||||||||||||||||||
Изучаем PHP, Часть 2: Загрузка файлов на сервер и использование XML для хранения информации о файлах |
|
Уровень сложности: средний Тайлер Андерсон, Независимый автор, Stexar Corp. 16.01.2007
Из этого учебного пособия, вы узнаете, как использовать PHP для создания простейшего приложения, поддерживающего workflow. Это пособие поможет вам, если вы знакомы с основами программирования на языке PHP и хотите узнать о процедуре загрузки файла из браузера, сессиях и использовании PHP для работы с XML. Требуемый опыт Базовые знания по PHP, на которые мы опираемся в этом учебном пособии, включают умение работать с такими структурами как условные операторы и циклы, HTML-формы и базы данных. Все эти темы обсуждались в Части 1 этой серии. Знакомство с форматом XML желательно, но не обязательно. Системные требования Вам необходимо иметь Web-сервер, PHP и базу данных. Если у вас есть доступ к сети, в которой установлен сервер PHP V5 с доступом к базе данных MySQL, то вы можете им воспользоваться. В противном случае загрузите и установите следующие пакеты:
Форматы html, pdf
IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия. |
|
||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Уровень сложности: средний Тайлер Андерсон, инженер, Stexar Corp. 15.01.2007 Из этого учебного пособия, второго из трех в серии "Изучаем PHP", вы узнаете, как использовать PHP для создания простейшего приложения, поддерживающего workflow. Это пособие поможет вам, если вы знакомы с основами программирования на языке PHP и хотите узнать о процедуре загрузки файла из браузера, сессиях и использовании PHP для работы с XML. Прежде чем начать Цель этого учебного пособия -- научить вас писать на языке PHP приложения, поддерживающие workflow. В первой части серии "Изучаем PHP, Часть 1" рассматриваются основы синтаксиса PHP, работа с HTML-формами и взаимодействие с базами данных. Учебное приложение, разработанное в первой части, обеспечивает возможность ввести новую учетную запись, проверить и сохранить ее в базе данных. Во второй части мы двинемся дальше, рассмотрим процедуру загрузки файлов на сервер из браузера и использование XML для хранения и отображения информации о файлах. Изучаем PHP, Часть 3 касается вопросов HTTP-аутентификации и защиты файлов путем потоковой передачи их из каталогов, закрытых для непосредственного доступа. В последней части мы изучим также создание объектов и исключения. В этом пособии рассматриваются следующие темы:
Для кого написано это пособие? Это учебное пособие является второй частью в серии из трех пособий, описывающих создание с помощью PHP приложения, поддерживающего workflow. Мы предполагаем, что у читателя есть базовые знания по PHP и желание научиться загружать файлы на сервер из браузера и использовать PHP для работы с XML. Базовые знания по PHP, на которые мы опираемся в этом учебном пособии, включают умение работать с такими структурами как условные операторы и циклы, HTML-формы и базы данных. Все эти темы обсуждались в Части 1 этой серии. Знакомство с форматом XML желательно, но не обязательно. (Дополнительную информацию по темам этого пособия можно найти в разделе Ресурсы.)
Вам необходимо иметь Web-сервер, PHP и базу данных. Если у вас есть доступ к сети, в которой установлен сервер PHP V5 с доступом к базе данных MySQL, то вы можете им воспользоваться. В противном случае загрузите и установите следующие пакеты: Web-сервер -- Вне зависимости от того, работаете ли вы под Windows®, Linux® или Mac OS X, вы имеете возможность использовать Apache Web-сервер. Вы можете работать с версиями Apache V1.3 или 2.0, но примеры в этом пособии ориентированы на версию V2.0. Загрузить Web-сервер можно со страницы Apache. Если вы работаете под Windows, вы можете также использовать Internet Information Services, встроенный в Windows Web-сервер. PHP -- Вам необходим дистрибутив PHP. Во время написания этого пособия в ходу были версии PHP V4 и V5, в своих примерах мы ориентировались на V5. Различия в версиях PHP несущественны для этой части пособия, но в последней части они станут заметны. Загрузить дистрибутив можно со страницы PHP. База данных -- Одной из тем этого учебника является получение доступа к базе данных. Соответственно, вам нужна та или иная база данных. Мы разбираем доступ к базе MySQL, поскольку именно эта база данных как правило используется вместе с PHP. Загрузите базу данных со страницы MySQL.
|
|||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Работа с сессиями Процесс регистрации в системе, Часть 1 В Части 1 этой серии мы разработали простую систему регистрации пользователей и на этом примере научились отсылать информацию с помощью HTML-форм и взаимодействовать с базой данных. Результаты этой работы можно найти в разделе Ресурсы. Мы пропустили только один момент, мы не создали страницу, при помощи которой пользователь может зарегистрироваться. Давайте сделаем это сейчас, заодно кратко повторим вопросы, разобранные в Части 1. Создайте новый файл с именем login.php и сохрание его в том же каталоге, что и registration.php. Добавьте в него следующий код:
Ввод данных пользователем и отправку HTML-формы мы обсуждали выше, вы помните, конечно, что PHP создает массив Рисунок 1.Страница регистрации с элементами интерфейса
Процесс регистрации в системе, Часть 2 Создайте еще один новый файл с именем login_action.php. Добавьте в него следующий код:
После того как в начало файла с помощью оператора
Итак, мы попросили пользователя зарегистрироваться, мы знаем его по имени и можем использовать эту информацию на нашей странице. Но что нам это дает? Как только пользователь закроет страницу, информация будет потеряна. Для того чтобы иметь возможность передавать данные, в том числе данные аутентификации, между страницами, используется механизм сессий. Прежде чем использовать сессию, ее надо создать. Для создания сессий используется функция При работе с функцией Итак, добавим создание сессии в самое начало файла login_action.php:
Теперь мы должны указать, какие именно данные будут передаваться от страницы к странице в рамках сессии, в нашем случае это будут имя пользователя и его E-mail адрес:
Так же как и Если
вы используете версию PHP V4.3.2 или старше, то у вас может появиться
предупреждение, касающееся области применения переменной
Перезапустите ваш Web-сервер, для того чтобы актуализировать изменения конфигурации.
Добавим операцию открытия сессии
Когда PHP
встретит эту функцию, то будет выполнено подключение к сессии, если она
уже открыта или создана новая сессия. Теперь мы будем иметь доступ к
зарегистрированным переменным сессии на других страницах, например,
значение
Обратите внимание на то, что при проверке мы используем не только переменную Рисунок 2.Страница login_action.php, переменная $username уже определена
Переменные сессии могут быть очищены двумя способами, Во-первых, можно просто уничтожить те или иные переменные индивидуально, и, во-вторых, можно закрыть сессию в целом. Создайте новый файл с именем logout.php и поместите в него следующий код:
Если запустить эту страницу на исполнение в браузере, то значения переменных будут очищены, как можно видеть ниже на Рисунке 3. Рисунок 3. Страница после очистки данных
Более простым способом очистки переменных является явное закрытие сессии:
Обратите внимание на то, что мы сначала выполнили функцию
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Загрузка файлов При помощи HTML-форм вы можете не только пересылать текстовую информацию, но и загружать целые документы, то есть дать возможность пользователю добавлять в систему файлы различных форматов. Загрузка файла включает в себя следующие этапы:
Начнем работу с создания HTML-формы.
Форма для загрузки файлов подобна формам для ввода нового пользователя и регистрации в системе, но здесь появляются два новых момента. Создадим новый файл для загрузки uploadfile.php и поместим в него следующий код:
Заметьте, у формы появился атрибут Атрибут Рисунок 4. Выбор файла для загрузки
Обратите внимание, в наш файл,
Информация о загружаемом файле Когда вы загружаете файл из браузера, PHP получает массив Пользователь может выбрать для загрузки несколько файлов. Если файлы имеют различные имена, то для каждого будет создан свой элемент массива. В Части 1
нашего пособия мы уже сталкивались с ситуацией, когда элемент массива
сам является массивом. В нашем примере в каждом элементе массива
Опираясь на эту информацию, вы можете организовать контроль, прежде чем загружать файл.
Прежде чем пытаться записать файл на постоянное место хранения, надо убедиться, что файл действительно был загружен. Для этого создадим страницу uploadfile_action.php и добавим в нее следующий текст:
Теперь перейдем к сохранению файла.
Прежде чем начать сохранять загруженный файл, вы должны определить, в какой каталог вы его поместите. До тех пор, пока не сделаны все проверки, доступ к файлу с Web-страниц должен быть закрыт, поэтому надо поместить его в каталог, отличный от основного каталога для документов нашего Web-сервера. Создадим каталог /var/www/hidden/. Поскольку все временные файлы будут размещены в этом каталоге, то разумно будет определить константу с именем каталога. Добавьте строку с определением в файл scripts.txt:
Поскольку файл scripts.txt включается в страницу, отвечающую за загрузку файла, мы можем использовать определенную выше константу:
Первым шагом мы задаем две переменные, временное имя файла вместе с путем (на основе На
втором шаге использован условный оператор, в котором мы делаем сразу
две вещи. Во-первых, при помощи специальной функции мы проверяем, что
временный файл, который мы планируем перемещать, действительно был
загружен на сервер, что пользователь не пытается нас обмануть,
предлагая загрузить в общедоступный каталог системный файл, например
/etc/passwd. Если функция Если же проверка пройдет успешно, PHP попытается переместить файл на новое место при помощи функции Если же обе проверки прошли успешно, то будет выведено сообщение о том, что файл успешно загружен, как можно видеть ниже на Рисунке 5. Рисунок 5. Сообщение об успешной загрузке
Теперь, когда у нас в распоряжении есть файл, нам нужно еще записать информацию о нем для извлечения данных в дальнейшем.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Использование XML: DOM В наше время программисты почти во всех областях так или иначе сталкиваются с языком разметки XML. К счастью, разобраться в нем несложно. Вы уже имели дело с близким родственником XML, языком разметки HTML. Посмотрим внимательнее на страницу в формате HTML V4.01:
Эта страница имеет много общего с XML. Прежде всего, она состоит из элементов, таких как Но XML подходит к разметке документа строже, чем HTML. Документ в формате XML должен быть синтаксически корректным (well-formed), это означает в частности, что всякий открывающий тег
(такой как В этом разделе мы создадим XML-файл, в котором будет храниться информация о загружаемом документе.
Как будет храниться информация В следующих двух разделах мы будем работать с XML-файлом, содержащим информацию о загруженных пользователями документах. В этом файле будет записано имя каждого документа, его статус, имя пользователя, загрузившего документ, и другая информация. В этот же файл мы включим статистическую информацию о загрузке документов. Структура нашего XML-файла будет следующая:
Мы добавили
здесь переходы на новую строку и отступы для того, чтобы сделать
структуру файла более наглядной, XML этого не требует. Каждому
документу будет соответствовать элемент Для работы с этим файлом мы будем использовать механизм DOM (Document Object Model -- Объектная модель документа).
В основе технологии DOM (Document Object Model -- Объектная модель
документа) лежит представление XML-файла в форме иерархического дерева.
Рассмотрим объектную модель элемента
Каждый объект XML-документа является узлом (нодой) того или иного типа, например,
Узлы в DOM могут быть связаны между собой отношениями родитель/потомок. Например, элемент Существуют различные программные интерфейсы (API) для работы с DOM-объектами. Ранние версии PHP включали в себя работу с DOM-структурами, но они не полностью соответствовали стандартам (DOM является стандартом W3C). В PHP версии V5 включен новый набор средств работы с DOM, который в большей мере соответствует стандарту. Мы будем использовать новый API для создания и модификации нашего XML-файла.
В Части 3 нашей серии мы будем подробно говорить об объектах и объектно-ориентированном подходе в PHP, но обе технологи, которым будет посвящен следующий раздел, DOM API и SAX API, используют понятие объекта. Для того чтобы двигаться дальше, нам надо понять, что такое объект, и как с ним работать. Для наших текущих целей достаточно думать об объекте просто как о наборе функций, рассмотрим это на примере. Создадим класс, он будет шаблоном для создания объектов в будущем:
Для того чтобы работать с объектом определенного типа, нужно сначала создать новый объект этого типа, затем можно ссылаться на функции, или методы, данного объекта:
Итак, мы создали объект Это все, что вам необходимо знать об объектах, для того чтобы двигаться дальше.
Подготовка к сохранению информации Теперь
мы готовы к тому, чтобы начать создание XML-файла, в котором будет
сохраняться информация о загруженных файлах. Для записи этой информации
мы создадим специальную функцию,
Поскольку мы вызываем функцию Теперь перейдем к созданию самой функции.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Функции Сначала создадим DOM-объект типа
Для создания объекта типа
Итак, у нас есть объект типа
Итак, мы вызываем функцию создания нового узла типа "элемент" для объекта Давайте посмотрим, что произойдет, если мы выполним эту функцию и запишем документ в файл.
Одним из удобств использования PHP для работы с файлами в формате XML является простота записи содержимого объекта типа
Константа
Первая строка -- это просто декларация, сообщающая о том, что файл будет в формате XML, она стандартна. Вторая строка содержит наш элемент, но поскольку мы не добавили в него ни потомков, ни атрибутов, то элемент записан как пустой. Давайте добавим содержательную информацию.
Итак, добавим в наш файл реальное содержание. На прошлом шаге мы уже создали файл docinfo.xml. Если мы дадим такую же команду записи, то файл будет перезаписан, но пока нас это устраивает, поскольку мы не закончили работу со структурой элемента. Прежде всего, добавим новый элемент
Мы начали с того, что создали новый элемент, принадлежащий объекту Вызовем для объекта типа
Обратите внимание на два момента, во-первых, элемент Добавим в нашу структуру и другие элементы.
Создание элементов для хранения информации о файлах Теперь мы подошли к моменту, когда пора добавить в XML-файл реальную информацию о загружаемом документе. Будем добавлять элемент за элементом, используя ту технику, которую мы изучили выше:
В приведенном
выше фрагменте очень много кода, но нет практически ничего нового.
Сначала мы создаем переменные для хранения переданной нам в вызове
функции информации о документе. Затем создаем элемент Элемент Таким же образом создаются и другие элементы-потомки узла Результатом работы этого кода будет следующий файл (для наглядности в него добавлены отступы):
Теперь, когда в наш XML-файл записана реальная информация, мы не хотим затирать его при каждой следующей записи. Рассмотрим, как можно дописать информацию в уже существующий файл.
Дополнение существующего файла Мы планируем использовать один и тот же файл для записи информации о всех загружаемых документах. Сначала проверим, существует ли уже тот файл, в который мы хотим вести запись, затем будем действовать соответственно:
Сначала
создаем переменную с именем файла, используя константу, затем проверяем
существует ли уже такой файл. Если он существует, то для открытия
документа используем функцию Функция Итак, у нас есть объект Далее, добавим новый элемент
Но элемент
Мы
не только можем дописывать новые строки в созданный ранее файл, но и
получать доступ к его элементам. В нашем случае нужно исправить
значение атрибута
Сначала мы создадим переменную, которая будет ссылаться на элемент Результат изменений вы можете видеть ниже, на этот раз пробелы не были добавлены:
Итак, мы научились создавать XML-файл с помощью DOM, рассмотрим теперь другой API, SAX, который предназначен для чтения информации из файлов в формате XML.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Использование XML: SAX В предыдущем разделе мы рассматривали технологию DOM, которая трактует XML-файл как совокупность объектов, организованных в иерархическое дерево. Соответствующий программный интерфейс был объектно-ориентированным API. В этом разделе мы рассматриваем SAX (Simple API for XML -- Простой API для XML), он является событийно-ориентированным API. Мы будем использовать этот API для отображения информации о файлах для конкретного пользователя. В SAX используется обработчик содержания (content handler) который отслеживает поток событий. Рассмотрим для примера следующий XML-документ:
При разборе этого документа обработчик содержания SAX обнаружит следующие события:
Для каждого события, зафиксированного обработчиком, вы можете написать свою функцию обработки, которая будет выполняться при возникновении этого события.
Создание обработчика содержания Итак, создадим обработчик содержания.
Для обработчика мы будем использовать класс с именем
Пока наш обработчик выполняет очень простые действия, по сути дела, просто сообщает, что он работает. Теперь мы должны передать парсеру XML информацию о том, где находится наш обработчик.
В процессе разбора XML-файла PHP должен знать, какое действие надо выполнить при том или ином событии.
Добавьте в файл scripts.txt функцию
Рассмотрим эту функцию. Сначала в ней создается новый объект типа Затем
мы должны указать парсеру, какие именно фукции должны вызываться при
том или ином событии. Поскольку в данном API имена таких функций
произвольны, вы должны явно указать их, используя функцию
Заметим, что функцию
В последней строке мы устанавливаем для опции парсера
Итак, мы подготовились к разбору файла, для того чтобы начать, надо сделать еще две вещи.
Во-первых, мы должны добавить разбор файла в нашу функцию
Обратите внимание, что мы использовали определенную ранее константу Если файл успешно открыт, мы начинаем его разбор, передавая парсеру порции по 4,096 байтов. Цикл продолжается до тех пор, пока не будет достигнут конец файла. Во-вторых, нам следует вызвать функцию
Теперь посмотрим, как это работает.
Итак,
допустим, что мы загрузили документ, PHP сохранит наш файл и добавит
информацию о документе в файл docinfo.xml, затем будет вызван парсер
(попутно будет создан объект
Это именно та информация, которую мы хотели получить, но форма ее представления крайне неудобна. Давайте займемся организаций приемлемого внешнего вида нашей страницы.
Мы научились вызывать обработчик содержания и получать от него данные, давайте тепреь подумаем, каким должен быть внешний вид полученной информации. Хотелось бы иметь вывод в табличной форме, давайте возьмем за образец форму, которую можно видеть на Рисунке 6. Рисунок 6. Вывод информации в табличной форме
Посмотрим на исходный код HTML-страницы:
Просмотрев исходный код страницы и обратив внимание на комментарии, мы понимаем, что надо делать.
В
некоторых языках есть специальные функции, которые позволяют
обрабатывать начало и конец документа, но в PHP это не так просто.
Можно написать специальный обработчик для этих событий, но мы поступим
иначе. Будем рассматривать в качестве начала и конца документа начало и
конец элемента
Когда парсер встречает событие Наша функция, встретив имя элемента Рисунок 7. Отображение заголовков
Отобразить информацию о каждом загруженном файле, оказывается, значительно сложнее.
Специфической
особенность работы событийно-ориентированного API является тот факт,
что в каждый момент времени парсер имеет информацию только о последнем
событии. Когда мы имеем дело с DOM, то можем перемещаться по дереву
событий вверх и вниз, используя SAX мы движемся с потоком событий и
вернуться назад не можем, поэтому мы должны сохранять всю необходимую
нам информацию о прошедших событиях, если хотим ею воспользоваться.
Допустим, мы встретили элемент
Встретив элемент Если значение атрибута Если информация будет отображаться, то нам нужны и сами значения атрибутов, запишем их в переменные
Но нам нужно сохранять не только значения атрибутов, но и текстовые элементы.
Итак, часть информации о загруженном документе хранится в атрибутах элемента
Посмотрим, что изменилось. Во-первых, мы создали переменную
Имя текущего элемента используется функцией
Когда мы дойдем до конца элемента
Итак, функция В результате работы нашей программы мы получим таблицу, приведенную на Рисунке 8. Рисунок 8. Итоговая таблица информации о файлах
В части 3 мы займемся улучшениями этой таблицы, добавим в нее ссылки и другую информацию и расширим функциональность.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Подведем итоги В этой части пособия мы начали создавать наиболее существенную часть приложения workflow, теперь у наших пользователей есть возможность загружать файлы на сервер из браузера. Мы познакомились с понятием сессии, благодаря использованию сессий пользователи регистрируются один раз и затем имеют доступ ко всем страницам системы. Мы научились сохранять файлы на сервере и создавать XML-файлы для хранения информации о загруженных файлах. Перечислим темы, которые вошли в эту часть пособия:
Перейдем к Части 3, в которой мы завершим работу над нашим учебным приложением.
|
|||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Получить продукты и технологии
Обсудить
|
||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
|
||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть 2. Загрузка файлов на сервер и использование XML для хранения информации о файлах |
Выскажите мнение об этом учебном пособии IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия. |
|||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Уровень сложности: средний Никлас Чейз, Независимый автор, Backstop Media 16.01.2007 Из этого учебного пособия, последнего из трех в серии "Изучаем PHP", вы узнаете, как использовать PHP для создания простейшего приложения, поддерживающего workflow. В этой части рассматривается HTTP-аутентификация, доступ к документам посредством обработки потоков данных, создание объектов и обработка исключений. Прежде чем начать В этой, заключительной части учебного пособия мы закончим разработку учебного приложения, поддерживающего workflow, с которым мы работали в предыдущих двух частях. Мы добавим HTTP-аутентификацию, потоковое перемещение документов из каталогов, закрытых для доступа из сети, задействуем обработку исключений. Мы введем понятие объекта и изменим структуру нашего приложения, включив некоторые его части как объекты. Кроме того, мы добавим для администратора системы возможность одобрять загруженные простыми пользователями документы и делать их общедоступными. Вот полный перечень стоящих перед нами задач:
Для кого написано это пособие? Это учебное пособие является заключительной частью в серии из трех пособий, описывающих создание с помощью PHP приложения, поддерживающего workflow. Мы предполагаем, что у читателя есть базовые знания по PHP и желание познакомиться с более сложными темами, такими как объектно-ориентированное программирование, HTTP-аутентификация, обработка потоков данных, классы, объекты, описание и обработка исключений, дополнительные возможности для работы с форматом XML. Базовые знания по PHP, на которые мы опираемся в этом учебном пособии, включают знание синтаксиса, умение работать с такими структурами как HTML-формы и базы данных, знакомство с форматом файлов XML. Все эти темы обсуждались в Части 1 и Части 2 этой серии. Дополнительную информацию по теме этого пособия можно найти в разделе Ресурсы.
Вам необходимо иметь Web-сервер, PHP и базу данных. Если у вас есть доступ к сети, в которой установлен сервер PHP V5 с доступом к базе данных MySQL, то вы можете им воспользоваться. В противном случае загрузите и установите следующие пакеты: HTTP-сервер -- Вне зависимости от того, работаете ли вы под Windows®, Linux®, UNIX® или Mac OS X, вы имеете возможность использовать Apache HTTP-сервер. Можно использовать различные версии, но примеры HTTP-аутентификации в этой части пособия ориентированны на версии Apache V2.X. Загрузить HTTP-сервер можно со страницы Apache. Если вы работаете под Windows®, вы можете также использовать Windows® IIS. PHP -- Вам необходим дистрибутив PHP. Во время написания этого пособия в ходу были версии PHP V4 и V5, но в примерах этой части используются новые возможности версии V5. Загрузить дистрибутив можно со страницы PHP. База данных -- одной из тем этого учебника является получение доступа к базе данных. Соответственно, вам нужна та или иная база данных. Мы разбираем доступ к базе MySQL, поскольку именно эта база данных как правило используется вместе с PHP. Загрузите базу данных со страницы http://dev.mysql.com/downloads/index.html.
|
|||||||||||||||||||||||||||||||||||||
Изучаем PHP, Часть3: Аутентификация, работа с потоками данных, объекты и исключения |
|
Уровень сложности: средний Никлас Чейз, Независимый автор, Backstop Media 16.01.2007
Из этого учебного пособия, последнего из трех в серии "Изучаем PHP", вы узнаете, как использовать PHP для создания простейшего приложения, поддерживающего workflow. В этой части рассматривается HTTP-аутентификация, доступ к документам посредством обработки потоков данных, создание объектов и обработка исключений. В этом учебном пособии Это учебное пособие адресовано тем, кто имеет базовые знания по PHP и желает познакомиться с более сложными темами, такими как объектно-ориентированное программирование, HTTP-аутентификация, обработка потоков данных, классы, объекты, описание и обработка исключений, дополнительные возможности для работы с форматом XML. Требуемый опыт Базовые знания по PHP, на которые мы опираемся в этом учебном пособии, включают знание синтаксиса, умение работать с такими структурами как HTML-формы и базы данных, знакомство с форматом файлов XML. Убедитесь, что вы ознакомились с Частью 1 и Частью 2 этой серии. Системные требования Вам необходимо иметь Web-сервер, PHP и базу данных. Если у вас есть доступ к сети, в которой установлен сервер PHP V5 с доступом к базе данных MySQL, то вы можете им воспользоваться. В противном случае загрузите и установите следующие пакеты:
Форматы html, pdf
IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия. |
|
||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Определим наши задачи и средства В двух первых частях этого пособия мы изучали язык PHP в процессе разработки простого приложения, поддерживающего workflow. Наше приложение дает пользователям возможность зарегистрироваться в системе, загрузить файлы на сервер и просмотреть загруженные файлы, а также и те файлы, которые были одобрены администратором системы. Итак, нами уже разработаны:
К концу второй части мы создали несложное, но работоспособное приложение, вы можете загрузить его тексты из "Изучаем PHP, Часть 2."
В заключительной части пособия мы планируем решить следующие задачи:
Начнем с создания общей стартовой страницы для нашей системы..
До сих пор мы разрабатывали отдельные части нашей системы, теперь давайте сведем все воедино. Начнем с создания стартовой страницы, которая будет служить "посадочной полосой" для наших посетителей. Создайте файл с именем index.php и добавьте в него следующий код:
Первый оператор Сохраните этот файл в том же каталоге, где хранятся созданные вами ранее файлы. Например, вы можете сохранить его в головном каталоге для документов вашего сервера, если вы при запуске HTTP-сервера укажете адрес http://localhost/index.php, то увидите страницу, подобную приведенной ниже на Рисунке 1. Внешний
вид это страницы незамысловат. Кроме того, если бы мы показали реальную
страницу, то список фалов был бы пуст, поскольку, с одной стороны,
пользователь еще не зарегистрирован и мы не можем видеть его
собственных файлов, с другой стороны, у нас нет пока процедуры
одобрения файлов и не должно быть файлов, одобренных администратором.
Мы видим файлы потому, что искусственно приписали им признак Рисунок 1. Базовая стартовая страница
На стартовой странице мы видим ссылки Register и Login, поскольку пользователь еще не зарегистрировался в системе. В следующем разделе мы разберем новый подход к процессу регистрации.
|
|||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Использование HTTP-аутентификации До
сих пор для регистрации в нашей системе пользователи вводили свой логин
и пароль в HTML-форму и отсылали данные. Далее происходил контроль
имени пользователя и пароля с использованием базы данных MySQL, если
проверка проходила успешно, то для пользователя создавалась сессия на
сервере и его имя записывалось в массив Эта процедура годилась для целей обучения, но в реальных системах такой подход может вызвать проблемы. Если наше приложение, поддерживающее workflow, является частью большой системы, то пользователь, возможно, уже прошел процедуру регистрации. С другой стороны, если пользователь зарегистрировался в нашей системе, то мы должны сохранить эту информацию для того, чтобы ему не пришлось заново вводить данные при входе в другие приложения. Системы, в которых пользователь вводит пароль один раз, называются Single Sign-On (Системы однократной регистрации). Чтобы обеспечить однократную регистрацию, переложим функции контроля процесса входа в систему на HTTP-сервер. Получив запрос от браузера, сервер проверит, включает ли он имя пользователя и пароль, если не включает, то сервер выведет окно для их ввода. После того как пользователь введет подходящие регистрационные данные, они будут передаваться вместе с последующими запросами до тех пор, пока браузер не будет закрыт. Прежде всего, мы должны включить возможность HTTP-аутентификации на нашем сервере.
Следует иметь в виду, что настройка механизма аутентификации существенно зависит от сервера. В этом разделе мы будем рассматривать настройку аутентификации для сервера Apache 2.X, если вы используете другой сервер, то обратитесь за указаниями к документации. Если у вас возникнут трудности с настройкой HTTP-сервера, то вы можете просто пропустить этот раздел, наша система будет корректно работать и со старым типом аутентификации. Для того чтобы система HTTP-аутентификации могла работать, должно быть известно, какой уровень безопасности установлен для того или иного каталога. Установить права доступа для конкретного каталога можно, сделав соответствующие изменения в главном конфигурационном файле сервера. Есть и другой путь, можно использовать файл .htaccess, который содержит инструкции для того каталога, в котором он размещен. Рассмотрим пример. Допустим, вы хотите, чтобы к вашим документам имели доступ только те пользователи, которые прошли регистрацию. В том каталоге, в котором вы храните свои файлы, создайте специальный подкаталог loggedin. Если основной каталог /usr/local/apache2/htdocs, то надо создать каталог /usr/local/apache2/htdocs/loggedin. Теперь мы должны сообщить серверу, что мы хотим ввести для этого каталога особые правила доступа, для этого в файл httpd.conf добавим следующие строки:
Разумеется, вы должны указать головной каталог в соответствии с настройками своего сервера.
Следующим шагом надо создать текстовый файл с именем .htaccess в каталоге loggedin и добавить в него следующие строки:
Рассмотрим, что означают эти строки. За ключевым словом Перезапустите свой HTTP-сервер, для того чтобы актуализировать изменения в настройке. (Для Apache V2.0 надо выполнить последовательно команды Теперь осталось создать файл с регистрационными данными.
Создание файла с регистрационными данными Итак, нам нужен файл, содержащий данные, к которым сервер будет обращаться для проверки логина и пароля. Ниже, в разделе Добавление новых пользователей, мы рассмотрим работу с этим файлом посредством PHP, пока же создадим и заполним файл .htpasswd непосредственно. Сначала надо выбрать каталог, в котором будет храниться наш файл. Доступ извне к этому каталогу, естественно, должен быть закрыт. Но это должен быть такой каталог, с которым можно работать из PHP, иначе мы не сможем управлять ситуацией. Этим требованиям, например, удовлетворяют подкаталоги каталога apache2. Если вы выберете другой каталог, то внесите соответствующие изменения в файл .htaccess. Для того чтобы создать файл с логином и паролем, выполните команду (подставив свой каталог и имя пользователя):
Вы получите приглашения на ввод пароля и повтор пароля:
Параметр команды
Заметьте, что пароль зашифрован. Следует иметь это в виду при добавлении данных из приложения. Теперь посмотрим, как это работает.
Чтобы увидеть, как это работает, нам надо иметь доступ к файлу в защищенном каталоге. Переместите файлы uploadfile.php и uploadfile_action.php в каталог loggedin, а файл index.php скопируйте туда же с именем display_files.php. Во всех трех файлах надо внести изменения в операторах
Откройте свой браузер, указав адрес http://localhost/loggedin/display_files.php, чтобы увидеть, как это работает. В момент вызова браузера имя пользователя и пароль не заданы, поэтому на экране появится окно для регистрации, которое можно видеть ниже, на Рисунке 2. Рисунок 2. Окно для регистрации
Если вы введете имя и пароль, которые вы задали выше, то увидите привычную страницу.
Использование регистрационных данных Итак,
мы видим привычную страницу, как на Рисунке 3, в верхней части которой
есть сообщение о том, что пользователь зарегистрирован, и выведено имя
пользователя. Однако прочее содержание страницы выглядит так, как если
бы регистрация не произошла. Мы видим ссылки Register и Login, список файлов содержит только те, которые были уже одобрены администратором, но не содержат файлов, загруженных пользователем Рисунок 3. Пользователь зарегистрирован... почти
Проблема возникает потому, что имя пользователя хранится в элементе массива Другой путь состоит в том, чтобы в начале сессии задать переменную
Теперь единственный способ заставить браузер забыть имя пользователя –- это закрыть его. Однако, это не всегда удобно. Поэтому следует добавить к нашей системе опцию выхода, logout. (В рамках нашего пособия мы не будем разбирать процедуру выхода из системы, просто добавим опцию для полноты картины.) Если имя пользователя не определено ни в массиве Рисунок 4. Пользователь зарегистрирован
Прежде чем двигаться дальше, внесем небольшие изменения в файл top.txt. Заменим ссылку опции Login вместо старой страницы регистрации, login.php, используем новый файл, display_files.php, предназначенный для HTTP-аутентификации:
Итак, мы изменили ссылку для входа в систему и добавили новую опцию для отображения списка файлов. Кроме того, мы закомментировали ссылку на выход из системы, поскольку эта тема выходит за рамки нашего пособия. Осталось только изменить процедуру регистрации нового пользователя.
Добавление новых пользователей Итак, мы должны связать процедуру регистрации нового пользователя с файлом .htpasswd. Запись нового пользователя в файл надо сделать после того, как учетная запись включена в базу данных. Откройте файл registration_action.php и добавьте в него строки:
Прежде чем вносить изменения, убедитесь, что у вас все в порядке с правами доступа. Если файл уже существует, то пользователь должен иметь право записи в него на вашем Web-сервере. Если файла нет, то должно быть право записи в соответствующий каталог. Перед тем как открыть файл, мы проверили, существует ли он. Если файла нет, то мы открываем новый файл, а если он существует –- продолжаем добавлять строки в старый. Как вы могли видеть
выше, пароли хранятся в шифрованном виде, поэтому прежде чем записать
строку с паролем в файл, мы должны зашифровать его, для этого
используется функция Проверьте, все ли в порядке. Для этого закройте браузер (имя пользователя и пароль будут очищены) и затем попробуйте открыть его с адресом http://localhost/index.php. Нажмите ссылку Register и создайте новую учетную запись. Затем снова закройте браузер и попробуйте открыть защищенную страницу. Новый логин и пароль должны работать.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Потоки данных Теперь мы готовы к тому, чтобы дать нашим пользователям возможность загружать файлы с сервера. С самого начала мы сохраняли эти файлы в каталоге, к которому нет прямого доступа из внешней сети, поэтому ссылки на эти файлы сами по себе работать не будут. В этом разделе мы напишем специальную функцию, которая будет передавать наши файлы из скрытых каталогов на сервере браузеру при помощи потоков данных. Способ доступа к файлам может быть различен в зависимости от того, каким образом они были сохранены. Доступ к файлу на локальном сервере отличается от доступа к удаленным ресурсам посредством HTTP или FTP. Для обеспечения прозрачности доступа к файлам многие языки программирования, в том числе и PHP, имеют специальные оболочки потоков данных. Вместо того чтобы прямо пытаться открыть файл, вы обращаетесь к программе-оболочке, которая знает, каким способом можно получить к нему доступ. Чтобы обратиться к оболочке, надо, прежде всего, знать, какие оболочки доступны в вашей системе. В PHP есть функция
Функция
Таким образом, у вас есть простой путь сохранения файлов на удаленном Web-сервере и на FTP-сервере, при этом способ сохранения ничем не будет отличаться от способа сохранения файлов на локальном сервере, и весь код этого раздела будет работать. Единственное отличие будет в имени вызываемой оболочки.
Для того чтобы пользователи могли загрузить файл с сервера, сервер прежде должен получить этот файл. Кроме самого файла, требуется еще и информация о нем, для того чтобы браузер мог корректно отображать этот файл. Для решения обеих этих задач создадим новый файл с именем download_file.php и поместим его в каталог loggedin. Добавьте в этот файл следующий код:
Легко понять,
что именно происходит в этом фрагменте кода. Сначала мы открываем файл
для чтения и буферизации. По сути дела, функция Эту
строку мы можем передать браузеру, но при этом могут возникнуть
проблемы. Поскольку браузер не знает, в какой форме отобразить
переданные данные, то он будет отображать их просто как текст. Хорошо,
если файл был текстовый, а что если это была картинка или сложный
HTML-файл? Поэтому, прежде чем передавать содержимое файла, мы
передадим браузеру заголовок Наконец, мы передаем содержимое файла браузеру для вывода. Поскольку браузер уже получил заголовок, то он знает, как следует обработать переданный файл. Для того чтобы посмотреть как это работает, просто добавьте имя и тип файла к адресу URL:
Откройте браузер с таким адресом (подберите вместо timeone.jpg подходящую картинку из своих запасов) и вы увидите результат, наподобие Рисунка 5. Рисунок 5. Загрузка файла
Поскольку
вся информация, необходимая для страницы загрузки, может быть добавлена
в URL, достаточно добавить ссылки в список файлов, чтобы пользователи
могли их загружать. При выводе на экран списка файлов, доступных для
загрузки, мы использовали технологию SAX, то есть наш экранный вывод
создавался при помощи обработчика содержания, точнее, класса с именем
Во-первых, к той информации, которую мы собираем о каждом элементе Используя функцию Рисунок 6.Ссылки на файлы
Попробуйте нажать на ссылку и проверить, работает ли она. Теперь давайте выделим наш процесс в самодостаточную конструкцию, а именно, создадим объект.
|
||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Использование объектов Итак, в этом разделе мы вплотную подошли к понятию объекта. Все, что мы делали до сих пор, было процедурным программированием. Вызывались функции, переменные передавались в них как параметры, отдельные действия были объединены в довольно объемную программу, которая выполнялась от начала до конца. Теперь мы постараемся уйти от этого. Центральной концепцией объектно-ориентированного программирования является объединение свойств и функций некоторого предмета в самодостаточную конструкцию, которая и называется объектом. Рассмотрим в качестве примера электрический чайник. Он имеет свойства, такие как цвет и максимальная температура, и функции, а именно, нагревание воды и отключение при закипании. Если мы захотим описать чайник как объект, то должны определить его свойства или переменные (пусть цвет будет представлен переменной Приблизим
эту концепцию к нашим задачам, а именно, создадим объект, который будет
представлять загружаемый файл. У него будут такие свойства как имя и
тип файла, и методы, например, Надеемся, что вы сориентировались в объектно-ориентированном подходе, а сейчас нам предстоит подняться еще на один уровень абстракции. Дело в том, что для формального описания свойств и функций используется не объект, а класс объектов. Класс работает как образец или форма для создания объектов определенного типа. Об объектах говорят как об экземплярах данного класса. Итак, перед нами стоит задача создать описание нашего объекта, создать класс.
Для того чтобы работать с объектами, необходимо создать класс, содержащий описание переменных и методов. Мы могли бы поместить определение нашего класса в файл scripts.txt file, но, поскольку мы поставили перед собой задачу улучшить структуру нашего приложения, мы поместим его в отдельный файл, WFDocument.php, и запишем этот файл в основной каталог. Добавьте в этот файл следующий код:
Поскольку нам необходима константа Теперь мы готовы создать экземпляр класса, объект.
Создание объекта типа WFDocument В Части 2 этой серии мы уже занимались созданием объектов определенного класса, когда работали с DOM, но тогда мы не стали давать объяснений по этому поводу. Разберем теперь этот процесс подробнее. Откройте файл download_file.php и внесите следующие изменения:
Во-первых, мы
заменили включаемый файл, вместо файла со скриптами мы включаем файл
WFDocument.php, в котором содержится описание класса Затем создается новый объект типа Получив ссылку на объект, мы можем вызывать его публичные методы, в нашем случае есть только один метод, Сохраните файл и проверьте, как он работает, выбрав одну из ссылок на нашей странице. Результат будет точно такой же, каким был ранее, разница состоит не в действиях, а в способе вызова.
Методы
представляют собой только одну сторону объекта. Главная идея объекта
состоит в том, что он содержит в себе всю информацию о себе самом. Для
того чтобы наш объект был полноценным, он должен включать в себя в
качестве свойств имя и тип файл, а не получать их как параметры метода
Обратите
внимание на то, что мы объявили переменные вне функции, они являются
частью класса, а не функции. Кроме того, мы объявили эти переменные с
ключевым словом Для
того чтобы обращаться к свойству объекта, надо знать, какому объекту
свойство принадлежит. Если обращение происходит извне, то мы указываем
имя объекта, а если изнутри, то можно использовать ключевое слово Теперь разберем вопрос, как приписать значения свойствам объекта.
Итак, вместо того чтобы передавать значения в качестве параметров, мы хотим определить их как свойства самого объекта. Для это внесем следующие изменения:
Итак,
для того чтобы присвоить значение свойству объекта, мы создаем этот
объект и затем ссылаемся на его свойство, используя его имя, Существует и другой способ определения свойств объекта, мы рассмотрим его ниже.
Задать значения свойств класса напрямую вполне возможно, но это не лучший метод. Для повышения безопасности и упрощения модификации кода свойства принято скрывать внутри класса (такая техника известна как инкапсуляция). Для присваивания значений скрытым от публики свойствам будут использованы специальные функции, getters и setters, давайте рассмотрим пример такого подхода:
Прежде всего, мы снабдили наши свойства модификатором Использование специальных функций для определения и извлечения значений удобно еще и тем, что дает больший контроль над данными. Вы можете, например, организовать проверку данных, прежде чем приписать их значения свойствам объекта.
После того как мы сделали свои свойства скрытыми, нам необходимо внести изменения в файл download_file.php:
Теперь мы, наконец, вплотную подошли к стандартному способу задания свойств, к использованию конструктора.
Фактически, когда мы создаем новый объект любого класса, то вызываем его базовый конструктор. Но мы можем написать и свой конструктор, который будет вызываться каждый раз при создании нового экземпляра нашего класса. Для начала создадим совсем простой конструктор:
Если
вы запустите этот скрипт, то результат будет не слишком хороший, это
можно видеть на Рисунке 7. Ошибка возникла потому, что скрипт пытается
вывести на экран текст (Creating new
WFDocument) до того, как выведен заголовок страницы, Рисунок 7. Ошибка при запуске скрипта
Мы видим, что наш конструктор отработал, хотя мы явно и не вызывали метод
Присваивание значений при создании объекта Конструкторы используются чаще всего именно для задания начальных значений свойств объекта. Добавим в наш класс
Когда
создается новый объект, PHP прежде всего смотрит, определен ли для него
конструктор, и выполняет инструкции, содержащиеся в конструкторе, если
он определен. В нашем случае инструкции состоят в том, чтобы присвоить
свойствам нового объекта значения переменных Но как вызывается функция
Создание объекта: вызов конструктора Нет
необходимости вызывать конструктор непосредственно, поскольку он неявно
вызывается при создании любого нового объекта. Таким образом, именно в
момент создания нового экземпляра класса
Любая информация, переданная в момент создания экземпляра класса, попадает в конструктор. Таким способом мы создаем новый объект, который содержит все необходимые данные для загрузки файла.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Обработка исключений Обработка исключений в программах происходит тогда, когда что-то идет не по плану, поэтому исключения иногда путают с ошибками. Однако, исключения представляют собой гораздо белее тонкий механизм, чем просто реакция на ошибочные ситуации. В этом разделе мы рассмотрим различные типы исключений и научимся использовать их в нашем приложении. Начнем с самых простых исключений, точнее, с использования встроенного в PHP класса исключений
Прежде всего заметим, что исключения не происходят сами по себе, они генерируются (или возбуждаются). Для генерации исключения используется ключевое слово Исключение
обладает известным набором свойств, среди них номер строки и имя файла,
в которых сгенерировано исключение, и сообщение. Как правило, текст
сообщения задается при генерации исключения, как вы могли видеть выше.
Для получения сообщения в блоке обработки исключения используется метод
Рисунок 8. Результат обработки базового исключения
Реальная мощь механизма исключений проявляется тогда, когда вы используете свои собственные исключения.
Создание пользовательских исключений В предыдущем разделе при изучении объектов мы отложили в сторону одно очень важное понятие, связанное с объектами, наследование. Давайте вернемся к этому сейчас. Важнейшим
преимуществом использования классов является возможность создать новый
класс на базе уже существующего. В этом случае говорят, что новый класс
является расширением или потомком старого. Давайте создадим новый класс исключений,
(Для простоты мы включили код нового класса в файл WFDocument.php, но он может быть расположен и в другом месте.) Итак, описание нового класса, Например, вы могли заметить, что внутри функции Теперь перейдем к обработке исключений.
Обработка пользовательских исключений Генерация пользовательского исключения ничем не отличается от генерации базового:
Обратите внимание на то, что при генерации исключения мы передали только переменную Рисунок 9. Пользовательское исключение
Обработка нескольких исключений Пользовательские
классы исключений нужны для того, чтобы иметь возможность точнее
распознавать ошибочную ситуацию. Часто в одном фрагменте кода
генерируется несколько видов исключений, тогда мы будем иметь один блок
В этом примере мы сначала проверяем наличие файла, если файла нет, то возбуждаем исключение Возможно, вам
показалось, что генерация и обработка исключений -- слишком громоздкий
механизм для вывода сообщений об ошибочных ситуациях, но никто не
говорит, что обработчик может только вывести сообщение. Блок У исключений есть еще одно удобное
свойство. Вы можете определить большое число исключений, но вы не
обязаны для каждого из них писать отдельный блок
Способность
исключений распространяться тесно связана с механизмом наследования
классов. Дело в том, что всякий объект, который является экземпляром
класса-потомка, может трактоваться также и как экземпляр базового
класса. Например, вы можете сгенерировать исключение
Если возбуждено исключение, то PHP двигается вниз по списку блоков Рисунок 10 Распространение исключений
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Обработка исключений Обработка исключений в программах происходит тогда, когда что-то идет не по плану, поэтому исключения иногда путают с ошибками. Однако, исключения представляют собой гораздо белее тонкий механизм, чем просто реакция на ошибочные ситуации. В этом разделе мы рассмотрим различные типы исключений и научимся использовать их в нашем приложении. Начнем с самых простых исключений, точнее, с использования встроенного в PHP класса исключений
Прежде всего заметим, что исключения не происходят сами по себе, они генерируются (или возбуждаются). Для генерации исключения используется ключевое слово Исключение
обладает известным набором свойств, среди них номер строки и имя файла,
в которых сгенерировано исключение, и сообщение. Как правило, текст
сообщения задается при генерации исключения, как вы могли видеть выше.
Для получения сообщения в блоке обработки исключения используется метод
Рисунок 8. Результат обработки базового исключения
Реальная мощь механизма исключений проявляется тогда, когда вы используете свои собственные исключения.
Создание пользовательских исключений В предыдущем разделе при изучении объектов мы отложили в сторону одно очень важное понятие, связанное с объектами, наследование. Давайте вернемся к этому сейчас. Важнейшим
преимуществом использования классов является возможность создать новый
класс на базе уже существующего. В этом случае говорят, что новый класс
является расширением или потомком старого. Давайте создадим новый класс исключений,
(Для простоты мы включили код нового класса в файл WFDocument.php, но он может быть расположен и в другом месте.) Итак, описание нового класса, Например, вы могли заметить, что внутри функции Теперь перейдем к обработке исключений.
Обработка пользовательских исключений Генерация пользовательского исключения ничем не отличается от генерации базового:
Обратите внимание на то, что при генерации исключения мы передали только переменную Рисунок 9. Пользовательское исключение
Обработка нескольких исключений Пользовательские
классы исключений нужны для того, чтобы иметь возможность точнее
распознавать ошибочную ситуацию. Часто в одном фрагменте кода
генерируется несколько видов исключений, тогда мы будем иметь один блок
В этом примере мы сначала проверяем наличие файла, если файла нет, то возбуждаем исключение Возможно, вам
показалось, что генерация и обработка исключений -- слишком громоздкий
механизм для вывода сообщений об ошибочных ситуациях, но никто не
говорит, что обработчик может только вывести сообщение. Блок У исключений есть еще одно удобное
свойство. Вы можете определить большое число исключений, но вы не
обязаны для каждого из них писать отдельный блок
Способность
исключений распространяться тесно связана с механизмом наследования
классов. Дело в том, что всякий объект, который является экземпляром
класса-потомка, может трактоваться также и как экземпляр базового
класса. Например, вы можете сгенерировать исключение
Если возбуждено исключение, то PHP двигается вниз по списку блоков Рисунок 10 Распространение исключений
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Собираем все вместе Итак, мы завершили подготовительные операции, теперь осталось только собрать все вместе и придать нашему приложению законченный вид. В этом разделе перед нами стоят следующие задачи:
Начнем с создания класса
В уникальном идентификаторе документа до сих пор не было необходимости, конкретный файл выбирался только при загрузке файлов с сервера, но тогда достаточно было явно указать его имя. Теперь нам придется подумать об идентификации документов, поскольку в процедуре одобрения администратором системы файлов, загруженных пользователями, нужен простой способ ссылаться на конкретный документ. Для этого мы создадим новый класс,
У этого класса есть один метод, Теперь мы готовы добавить ключевое поле в XML-файл.
Как вы помните, в
"Изучаем PHP, Часть 2" мы создали XML-файл с информацией о загруженных на сервер документах. Теперь мы хотим добавить к элементу
При загрузке нового документа на сервер и записи информации о нем в XML-файл будет создан новый объект типа В результате в XML-файл будет записана следующая информация (для наглядности в текст добавлены пробелы):
Внесенное нами изменение будет работать только для вновь загружаемых файлов, поэтому вам придется либо добавить атрибут Теперь нам нужно выделить среди наших пользователей администраторов системы, которые будут одобрять файлы для публичного доступа.
Когда мы создавали таблицу пользователей в базе данных, то не приняли во внимание тот факт, что нам потребуется в дальнейшем разделять пользователей по их функциям в системе. Давайте позаботимся об этом. Зарегистрируйтесь в MySQL и выполните следующие команды:
Первая команда добавляет новое поле, Теперь напишем функцию, которая возвращает статус текущего пользователя:
Имя текущего пользователя мы берем из массива Если в результате запроса была получена строка данных (в нашем случае может быть только одна строка), то переменной Поместите эту функцию в файл scripts.txt, чтобы она была доступна при работе со списком файлов.
Процедура одобрения файлов: форма Сделаем
дополнения в нашу форму. Если текущий пользователь является
администратором системы, ему надо дать возможность изменить статус
документа. Для этого внесем следующие изменения в класс
Итак, мы определили два новых свойства: Форма, которая была открыта при обнаружении парсером начала документа, закрывается при обнаружении конца элемента checkbox выводится в последнем столбце таблицы для тех документов, статус которых Результат нашей работы с дополнительной кнопкой и checkbox'ами можно видеть ниже на Рисунке 11. Рисунок 11. Форма для одобрения файлов
Итак, мы добавили в наш XML-файл атрибут
Вместо того чтобы создавать документ прямо как экземпляр класса Если вы удалите старый файл docinfo.xml и загрузите на сервер новый документ, то в файле docinfo.xml появится следующая информация:
Теперь мы должны создать файл схемы workflow.dtd.
Описание технологии работы со схемами для формата XML-выходит за рамки данного пособия, мы ограничимся тем, что просто создадим файл DTD, в котором будет определена структура файла docinfo.xml. Итак, откройте новый файл с именем workflow.dtd и сохраните его в том же каталоге, что и docinfo.xml. Добавьте в него следующий текст:
Строки файла DTD содержат описание элементов нашего документа и содержимое каждого элемента. Элемент Сам элемент Следующим идет описание элемента
Процедура одобрения файлов: запись данных в XML-файл Страница для обработки значений из checkbox, approve_action.php, на которую ссылается наша форма, будет очень простой:
Для каждого checkbox'а просто вызывается функция
Прежде чем загрузить документ, мы устанавливаем значения свойства И, наконец, нам нужна ссылка на элемент-потомок Последним оператором мы сохраняем наш XML-файл. Обратите внимание, мы открывали и сохраняли XML-файл отдельно для каждого документа, в промышленных приложениях так не делают. Эффективнее было бы открыть файл один раз, внести в него все изменения и затем сохранить файл.
В качестве последнего шага, для обеспечения безопасности, включим проверку адреса, с которого пришел запрос на загрузку файла. Поскольку загрузка происходит посредством специального приложения, мы можем включить в него такие проверки, какие считаем нужными. В качестве примера рассмотрим ограничение допуска к загрузке, позволяющее загружать файлы только с локального сервера. Таким образом, наш контроль должен отсечь все запросы из внешних страниц, ссылку на файл с закладок или прямую отсылку строки с адресом. Организуем контроль путем создания нового исключения. Добавим код в файл WFDocument.php:
Первым шагом мы определяем новое исключение, Далее мы начинаем обрабатывать переменную Нас интересует имя сервера, с которого пришел запрос, поэтому мы отрезаем название протокола в начале адреса "http://" и сохраняем текст до первого символа "/". Полученная строка и будет содержать имя сервера. Если
запрос был внешний, то он имя сервера будет иметь вид, подобный
boxersrevenge.nicholaschase.com. Но мы пропускаем запросы только для
сервера с именем Следует заметить, что предложенный метод нельзя считать окончательным решением, поскольку некоторые браузеры не поддерживают пересылку обратного адреса URL запроса. Пересылка адреса, кроме того, может быть подавлена пользователем. Мы рассмотрели эту процедуру как пример подхода к обеспечению безопасности системы и контроля содержания общедоступного ресурса.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Подведем итоги В этой, заключительной части учебного пособия, мы закончили разработку приложения, поддерживающего workflow, с которым мы работали в предыдущих двух частях серии "Изучам PHP". Две первых части были посвящены базовым темам, таким как синтаксис, работа с формами, доступ к базам данных, загрузка файлов и XML. В этой части мы собрали наши разработки в одну форму, которая позволяет администратору выполнить процедуру одобрения документов, а простому пользователю загрузить файл. Вот перечень тем, которые рассматривались в этой части:
|
|||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Получить продукты и технологии
Обсудить
|
||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
|
||||||||||||||||||||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Выскажите мнение об этом учебном пособии IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия. |
|||||||||||||||||
Изучаем PHP: Часть3. Аутентификация, работа с потоками данных, объекты и исключения |
Выскажите мнение об этом учебном пособии IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия. |
|||||||||||||||||