Поиск

Запись данных в файл

Чтобы считывать информацию из файла, сначала ее надо записать туда. Запись в файл на сервере состоит из трех этапов: открытие файла, собственно запись данных, закрытие файла. К счастью, в РНР для выполнения каждого из этих действий есть встроенные функции:

$FileName = "data.txt";
$FilePointer = fopen ($FileName, "mode");
fwrite ($FilePointer, "data to be written");
fclose ($FilePointer);

Чтобы работа с файлами была удобной, сначала я всегда присваиваю отдель ной переменной имя файла и путь к нему, то есть точные координаты файла на сервере. Указывая путь к файлу, пользуйтесь обычными правилами обозначения пути (например, если файл находится в каталоге files, являющемся подкатало гом текущего каталога, запись гласит: files/data.txt). Затем необходимо создать указатель файла, который присваивается соответствующим образом поимено ванной переменной $FilePointer и используется в РНР для обращения к от крытому файлу.

При открытии файла большое значение имеет используемый режим рабо ты с ним (параметр mode). Выбор режима зависит от того, что вы собираетесь делать с этим файлом. Самый простой режим а+. Он позволяет писать в файл и считывать из него. Этот режим создаст файл, если тот не существует, и авто матически добавит данные в конец файла. Более строгий режим г позволит только считывать информацию из файла. В таблице С.4 (приложение С) при веден полный список возможных режимов.

Функция fwrite () запишет новые данные, указанные как второй аргумент при вызове функции, в заданный файл .в соответствии с выбранным режимом. И наконец, вы закрываете файл, снова обратившись к его указателю. Создадим форму, которая сохраняет переданные пользователями адреса URL в отдельном файле.

Запись во внешний файл

  1. Откройте страницу form.html (глава 8) в текстовом редакторе (листинг 10.1). Листинг 10.1 т Это существующая версия страницы form.html. Можно уда лить строки для имени и фамилии, так как они здесь не понадобятся (см. лис тинг 10.2).
  2. 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>

    Я сделаю небольшие изменения в форме, а вы можете пропустить данный шаг, так как это не отразится на конечном результате.

  3. Удалите строки для имени и фамилии (листинг 10.2).
  4. Листинг 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>
  5. Сохраните страницу и загрузите ее на сервер. Напишем новый сценарий HandleForm.php.Он будет обрабатывать данные, сгенерированные формой form.html.
  6. Создайте новый PHPдокумент в текстовом редакторе
  7. Начнем с определения функции РНР.
  8. <?рпр
    function WriteToFile ($URL, $Description) {
    Функцией WriteToFile ( ) используются два аргумента (адрес URL и его опи сание) , которые пользователь ввел в форму form.html.
  9. Называем файл и открываем его.
  10. $TheFile = "data.txt";
    SYS-PAGE-CONTENTpen = fopen ($TheFile, " a " ) ;

    С помощью этих двух строк мы указываем имя файла и открываем его толь ко для записи (создаем файл, если его нет, или дописываем новые данные в конец в противном случае). Указанный здесь файл data.txt был создан ранее (см. предыдущий раздел), там же задавались права доступа к нему.

  11. Создайте условную конструкцию на основе функции fopen ( ) .
  12. if (SYS-PAGE-CONTENTpen) {
    fwrite (SYS-PAGE-CONTENTpen, "$URL\t$Description\n");
    fclose (SYS-PAGE-CONTENTpen);
    $Worked = TRUE;
    } else {
    $Worked = FALSE;

    Если файл открыт успещно, новые данные будут добавлены к старым. Фор мат данных следующий: URL, затем знак табуляции (созданный с помощью обратного слеша и "буквы «t» \t), описание и знак новой строки (созданный с помощью \п). После этого файл закрывается.

  13. Возвратите значение $worked и закройте функцию.
  14. return $Worked,
    } // Конец функции WriteToFile.

    Если файл открыт успешно, значение переменной $Worked становится ис тинным и возвращается, чтобы показать успешное выполнение функции.

  15. Закройте первый PHPраздел и создайте стандартный HTMLзаголовок.
  16. <HTMLxHEADxTlTLE>Using Files</TITLEx/HEADxBODY>
  17. Откройте основной РНРраздел.
  18. <?php
  19. Создайте Шаблон регулярного выражения:
  20. $Pattern = " ( h t t p : / / ) ? ( [ A [ : s p a c e : ] ] + )
    ( [ [ : a l n u m : ] \ . , _ ? / & = ] ) " ;

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

  21. Создайте условную конструкцию.
  22. 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 ( ) .

  23. По результатам вызова функции будет напечатано сообщение.
  24. 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.

  25. Закройте условную инструкцию, РНР и HTML.
  26. } else {
    print ("Please enter a valid Web address !\n") ;
    </BODYx/HTML>
  27. Сохраните сценарий как HandleForm.php (листинг 10.3), загрузите его на сервер (в один каталог с файлами form.html и data.txt) и протестируйте в браузере (рис. 10.410.6).

Листинг 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>
В целях предосторожности можно использовать функцию is_writeable ( ) . Она определяет, позволит ли сервер записать данные в файл, перед тем как попытать ся открыть его. Включить функцию is_writeable ( ) в сценарий можно следу ющим образом (это начало сценария):
STheFile = "data.txt"; if (is_writeable ($TheFile)) { SYS-PAGE-CONTENTpen = fopen ($TheFile, " a " ) ;
Работая на серверах Windows, не забывайте экранировать обратные слеши в пути к файлу. Вместо них можно использовать обычный слеш (/). Например, нужно написать c:\php\data.txt или c:/php/data.txt, но не c:\php\data.txt, так как обрат ный слеш это знак экранирования следующего символа. Сказанное не относит ся к серверам UNIX, так как на них слеш всегда используется при указании полно го пути к файлу.