Глава 2. Возможности PHP3

Содержание:

HTTP-аутификация средствами PHP

HTTP аутификация в PHP доступна только при использовании модуля Apache. В модуле Apache PHP-скрипт, может использовать функцию Header() для отправки сообщения "Authentication Required" браузеру клиента, вызвав тем самым окно диалога Username/Password. Как только пользователь заполняет поля username и password, URL содержащий PHP-скрипт будет вызван заново с переменными $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE содержащими введенную информацию. В данном случае обеспечивается только "Основная" аутификация.

Фрагмент примера сценария, который производит аутентификацию клиента на странице, должен быть следующим:

Пример 2-1. Пример HTTP аутификации <?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "Text to send if user hits Cancel button\n"; exit; } else { echo "Hello $PHP_AUTH_USER.<P>"; echo "You entered $PHP_AUTH_PW as your password.<P>"; } ?>

Вместо просто распечатывания $PHP_AUTH_USER и $PHP_AUTH_PW, Вы вероятно хотели бы проверить имя_пользователя и пароль для проверки правильности. Возможно, посылая запрос к базе данных, или, ища пользователя в dbm файле.

Будьте внимательны при использовании браузера Internet Explorer. Он весьма придирчив к порядку заголовков. Отправка заголовка WWW-Authenticate перед заголовком HTTP/1.0 401 возможно даст аутификацию в любом случае.

Чтобы предотвратить от записи кем - то сценарий , который определяет пароль для страницы, которая была опознана через традиционный внешний механизм, PHP_AUTH переменные не будут установлены, если допускается внешнее установление подлинности для той специфической страницы. В этом случае может быть использована переменная $REMOTE_USER чтобы идентифицировать внешне-опознанного пользователя.

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

И Netscape и Internet Explorer очистит локальный кэш окна аутификации после получения ответа сервера 401. Это эффективно как мера отключения пользователей("log out"), вынуждающая их повторно ввести их username и пароль. Некоторые используют это для отключения пользователя по истечении интервала времени("time out"), или обеспечивают кнопку "Log Out".

Эти методы не требуются в соответствии с Основным стандартом аутификации HTTP , так что Вы никогда не должны зависеть от этого. Тестирование с Lynx показало, что Lynx не очищает информацию аутификации с 401 ответом сервера, так что переход обратно и затем вперед снова откроет ресурс (пока требования удостоверения личности не изменились).

Также обратите внимание, что это не работает при использовании сервера Microsoft's IIS и CGI версии PHP из-за ограничений IIS.

Создание GIF-файлов с помощью PHP

PHP не ограничен созданием только HTML вывода. Он может также использоваться для создания файлов GIF, или даже более удобные потоки изображений GIF. Для этого вам надо скомпилировать PHP с библиотекой функций изображения - GD .

Пример 2-2. Создание GIF-файлов с помощью PHP <?php Header("Content-type: image/gif"); $string=implode($argv," "); $im = imagecreatefromgif("images/button1.gif"); $orange = ImageColorAllocate($im, 220, 210, 60); $px = (imagesx($im)-7.5*strlen($string))/2; ImageString($im,3,$px,9,$string,$orange); ImageGif($im); ImageDestroy($im); ?>

Этот пример вызывается со страницы тегом: <img src="button.php3?text"> Вышеупомянутый скрипт button.php3 берет строку "text", накладывает сверху на основное изображение, которым в этом случае является " images/button1.gif " и выводит возникающее в результате изображение. Это - очень удобный способ не рисовать новые изображения кнопки, каждый раз, когда вы хотите изменить текст кнопки. Этим методом они будут динамически сгенерированы.

Поддержка file upload

PHP может принимать файлы, загруженные из любого браузера, отвечающего стандартам RFC-1867 (которыми являются, например, Netscape Navigator 3 или cтарше, Microsoft Internet Explorer 3 с исправлениями от Microsoft, или cтарше). Эта возможность позволяет людям загружать файлы. С PHP-аутификацией и функциями манипулирования файлами, вы имеете полный контроль над тем, кому позволять загружать файлы и что должно быть выполнено с файлом, если он был загружен.

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

Пример 2-3. Форма загрузки файла <FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"> Send this file: <INPUT NAME="userfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Send File"> </FORM> _URL_ должен указать на php html файл. Cкрытое поле MAX_FILE_SIZE должно предшествовать полю ввода файла и означает максимально допустимый размер файла. Значение определяется в байтах. Для этого файла при успешной загрузке будут определены следующие переменные : $userfile - Временное имя файла под которым загруженный файл загружается в машину сервера. $userfile_name - Исходное имя файла в системе отправителя. $userfile_size - Размер загруженного файла в байтах. $userfile_type - Тип MIME файла, если броузер предоставил эту информацию. Например может быть "image/gif". Обратите внимание, что компонент вышеупомянутых переменных "$userfile" - это любое значение поля Name тега INPUT c TYPE=file обозначенное в форме загрузки. В приведенном выше примере формы загрузки мы назвали его "userfile".

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

Скрипт PHP, который получает загруженный файл, должен определить, что должно быть выполнено с загруженным файлом. Вы можете, например, использовать переменную $file_size, чтобы отбросить любые файлы, которые являются или слишком маленькими или слишком большими. Вы могли бы использовать переменную $file_type, чтобы отбросить любые файлы, которые не соответствуют некоторым критериям типа. В любом случае, вы должны или удалить файл из временного каталога или переместить эго в другое место.
Файл будет удален из временного каталога в конце запроса, если он не перемещен или переименован.

Пожалуйста обратите внимание, что вебсервер CERN httpd, кажется, удаляет все начинающееся с первого пробела в заголовке content-type mime, полученном от клиента. Пока дело обстоит так, CERN httpd не будет поддерживать возможность загрузки файла.

Поддержка HTTP cookie

PHP поддерживает HTTP cookies. Cookies - механизм для сохранения данных в удаленном браузере и, таким образом, - трэкинг или идентификация пользователей. Вы можете устанавливать файлы cookie используя функцию setcookie(). Cookies - часть HTTP заголовка, так что функция SetCookie() должна вызваться прежде чем браузеру послан какая-нибудь информация для вывода. Это - то же самое ограничение, которое касается и функции Header().

Любой cookie, посланный Вам от клиента будет автоматически превращен в переменную PHP точно так же как данные методов GET и POST. Если вы желаете назначить множественные значения одиночному cookie - просто добавьте [] к имени cookie. Для более подробной информации см. функцию setcookie ().

Поддержка баз данных

PHP поддерживает ряд различных баз данных, и в режиме работы в собственной системе команд и через ODBC, включая:

Adabas D MySQL dBase Oracle Empress PostgreSQL FilePro Solid Informix Sybase InterBase Velocis mSQL Unix dbm

Регулярные выражения

Регулярные выражения используются для сложного манипулирования строками в PHP. Функции, которые поддерживают регулярные выражения: ereg() ereg_replace() eregi() eregi_replace() split()

Все эти функции принимают строку регулярного выражения как их первый параметр. PHP использует расширенные регулярные выражения POSIX как определено в POSIX 1003.2. Для полного описания регулярных выражений POSIX см. соответствующие разделы руководства (regex), в каталоге regex дистрибутива PHP.

Example 2-4. Пример регулярных выражений ereg("abc",$string); /* Возвращает 'истина', если "abc" найдено в строке $string. */ ereg("^abc",$string); /* Возвращает 'истина', если "abc" найдено в начале строки $string. */ ereg("abc$",$string); /* Возвращает 'истина', если "abc" найдено в конце строки $string. */ eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT); /* Возвращает 'истина', если браузер клиента - Netscape 2, 3 или MSIE 3. */ ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string,$regs); /* Помещает три слова - $regs[1], $regs[2] и $regs[3], разделенные пробелом. */ ereg_replace("^","<BR>",$string); /* Устанавливает тег <BR> в начало строки $string. */ ereg_replace("$","<BR>",$string); /* Устанавливает тег <BR> в конец строки $string. */ ereg_replace("\n","",$string); /* Отсекает символ "возврат каретки" в строке $string. */

Обработка ошибок

В PHP есть 4 типа ошибок и предупреждений. Это: 1 - Нормальные Ошибки Функции(Normal Function Errors) 2 - Нормальные Предупреждения(Normal Warnings) 4 - Ошибки Синтаксического Анализатора(Parser Errors) 8 - Уведомления(Notices) : предупреждения, которые Вы можете проигнорировать но, которые могут подразумевать баги в вашем коде Эти 4 типа комбинируются при определении ошибки, сообщая уровень. Ошибка по умолчанию, возвращает уровень 7, который является комбинацией 1 + 2 + 4, или все ошибки за исключением примечаний. Этот уровень может быть изменен в файле php3. ini директивой error_reporting. Он также может быть установлен в вашем файле Apache httpd.conf директивой php3_error_reporting, или же это может быть произведено во времени выполнения сценария, с использованием функции error_reporting ().

Все выражения PHP могут также вызываться с префиксом "@", который выключает сообщение об ошибке, специфичное для этого выражения. Если ошибка произошла во время выполнения такого выражения, и допускается возможность track_errors, Вы можете найти сообщения об ошибках в глобальной переменной $php_errormsg.

PHP source viewer