Change text into child window.");
id.document.write("");
id.document.write("");
id.document.write("
Type conversion sample
Жорий кун ва вақт
echo "
Салом, бу мен – PHP скрипт!
";
?>
Салом, бу мен – PHP скрипт!
<Н1> Cookie нинг қийматини ўқиш
Cookie нинг қиймати:
if (isset ($_COOKIE ['message']))
{
echo Cookie нинг қиймати:' . $_COOKIE ['message' ] ;
}
else
{
echo 'Cookie ўрнатилмаган' ;
}
?>
Cookie массивларда ҳам ташкил этилган бўлиши мумкин. Масалан қуйида
учта cookie ўрнатилган:
setcookie ("cookie[one]" , "Бугун");
setcookie ("cookie[two] ", "Ҳаёт");
setcookie ("cookie[three] ", "гўзал!") ;
Натижада $_COOKIE['cookie'] массив қийматлари қуйидаги тарзда
босмага чиқарилиши мумкин:
116
if (isset ($_COOKIE ['cookie'])) {
foreach ($_COOKIE'['cookie'] as $data)
{
echo "$data
";
cookie нинг амал қилиш муддати
Помимо простой установки значении cookie, функция setcookie может
установить и срок его действия. Срок действия задает временной интервал, в
течение которого cookie будет сохраняться на компьютере пользователя.
Если срок действия не задан, то cookie будет удален после завершения сеанса
работы (то есть после закрытия текущего окна браузера и всех окон,
открытых из него).
Срок действия определяется третьим аргументом функции setcookie:
bool setcookie (string name [, string value [, int expire [, string path [, string
domain [, bool secure]]]]])
Параметр expire задает время, когда cookie должен быть удален с
компьютера клиента. Время задается в стиле
Unix и представляет собой
количество секунд, прошедших с 1 января 1070 года (эта дата традиционно
считается началом эпохи Unix). Для формирования значения expire можно
воспользоваться функцией time, которая возвращает текущее время в стиле
Unix. Например, если cookie должен быть удален через час после его
установки, параметр expire может быть задан как t ime () + 3 600:
Внешний вид этой страницы приведен на рис. 9.З. Если нажать на
ссылку до
истечения 5 секунд, будет отображено значение cookie, как на рис. 9.2. Если
же перейти по ссылке после истечения срока действия cookie, то будет
выведено сообщение о том, что значение cookie не определено (см. рис. 9.4).
В этом примере срок действия cookie был очень небольшой. В
реальной практике срок действия устанавливается достаточно протяженным,
чтобы cookie сохранился и после завершения сеанса работы пользователя.
Если же срок действия не установлен, то время жизни cookie ограничено
только текущим сеансом.
Удаление cookie
Иногда возникает необходимость удалить установленный ранее cookie. Для
этого следует вызвать функцию setcookiec теми же параметрами, что и при
установке cookie, но передать в качестве аргумента value пустую строку "".
Следует обратить особое внимание на то, что все остальные аргументы,
заданные при установке cookie, должны обязательно присутствовать с теми
же значениями, иначе требуемый результат не будет достигнут.
117
Использование FTP
Протокол FTP предназначен для передачи файлов через Интернет, и в
РНР встроена полная поддержка этого протокола. Если используется Unix-
версия РНР, то для использования функций работы с FTP следует добавить
опцию
-enable-ftp при установке пакета. В версии для Windows поддержка FTP
является встроенной.
Использование FTP " 287
Для того чтобы начать работы с FTP, необходимо установить соединение с
FTP-сервером, что осуществляется при помощи функции ftpconnect:
ftpconnect (string host [, int port [, int timeout]])
Эта функция устанавливает соединение с заданным FTP-сервером (строка
host задает доменное имя сервера, без префиксов «ftp://» и без завершающих
слэшей, например ftp. relcom. ru). Необязательный параметррогС задает
альтернативный TCP-порт для подключения (если значение не задано или
равно
нулю, используется стандартный порт 21). Третий необязательный параметр
timeout задает время ожидания завершения обмена данными по сети (по
умолчанию оно равно 90 с). При успешном соединении функция возвращает
дескриптор FTP-соединения, при неудаче — значение FALSE.
После соединения при помощи ftpconnect следует произвести
аутентификацию при помощи функции ftplogin:
ftplogin (resource ftp stream, string username, string password)
Функция пытается осуществить вход на сервер, используя заданное имя
пользователя и пароль, и возвращает TRUE при успехе и FALSE в случае
ошибки.
/ теля ftp или anonymous. В качестве пароля указывается адрес e-mail
пользователя.
IW"Ji»J*P»JHl
Ниже приведен типичный фрагмент кода для начала сеанса работы по FTP1:
$connect = ftp_connect ("ftp.ispname.com");
$result = ftp_login ($connect, $username, $password) ;
Этот фрагмент будет часто использоваться в следующих разделах главы.
Наряду с ftpconnect и ftplogin, в РНР для работы с FTP имеется большое
количество функций, наиболее употребительные из которых приведены в
списке ниже.
ftpalloc. Выделение дискового пространства для загрузки файла.
ftpedup. Переход к вышестоящему каталогу.
ftpchdir. Переход к заданному каталогу на FTP-сервере.
ftpchmod. Назначение прав доступа к файлу на FTP-сервере.
118
ftpclose. Завершение FTP-соединения.
ftpconnect. Установка FTP-соединения.
ftpdelete. Удаление файла на FTP-сервере.
ftpexec. Запрос выполнения программы на FTP-соединения.
ftpfget. Прием файлас FTP-сервера и сохранение его в открытом файле.
ftpfput. Передача открытого файла на FTP-сервер
ftpgetoption. Определение текущих параметров FTP-соединения.
ftpget. Прием файлас FTP-сервера.
ftplogin. Аутентификация пользователя на FTP-сервере.
Здесь и далее используется вымышленное имя FTP-сервера ft p. ispname. com.
— Прим.ред.
288 Глава 9. Cookie, сеансы, FTP, e-mail
ftp mdtm. Определение времени последнего изменения файла.
ftp mkdir. Создание каталога.
ftp nb continue. Продолжение приема/передачи файла.
ftp nb fget. Асинхронный1 прием файл с FTP-сервера и сохранение его
в открытом файле.
ftp nb fput. Асинхронная передача открытого файла на FTP-сервер.
ftp nb get. Асинхронный прием файла с FTP-сервера.
ftp nb put. Асинхронная передача файла на FTP-сервер.
ftpnlist. Получение списка файлов заданного каталога на FTP-сервере.
ftp put. Передача файла на FTP-сервер
ftp_pwd. Текущий каталог
ftp quit. Завершение FTP-соединения.
ftp raw. Отправка произвольной команды на FTP-сервер.
ftp rawl i st. Получение детального списка файлов заданного каталога на
FTP-сервере.
ftp rename. Переименование файла на FTP-сервере.
ftp rmdir. Удаление каталога на FTP-сервере.
ftp set option. Установка параметров FTP-соединения.
ftp site . Отправка команды SITE на FTP-сервер.
ftp size. Определение размера заданного файла,
ftp ssl connect. Установление безопасного соединения SSL-FTP.
ftp systype. Определение системного идентификатора FTP-сервера.
Многие из этих функций используются в следующих разделах главы.
Загрузка файла с FTP-сервера
Одной из наиболее часто употребительных операций с БТР является
загрузка файла с сервера. Перед загрузкой следует перейти в каталог, где
расположен нужный файл. Для этого предназначена функция ftpchdir:
ftpchdir (resource ftp stream, string directory)
После вызова этой функции каталог directory становится текущим.
Функция возвращает TRUE при успехе или FALSE в случае какой-либо
ошибки.
119
10 РНР в примерах
Чтобы загрузить файл из какого-либо каталога, применяется функция
ftpget:
ftp_get (resource ftp_stream, string local_file, string
remote_file, int_mode [, int resumepos])
Функция осуществляет загрузку файла remote file (аргумент должен
содержать только имя файла без каталога) с F IP-сервера и сохраняет его в
локальный файл local^file (этот аргумент может включать в себя имя
устройства и каталога). Параметр mode задает режим передачи файлов и
может принимать два значения — FTPASCII и FIPBINARY. В случае
FTPASCII при передаче файлов между разнородными системами (например,
между Unix и Windows) производится автоматическое преобразование
символов, задающих конец
строки. Последний необязательный параметр resumepos задает позицию,
начиная с которой следует осуществить передачу файла, и используется при
докачке в случае обрыва соединения. Функция возвращает TRUE при успехе
или FALSE в случае какой-либо ошибки.
внимание нато, что закачанный файл будет размещен в том же каталоге, где
расположен и скрипт. Для того чтобы поместить файл в другой каталог,
следует указать в качестве аргумента local^file функции ftpget полный путь к
нему.
Загрузка файла на FTP-сервер
В предыдущем разделе файл закачивался с сервера на локальный компьютер.
Ниже рассмотрен обратный процесс — передача локального файла на FTP-
сервер. Для этого используется функция ftp_put:
ftp_put (resource ftp_stream, string remote_file, string
local_file, int mode [, int startpos])
Аргументы функции имеет тот же смысл, что и в предыдущем случае, только
файлы указаны в другом порядке. Файл 1ocal_file (это аргумент может
включать в себя полный или относительный путь к файлу) передается на
FTP-сервер и сохраняется там в текущем каталоге под именем remoteJile.
Остальные аргументы — mode и startpos — аналогичны функции ftp_get,
описанной в предыдущем разделе. Пример 9.6 демонстрирует использование
функции ftp_put для передачи текстового файла на FTP-сервер.
Отправка e-mail
При помощи РНР можно достаточно просто отправлять электронную почту.
Для того чтобы подключить эту функциональность, необходимо
отредактировать в конфигурационном файле php.ini следующую секцию:
[mail function]
; For Win32 only.
120
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
; For Unix only. You may supply arguments as well (default: " sendmail -1 - i " ) .
;sendmail_path =
Для Windows следует вместо localhost указать адрес SMTP-сервера для
отправки электронной почты, а в параметре sendmail _from — обратный
адрес отправителя писем. Для Unix и Linux скорее всего дополнительная
настройка не понадобится, но в случае проблем с отправкой почты следует
присвоить параметру sendmail_path полный путь к команде sendmail,
предварительно убрав с него знак комментария «;».
Для отправки электронной почты используется функция mail, синтаксис
которой приведен ниже:
mail (string to, string subject, string message [, string
additional_headers [,stringaddi tional_parameters]])
Эта функция отправляет письмо message с темой subject no адресу to.
Кроме того, могут быть указаны дополнительные заголовки почтового
сообщения,
а также дополнительные параметры. Пример 9.7 содержит форму, в которой
вводятся все данные, необходимые для формирования письма, а в примере
9.8 приведен скрипт-обработчик формы, который осуществляет собственно
отправку корреспонденции.
E-mail с дополнительными заголовками
При помощи функции mail можно отправить письмо, содержащее различные
дополнительные заголовки, например сc : (carbon copy — твердая копия) или
bcc : (blind carbon copy — слепая копия). Оба этих заголовка используются
для перечисления дополнительных получателей письма. Отличие в том, что
заголовок bee: не виден на стороне адресата, и список тех, кому отправлено
письмо при помощи него, неизвестен получателям письма (в том числе и тем,
кто перечислен в этом заголовке). Для задания дополнительных заголовков
при вызове функции mail используется необязательный аргумент additional
headers:
mail (string to, string subject, string message [, string
additional_headers [, string additional_parameters}])
Следует обратить внимание на то, что для разделения строк заголовка
должны
использоваться символы \r\n (хотя в Unix для обозначения конца строки
традиционно используется только символ \n). Пример 9.9 демонстрирует
расширенную форму для отправки письма и отличается от примера 9.7 тем,
что в нем присутствуют поля для дополнительных заголовков.
121
Е-таМсвложеннымифайлами
При помощи РНР можно отправлять и письма с вложенными файлами, но
для этого придется приложить чуть больше усилий. Допустим, требуется
отправить файл image.jpg. Прежде всего следует определить MIME-тип
файла, в данном случае это image.jpeg (если отправляемый файл будет иметь
другой тип, следует указать корректный MIME-тип.):
$attachment = "image.jpg";
$attachment_MIME_type = "image/jpeg";
Далее следует прочитать файл и сохранить его содержимое в переменной:
$handle = fopen ($attachment, " rb " ) ;
$data = fread ($handle, filesize ($attachment));
fclose ($handle);
Так как электронные письма передаются в семибитной кодировке, требуется
преобразовать содержимое файла в кодировку base64 и указать в заголовке
письма, что оно состоит из нескольких частей. Преобразование
осуществляется при помощи функций chunksplit Hbase64_encode:
$boundary = " Multipart_Boundary " ;
$headers = "\nMIME-Version: 1.0\n"
"Content-Type: multipart/mixed, • \n" .
" boundary=\"" . $boundary . "\"";
$data = chunk_split (base64_encode ($data));
Скрипт в примере 9.11 демонстрирует отправку письма с вложенным
файлом. Он может использоваться в качестве обработчика формы из примера
9.9 вместо скрипта phpmailheaders.php из примера 9.10.
Сеансы
Когда пользователь в рамках одного web-приложения работает с различными
страницами, при каждой загрузке скрипта переменные очищаются. Это
означает, что для передачи данных между страницами необходимо
использовать специальные приемы, например, передачу через формы (метод
POST), строку URL (метод GET) или использовать cookie, как показано
выше. Но самым удобным способом является использование сеансов.
Сеансы предназначены для сохранения данных определенного пользователя
на сервере. Для каждого пользователя формируется уникальный
идентификатор сеанса, который используется для автоматического
восстановления данных клиента, вне зависимости от того, сколь много
страниц и скриптов использует web-приложение. Для сохранения
идентификатора сеанса обычно используется cookie, при недоступности
этого варианта (например, если пользователь не принимает cookie),
идентификатор сеанса может быть закодирован в строке URL или передан
как скрытое поле формы.
122
Для объявления начала сеанса используется функция startsession1.
Данные сеанса содержатся в суперглобальном массиве $ SESSION.
Например, необходимо сохранить значение выбранного пользователем цвета.
Для этого может использоваться следующий фрагмент кода:
Где-нибудь в другом скрипте (или даже в том же самом) требуется прочитать
значение цвета. Для этого используется следующий код:
session_start ();
$color = $_SESSION ['color'];
Таким способом данные могут легко передаваться между различными
скриптами. РНР поддерживает работу с сеансами по умолчанию. Для ее
отключения необходимо скомпилировать РНР с опцией —disable-session
(только для Unix, для Windows отключить ее невозможно).
Настройка работы с сеансами осуществляется при помощи секции [Session]
конфигурационного файла php. ini. В табл. 9.1 приведены все параметры этой
секции с кратким описанием.
Таблица 9.1. Параметры настройки сеансов
При настройке РНР для работы с сеансами следует обратить внимание на то,
что данные всех сеансов сохраняются в виде индивидуальных файлов в
каталог, заданном параметром session, savepath. При настройке РНР следует
при необходимости создать каталог для хранения сеансовых данных и
указать его в этом параметре. При каждой инициализации сеанса файл
данных создается вне зависимости от того, были ли сохранены какие-либо
данные или нет.
123
Сохранение данных сеансов
Для хранения данных сеансов используется массив SSESSION. Он является
суперглобальным подобно $_GET, SPOST и $_REQUEST. Перед тем, как
использовать массив SSESSION, следует произвести инициализацию сеанса
при помощи функции startsession.
Пример 9.12 демонстрирует сохранение данных в сеансе. Элементу
массива $_SESSION [ 'temperature'] присваивается значение температуры.
Формируемая страница (см. рис. 9.11) содержит ссылку для перехода
на следующую страницу, в которой данные будут прочитаны.
Сеансы без cookie
Для хранения идентификатора сеанса РНР обычно использует cookie. При
помощи этого идентификатора определяется тот набор данных, который
связан с текущим сеансом. Но пользователь по каким-либо причинам может
отключить использование cookie. В этом случае РНР будет передавать
идентификатор сеанса в строке URL. Для того чтобы включить такую
возможность, в конфигурационном файле php.ini следует включить параметр
session, use_trans_sid (кроме того, следует проверить значение параметра
session. use_onlycookies, который говорит о том, что для передачи
идентификатора сеанса используются только cookie):
session.use_trans_sid=l
После этого строка URL будет выглядеть следующим образом:
script.php?PHPSESSID=322fe03120041e6c5285480a4fbf1037
Параметр по умолчанию выключен, так как передача идентификатора
сеанса
через URL является серьезной брешью в безопасности системы. Что же
делать, если пользователь не принимает cookie, а передача идентификатора
сеанса через URL также отключена? В этом случае имеется возможность
ручной передачи идентификатора сеанса. Для этого его следует сохранить в
скрытом поле формы. Имя поля задается параметром session.name, по
умолчанию это PHPSESSID. Образец такой передачи идентификатора сеанса
приведен в примере 9.16.
Удаление данных сеанса
Помимо передачи данных между отдельными скриптами иногда возникает и
необходимость удалить данные сеанса. Для этого может с успехом
использоваться уже известная функция unset. К примеру, в сеансе было
сохранено определенное значение температуры:
<Н1>Удаление данных сеансаН1>
session_start ( ) ;
124
$_SESSI0N ['temperature' ] = " 3 6 . 6 " ;
echo "Температура: ".$_SESSI0N ['temperature'];
Значение температуры сохранится и после перехода по
<а href="phpsessionunset2.рЬр">ссылкеа>.
Переход с этой страницы по ссылке ведет на скрипт, в котором происходит
удаление элемента массива SSESSION, содержащего значение температуры:
Удаление элемента "temperature"...
sessionstart ();
unset ($_SESSION ["temperature"]);
?>
Для продолжения перейдите по <а href="phpsessionunset3.pbp">ccbiiiKe.
Внешний вид страницы, содержащей этот код, приведен на рис. 9.18.
Наконец, на последней странице производится анализ наличия температуры
в данных сеанса:
На этом завершается описание работы с сеансами — и завершается и эта
книга. В ней был показан путь от простейших приемов программирования до
достаточно продвинутых способов. РНР содержит богатые возможности для
создания самых разнообразных приложений. Вам, уважаемый читатель,
осталось только применить все полученные знания на практике, в чем автор
искренне желает всяческих успехов.
Do'stlaringiz bilan baham: |