Поиск
Запись данных в файл
Чтобы считывать информацию из файла, сначала ее надо записать туда. Запись в файл на сервере состоит из трех этапов: открытие файла, собственно запись данных, закрытие файла. К счастью, в РНР для выполнения каждого из этих действий есть встроенные функции:
$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 (глава 8) в текстовом редакторе (листинг 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, "$URL\t$Description\n");
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\">\2\3</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, "$URL\t$Deecription\n");
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: //\2\3\" target=\"_new\">\2\3</
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>
STheFile = "data.txt";
if (is_writeable ($TheFile)) {
SYS-PAGE-CONTENTpen = fopen ($TheFile, " a " ) ;