Поиск

Чтение файла

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

$FileName = "data.txt";
$FilePointer = fopen ($FileName, "mode");
$Array = file ($FileName);
fclose (SFilePointer);

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

Создадим сценарий, который выведет на одну страницу переданные пользо вателем и полученные ранее адреса URL.

  1. Создайте новый документ в текстовом редакторе.
  2. Начните со стандартного HTMLзаголовка.
  3. <HTMLxHEAD>
    <TITLE>Storing URLs in an External File</TITLE>
    </HEADxBODY>

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

  4. Откройте PHPраздел и скопируйте функцию WriteToFile ( ) из сценария HandleForm.php (листинг 10.3).
  5. <?php
    function WriteToFile ($URL, $Description) {
    /* Функция WriteToFile принимает два аргумента URL и описание,
    —которые будут записаны в файл. */ . '
    $TheFile = "data.txt";
    SYS-PAGE-CONTENTpen = fopen ($TheFile, "a");
    if (SYS-PAGE-CONTENTpen) {
    fwrite (SYS-PAGE-CONTENTpen, "$URL\t$Description\n");
    fclose (SYS-PAGE-CONTENTpen);
    $Worked = TRUE;
    } else {
    SWorked = FALSE;
    } .
    return $Worked;
    } // Конец функции WriteToFile.

    Нет необходимости менять какиелибо строки. Налицо одно из преиму ществ использования функций!

  6. Создайте новую функцию, которая будет извлекать данные из файла.
  7. function ReadFromFile () {
    /* Функция ReadFromFile отображает всю информацию,
    сохраненнур в файле. */
    $TheFile = "data.txt";
    SYS-PAGE-CONTENTpen = fopen ($TheFile, "r");
    if (SYS-PAGE-CONTENTpen) {
    print ("URLs currently listed in the data file:<P>\n");
    $Data =. file ($TheFile);
    for ($n = 0; $n < count($Data); $n++) {
    $GetLine = explode!"\t", $Data[$n]);
    print ("$GetLine[0]<BR>\n$GetLine[l]<P>\n");
    }
    fclose (SYS-PAGE-CONTENTpen),\
    print ("<HRxP>\n") ;
    } else { '
    print ("Unable to read fromdata.txt!<BR>\n");
    }
    } // Конец функции ReadFromFile.

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

    Затем печатается заголо'вок, а данные файла превращаются в массив SData. Все элементы массива строки (в формате: URL, символ табуляции, описание, символ новой строки). Затем каждая строка превращается в новый массив $GetLine с помощью выполнения цикла, в котором из функции $Data пооче редно извлекаются все элементыстроки. В цикле функция explode ( ) создает из каждой строки массив SGetLine. При этом используется пара элементов, отделенных друг от друга знаком табуляции. Используя этот новый массив, можно отдельно распечатать части оригинальной строки.

    И наконец, файл закрывается, код HTML отсылается в браузер. Завершает ся выполнение условной конструкции. При этом, если файл не был открыт, генерируется сообщение об ошибке.

  8. Напишите третью функцию, которая при каждом вызове будет создавать HTMLформу.
  9. function CreateForm () {
    /* Функция CreateForm отображает форму, */
    print ("Add a URL to the data f i l e : \ n " ) ;
    print ("<FORM ACTION=\"urls.php\" METHOD=POST>\n");
    print ("URL <INPUT TYPE=TEXT NAME=\"Array[URL]\"
    SIZE=60xBR>\n");
    print ("Description <TEXTAREA NAME=\"Array[Description]\"
    ROWS=5 COLS=40x/TEXTAREAxBR>\n") ;
    print ("<INPUT TYPE=HIDDEN NAME=\"BeenSubmitted\" ' .
    VALUE=\"TRUE\">\n") ;
    print ("<INPUT TYPE=SUBMIT NAME=\"SUBMIT\"
    VALUE=\"Submit! \"></FORM>\n").;
    } // Конец функции CreateForm.

    Эта функция похожа на страницу form.html, но есть и два новых приема. Во первых, тэг ACTION теперь посылает данные из формы в сценарий urls.php. Во вторых, мы добавили скрытое поле, которое задает значение $BeenSubmitted как истинное. Вы скоро поймете, зачем это было сделано.

  10. Напишите четвертую функцию, которая будет обрабатывать форму,
  11. function HandleForm () {
    global $Array;

    Данная функция создана на основе сценария HandleForm.php. Ее первое действие получение доступа к внешнему массиву $Аггау, который содержит данные формы, с помощью инструкции global.

  12. Основу функции составляет тело предыдущей страницы HandleForm.php (листинг 10.4).
  13. $Pattern = " ( h t t p . / / ) ? ( [ л[:space:]]+)
    ( [ [ : a l n u m : ] \ . , _ ? / & = ] ) " ;
    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"]);
    if ($CallFunction) {
    print ("Your submission$Array[URL]has
    —been received! <PxHRxP>\n");
    } else {
    print ("Your submission was not processed
    —due to a system error!<BR>\n");
    } else {
    print ("Please enter a valid Web address!\n");
    } // Конец функции HandleForm.

    Функцией проверяется правильность ввода с помощью регулярного выра жения. Если был введен неправильный адрес URL, распечатывается сообще ние об ошибке. При условии того что адрес верен, начинается выполнение строки $CallFunction и соответствующих условных инструкций.

  14. Создайте условную конструкцию, которая будет определять, обрабаты вать ли форму.
  15. if ($BeenSubmitted) {
    HandleForm();
    ReadFromFileO ;
    CreateFormO;

    Если значение $BeenSubmitted истинно (то есть форма уже была заполнена и сценарий вызван еще раз), то данные будут обработаны. Если значение $BeenSubmitted ложно (это означает, что скрипт работает впервые, а пользо ватель пока ничего не ввел в форму), функция HandleForm ( ) вызвана не будет. В любом случае имеющиеся данные выводятся из файла на экран, а для того чтобы пользователь смог ввести другой адрес URL, создается специальная форма.

  16. Закройте РНР. и HTML.
  17. ?></BODYx/HTML>
  18. Сохраните страницу как urls.php (листинг 10.4), загрузите ее на сервер и протестируйте в браузере (рис. 10.710.9).

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

1 <HTML>
2 <HEAD>
3 <TITLE>Storing URLs in an External.File</TITLE>
4 </HEAD>
5 <BODY>
6 <?php
7 function WriteToFile ($ORL, $Deecription) {
8 /* Функция WriteToFile принимает два аргумента URL и описание,
которые будут записаны в файл. •*/
9 $TheFile = "data.txt";
10 SYS-PAGE-CONTENTpen = fopen ($TheFile, "a");
11 if (SYS-PAGE-CONTENTpen) {
12 fwrite (SYS-PAGE-CONTENTpen, "$URL\t$Description\n");
13 fclose (SYS-PAGE-CONTENTpen);
14 $Worked = TRUE;
15 } else {
16 $Worked = FALSE;
17 }
18 return $Worked;
19 } // Конец функции WriteToFile.
20
21 function ReadFromFile () {
22 /* Функция ReadFromFile отображает всю информацию, сохраненную
в файле. */
23 $TheFile = "data.txt";
24 SYS-PAGE-CONTENTреп я fopen ($TheFile, "r");
25 if (SYS-PAGE-CONTENTpen) {
26 print ("URLs currently listed in the data file:<P>\n");
27 $Data = file ($TheFile);
28 for ($n = 0; $n < count($Data); $n++) {
29 $GetIiine = explode ("\t" , $Data[$n]);
30 print ("$(3etLine[0]<BR>\n$GetLine[l]<P>\n") ;
31 }
32 fclose (SYS-PAGE-CONTENTpen);
33 print ("<HRxP>\n");
34 } else {
35 print ("Unable to read from data.txt!<BR>\n");
36 }
37 } // Конец функции ReadFromFile.
38
39 function CreateForm () {
40 /* Функция CreateForm отображает форму. */
41 print ("Add a URL to the data file:\n");
42 print ("<FORM ACTION=\"urls.php\" METHOD=POST>\n");.
43 print ("URL <INPUT TYPE=TEXT NAME=\"Array[URL]\" SIZE=60xBR>\n");
44 print ("Description <TEXTAREA NAME=\"Array[Description] \" ROWS=.5
COLS=40x/TEXTAREAxBR>\n") ;
45 print ("<INPUT TYPE=HIDDEN NAME=\"BeenSubmitted\"
VALUE=\"TRUE\">\n");
46 print ("<INPUT TYPE=SUBMIT NAME=\"SUBMIT\" VALUE=\"Submit!\">
</FORM>\n");
47 } // Конец функции CreateFortn.
48.
49 function HandleForm () {
50 global $Array;
51 $Pattern = "(http://)?(r[:space:]] + !(
52 if (eregi($Pattern, $Array["URL"])) {
53 $Replace = ""a href=\"http://\2\3\" target=\"_new\">\2\3> "/a>";
54 $Array[*URL"] = eregi_replace($Pattern, $Replace,
$Array["URL"]);
55 $CallFunction = WriteToFile ($Array["URL"],
$Array["Description"I);
56 if ($CallFunction) {
57 print ("Your submission-$Array[URL]-has been
received!


\n") ;
58 } else {
59 print ("Your submission was not processed due to a system
error!
\n");
60 }
61 } else {
62 print ("Please enter a valid Web address!\n") ;
63 }
64 } // Конец функции HandleForm.
65
66 /* Следующее условие устанавливает, обрабатывать ли форму
в зависимости от того, имеет ли переменная $BeenSubmitted значение
TRUE. */
67 if ($BeeaSubMitted) {
68 HandleFormf);
69 }
70 ReadProaFileO;
71 CreatePoraiO ;
72 ?>
73 </BODY>
74 </HTML>