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

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


$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, "$URLt$Descriptionn");
    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">23</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, "$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, так как на них слеш всегда используется при указании полно
го пути к файлу.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: