Чтобы считывать информацию из файла, сначала ее надо записать туда. Запись
в файл на сервере состоит из трех этапов: открытие файла, собственно запись
данных, закрытие файла. К счастью, в РНР для выполнения каждого из этих
действий есть встроенные функции:
$FileName = "data.txt";
$FilePointer = fopen ($FileName, "mode");
fwrite ($FilePointer, "data to be written");
fclose ($FilePointer);
Чтобы работа с файлами была удобной, сначала я всегда присваиваю отдель
ной переменной имя файла и путь к нему, то есть точные координаты файла на
сервере. Указывая путь к файлу, пользуйтесь обычными правилами обозначения
пути (например, если файл находится в каталоге files, являющемся подкатало
гом текущего каталога, запись гласит: files/data.txt). Затем необходимо создать
указатель файла, который присваивается соответствующим образом поимено
ванной переменной $FilePointer и используется в РНР для обращения к от
крытому файлу.
При открытии файла большое значение имеет используемый режим рабо
ты с ним (параметр mode). Выбор режима зависит от того, что вы собираетесь
делать с этим файлом. Самый простой режим а+. Он позволяет писать в файл
и считывать из него. Этот режим создаст файл, если тот не существует, и авто
матически добавит данные в конец файла. Более строгий режим г позволит
только считывать информацию из файла. В таблице С.4 (приложение С) при
веден полный список возможных режимов.
Функция fwrite () запишет новые данные, указанные как второй аргумент
при вызове функции, в заданный файл .в соответствии с выбранным режимом.
И наконец, вы закрываете файл, снова обратившись к его указателю.
Создадим форму, которая сохраняет переданные пользователями адреса
URL в отдельном файле.
Запись во внешний файл
- Откройте страницу form.html (глава
в текстовом редакторе (листинг 10.1).
Листинг 10.1 т Это существующая версия страницы form.html. Можно уда
лить строки для имени и фамилии, так как они здесь не понадобятся (см. лис
тинг 10.2). - Удалите строки для имени и фамилии (листинг 10.2).
- Сохраните страницу и загрузите ее на сервер.
Напишем новый сценарий HandleForm.php.Он будет обрабатывать данные,
сгенерированные формой form.html. - Создайте новый PHPдокумент в текстовом редакторе
- Начнем с определения функции РНР.
- Называем файл и открываем его.
- Создайте условную конструкцию на основе функции fopen ( ) .
- Возвратите значение $worked и закройте функцию.
- Закройте первый PHPраздел и создайте стандартный HTMLзаголовок.
- Откройте основной РНРраздел.
- Создайте Шаблон регулярного выражения:
- Создайте условную конструкцию.
- По результатам вызова функции будет напечатано сообщение.
- Закройте условную инструкцию, РНР и HTML.
- Сохраните сценарий как HandleForm.php (листинг 10.3), загрузите его на
сервер (в один каталог с файлами form.html и data.txt) и протестируйте
в браузере (рис. 10.410.6).
1 <HTML>
2 <HEAD>
3 <TITLE>HTML Form</TITLE>
4 </HEAD>
5 <BODY>
6 <FORM ACTION="HandleForm.php" METHOD=POST>
7 First Name <INPUT TYPE=TEXT NAME="Array[FirstName]" SIZE=20xBR>
8 Last Name <INPUT TYPE=TEXT NAME="Array[LastName]" SIZE=40xBR>
9 URL <INPUT TYPE=TEXT NAME="Array[URL]" SIZE=60xBR>
10 Description <TEXTAREA NAME="Array[Description]" ROWS=5 COLS=40>
</TEXTAREAxBR> " "
11 <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Sutomit!">
12 </FORM>
13 </BODY>
14 </HTML>
Я сделаю небольшие изменения в форме, а вы можете пропустить данный
шаг, так как это не отразится на конечном результате.
Листинг 10.2 т Я удалил ненужные строки для имени и фамилии из формы
form.html, чтобы страница выглядела аккуратнее. Впрочем, этого можно было
и не делать, в силу того что имена двух важных полей ввода Array [URL]
и Array [Description] остались неизмененными.
1 <HTML>
2 <HEAD>
3 <TITLE>HTML Form</TITLE>
4 </HEAD>
5 <BODY>
6 <FORM ACTION="HandleForm.php" METHOD=POST>
7 URL <INPUT TYPE=TEXT NAME="Array[URL]" SIZE=60xBR>
8 Description <TEXTAREA NAME="Array[Description]"ROWS=5 COLS=40>
</TEXTAREA><BR>
9 <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!"> .
10 </FORM>
11 </BODY>
12 </HTML>
<?рпр
function WriteToFile ($URL, $Description) {
Функцией WriteToFile ( ) используются два аргумента (адрес URL и его опи
сание) , которые пользователь ввел в форму form.html.
$TheFile = "data.txt";
SYS-PAGE-CONTENTpen = fopen ($TheFile, " a " ) ;
С помощью этих двух строк мы указываем имя файла и открываем его толь
ко для записи (создаем файл, если его нет, или дописываем новые данные
в конец в противном случае). Указанный здесь файл data.txt был создан ранее
(см. предыдущий раздел), там же задавались права доступа к нему.
if (SYS-PAGE-CONTENTpen) {
fwrite (SYS-PAGE-CONTENTpen, "$URLt$Descriptionn");
fclose (SYS-PAGE-CONTENTpen);
$Worked = TRUE;
} else {
$Worked = FALSE;
Если файл открыт успещно, новые данные будут добавлены к старым. Фор
мат данных следующий: URL, затем знак табуляции (созданный с помощью
обратного слеша и "буквы «t» t), описание и знак новой строки (созданный
с помощью п). После этого файл закрывается.
return $Worked,
} // Конец функции WriteToFile.
Если файл открыт успешно, значение переменной $Worked становится ис
тинным и возвращается, чтобы показать успешное выполнение функции.
<HTMLxHEADxTlTLE>Using Files</TITLEx/HEADxBODY>
<?php
$Pattern = " ( h t t p : / / ) ? ( [ A [ : s p a c e : ] ] + )
( [ [ : a l n u m : ] . , _ ? / & = ] ) " ;
егулярные выражения используются для проверки правильности адреса
URL, который затем будет превращен в активную ссылку.
if (eregi($Pattern, $Array["URL"])) {
$Replace = "<a h r e f = " h t t p : / / 2 3 "
target="_new">23</a>";
$Array["URL"] = eregi_replace($Pattern,
»$Replace, $Array["URL"]);
$CallFunction = WriteToFile ($Array["URL"],
—$Array["Description"]);
Если переданный пользователем адрес URL соответствует шаблону, то он
будет изменен с помощью функции eregi_replace ( ) и уже знакомой нам об
ратной ссылки. Затем вызывается функция WriteToFile ( ) .
if ($CallFunction) {
print ("Your submission$Array[URL]has
—been received!<BR>n");
} else {
print ("Your submission was not processed
—due to a system error!<BR>n");
Переменная $callFunction равна возвращенному из функции значению
$Worked.
} else {
print ("Please enter a valid Web address !n") ;
</BODYx/HTML>
Листинг 10.3 т В этом сценарии показано несколько известных вам при
емов, которые стоит использовать в работе. Функция написана как первый
элемент сценария. Передаваемые пользователем данные проверяются на пра
вильность с помощью регулярных выражений. При возникновении какихлибо
проблем в браузер отправляется соответствующее сообщение.
1 <?php
2 function WriteToFile (SYS-PAGE-CONTENTRL, $Deecription) {
, 3 /* Функция WriteToFile принимает два аргумента URL и описание,
которые будут записаны в файл. */
4 $TheFile . "data.txt";
5 SYS-PAGE-CONTENTpen fopen ($TheFile, "a");
6 if (SYS-PAGE-CONTENTpen) {
7 fwrite (SYS-PAGE-CONTENTpen, "$URLt$Deecriptionn");
8 f close (SYS-PAGE-CONTENTpen);
9 $Horked TRUE;
10 } else {
11 $Worked FALSE;
12 }
13 return $ Worked;
14 } // Конец функции WriteToFile.
15 ?>
16 <HTML>
17 <HEAD>
18 <TITLE>Using Files</TITLEx/HEAD>
19 <BODY>
20 <?php . .
21 /* Эта страница получает и обрабатывает данные, принятые
от "form.html" . */
22 $Pattern = " (http: //)?( Г [ :space: ]]+)([[ :alnum: ] .,_?/&=])";
23 if (eregi($Pattern, $Array ["URL"] ) ) {
24 $Replace = "<a href = "http: //23" target="_new">23</
a>";
25 $Array["URL"] = eregi_replace($Pattern, $Replace, $Array ["URL" ] ) ;
26 $CallPunction » WriteToFile ($Array["URL"l ,
$Array [ "Description" ] ) ;
27 if ($CallFunction) {
28 print ("Your submission$Array [URL]has been received!<BR>n" ) ;
29 } else {
30 print ("Your submission was not processeddue to a system
error ! <BR>n" );
31}
32} else {
33print ("Please enter a valid Web address! n" ) ;
34}
35?>
36</BODY>
37</HTML>
В целях предосторожности можно использовать функцию is_writeable ( ) . Она
определяет, позволит ли сервер записать данные в файл, перед тем как попытать
ся открыть его. Включить функцию is_writeable ( ) в сценарий можно следу
ющим образом (это начало сценария):
STheFile = "data.txt";
if (is_writeable ($TheFile)) {
SYS-PAGE-CONTENTpen = fopen ($TheFile, " a " ) ;
Работая на серверах Windows, не забывайте экранировать обратные слеши в пути
к файлу. Вместо них можно использовать обычный слеш (/). Например, нужно
написать c:phpdata.txt или c:/php/data.txt, но не c:phpdata.txt, так как обрат
ный слеш это знак экранирования следующего символа. Сказанное не относит
ся к серверам UNIX, так как на них слеш всегда используется при указании полно
го пути к файлу.