Чтение и запись различных типов данных в текстовый файл

В текстовый файл можно записывать, а затем считывать данные следующих типов PHP: string (строки), number (числа – int, float или double), boolean (булевские), array (массивы) и object (объекты), а также данные, представляющие дату и время (типа int).

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

Числа при выводе автоматически преобразуются в строковое представление, например, число 3.5e-7 преобразуется в строку "3.5e-7". При вводе для перевода строкового представления в числовое необходимо использовать явное преобразование типа с помощью операторов (int), (float) или (double).

Булевские значения (true и false) при выводе автоматически преобразуются в строки "1"и "0". При вводе обратное преобразование выполняется с помощью следующих предложений:

if(строковое-значение == "1")

переменная = true;

else

переменная = false;

Массивы при выводе преобразуются в строку, возвращаемую функцией implode() (см. 4.6.16.6).

Обратное преобразование выполняется с помощью функции explode()(см. 4.6.16.6).

????Если количество элементов выводимого массива является переменным, необходимо перед первым элементом массива вывести текущее значение количества элементов. При вводе это значение будет прочитано первым, и позволяет определить какое количество элементов нужно ввести, как это показано в примере 4.6.143(2).

Даты и время в PHP хранятся в виде меток времени. Перед выводом дату и время (часы, минуты, секунды, месяц, день и год) можно преобразовать, если необходимо, в метку времени (целое число) с помощью функции int mktime(), а получить компоненты времени и даты после чтения метки времени из файла можно с помощью функции getDate() (см. 4.6.18).

Если в строку выводятся несколько данных, т.е. запись, состоящая из нескольких полей, то лучше задать после значения каждого поля, кроме последнего, символ-разделитель, который не встречается в полях записи с помощью функции implode(). При вводе данные можно преобразовать с помощью функции explode()в массив, элементами которого являются значения полей записи.

Пример 4.6.153. Использование разных типов данных в текстовом файле:

Запись посещения пользователем сайта содержит следующие поля: имя пользователя $userName (типа string), пароль пользователя $userPass (типа string), количество посещений сайта пользователем visitNumber (типа int) и дату последнего посещения $lastVisitTime (типа int). Поля данных хранятся в текстовом файле UserParms.txt в каталоге "D:/PHPData/".

Документ HTML Example4-6-153.html выполняет запрос пользователя на Web-сервер в двух режимах:

· регистрация нового пользователя;

· вход в систему зарегистрированного пользователя.

В документе содержится функция clickEventHandler() задания обработчика события щелчка мышью по элементу imgButton:

function clickEventHandler()

{

document.getElementById("imgButton").onclick=

imageClickEvent;

}

Функция imageClickEvent()проверяет введенные данные и, если ошибки в иходных данных отсутствуют, вызывает страницу PHP для регистрации нового пользователя или входа в систему:

function imageClickEvent(evt)

{

// Ошибок в данных нет

isError = false;

// Получение имени пользователя

userName = document.getElementById("userName").value;

// Получение пароля пользователя

pass = document.getElementById("pass").value;

// Если не задано имя пользователя

if(userName == "")

{

// Во входных данных есть ошибки

isError = true;

// Вывод сообщения об ошибке

alert("Не задано имя пользователя");

}

// Если не задан пароль пользователя

if(pass == "")

{

// Во входных данных есть ошибки

isError = true;

// Вывод сообщения об ошибке

alert("Не задан пароль пользователя");

}

// Если в данных есть ошибки

if(isError)

// Выход из функции

return;

// Если Web-браузер – Internet Explorer

if (navigator.userAgent.indexOf("MSIE")!= -1)

// Определение объекта события в IE

evt = window.event;

// Получение элемента imgButton

imgButtonElement =

document.getElementById("imgButton");

// Если выбрана кнопка "Регистрация"

if((evt.clientY - imgButtonElement.offsetTop) <

imgButtonElement.clientHeight/2)

// Режим работы - "reg"

mode="reg";

else

// Режим работы - "call"

mode="call";

// Вызов страницы Example4-6-153.php

// с параметрами

location.href =

"https://127.0.0.1/PHP/Example4-6-153.php?" +

"mode=" + mode + "&userName=" + userName +

"&pass=" + pass;

}

Тело документа HTML Example4-6-153.html содержит текстовые поля для ввода имени и пароля пользователя, а также изображение, при щелчке по которому выполняется вызов функции imageClickEvent():

<body onload="clickEventHandler()">

<h4>Нажмите соответствующую кнопку<br/>

для регистрации или входа в систему:</h4>

<form id="userData">

<table>

<tr>

<td>Введите имя: </td>

<td><input type="text" name="userName"

id="userName" value=""/></td>

</tr><tr>

<td>Введите пароль: </td>

<td><input type="password" name="pass"

value="" id="pass"/></td>

</tr>

</table>

</form>

<br/>

<img src="images/FormImageButton.png"

style="cursor: pointer" id="imgButton"/>

</body>

Обработка запроса выполняется на сервере страницей Example4-6-153.php.

Для вывода заголовков h1 и h2, а также элемента span в этой странице заданы следующие правила стилей:

h2 {color: green}

h1 {color: red}

span {color: navy}

Сценарий PHP на странице содержит следующие предложения:

<%

// Функция вывода времени двумя цифрами

function timeOutput($time)

{

// Если время содержит одну цифру

if($time < 10)

// Дополнение времени до двух цифр

$time = '0'.$time;

// Возврат значения времени

return $time;

}

// Текущий каталог

$currentDir ="D:/PHPData/";

// Переход в каталог "D:/PHPData/"

chdir($currentDir);

// Получение режима

$mode = $_REQUEST['mode'];

// Получение имени пользователя

$userName = $_REQUEST['userName'];

// Получение пароля пользователя

$userPass = $_REQUEST['pass'];

// Получение метки текущего времени

$currentTime = time();

// Если файл UserParms.txt не существует

if(!file_exists("UserParms.txt"))

{

// Если режим регистрации

if($mode == 'reg')

{

// Открытие файла UserParms.txt для записи

$userFileFP =

fopen("UserParms.txt", "w");

// Формирование выходной строки

$outputString = $userName.';'.$userPass.';'.

'1;'.$currentTime;

// Вывод строки в файл

fputs($userFileFP, $outputString);

%>

<h2>Пользователь <span><%=$userName%></span>

зарегистрирован</h2>

<h1>Добро пожаловать на наш сайт</h1>

<%

}

else

{

%>

<h2>Пользователь с именем<span><%=$userName%></span>

не зарегистрирован</h2>

<h1>Для регистрации снова зайдите на сайт</h1>

<%

}

// Закрытие файла UserParms.txt

fclose($userFileFP);

}

else // Если файл UserParms.txt существует

{

// Чтение строк файла UserParms.txt

// в массив

$parmArray = file("UserParms.txt",

FILE_IGNORE_NEW_LINES);

// Если режим регистрации

if($mode == 'reg')

{

// Имя пользователя не найдено в файле

$isNameFound = false;

// Просмотр данных в файле по строкам

for($i = 0; $i < count($parmArray); $i++)

{

// Получение текущей строки файла

// как массива

$stringArray = explode(";", $parmArray[$i]);

// Если имя пользователя в строке

// совпадает с именем

// нового пользователя

if($userName == $stringArray[0])

{

// Имя пользователя найдено в файле

$isNameFound = true;

// Выход из цикла

break;

}

}

// Если имя пользователя не найдено в файле

if(!$isNameFound)

{

// Открытие файла UserParms.txt

// для добавления

$userFileFP =

fopen("UserParms.txt", "a");

// Формирование выходной строки

$outputString = "\n".$userName.';'.$userPass.';'.

'1;'.$currentTime;

// Вывод строки в файл

fputs($userFileFP, $outputString);

%>

<h2>Пользователь <span><%=$userName%></span>

зарегистрирован</h2>

<h1>Добро пожаловать на наш сайт</h1>

<%

}

else

{

%>

<h2>Пользователь с именем <span><%=$userName%></span> уже

есть</h2>

<h1>Для регистрации с другим именем<br/>снова зайдите

на сайт</h1>

<%

}

}

else // Если режим входа в систему

{

// Создание временного файла

$tempFileName = tempnam($currentDir, 'tmp');

// Открытие временного файла для записи

$tempFP = fopen($tempFileName,"w");

// Имя пользователя не найдено в файле

$isNameFound = false;

// Пароль неправильный

$isRightPass = false;

// Просмотр данных в файле по строкам

// и запись во временный файл

for($i = 0; $i < count($parmArray); $i++)

{

// Получение текущей строки файла

// как массива

$stringArray = explode(";", $parmArray[$i]);

// Если имя пользователя в строке

// совпадает с именем пользователя

if($userName == $stringArray[0])

{

// Имя пользователя найдено в файле

$isNameFound = true;

// Если введенный пароль совпадает

// пользователя в строке

if($userPass == $stringArray[1])

{

// Пароль правильный

$isRightPass = true;

// Получение нового количества

// посещений

$visitIndex =

(int)$stringArray[2] + 1;

// Изменение количества

// посещений для пользователя

$stringArray[2] = $visitIndex;

// Получение даты и времени

// последнего посещения

$lastVisitTime =

getDate($stringArray[3]);

// Запись нового времени

// последнего посещения

$stringArray[3] = $currentTime;

// Пребразование массива

в строку

$parmArray[$i] =

implode(";", $stringArray);

}

}

// Запись строки во временный файл

fputs($tempFP, $parmArray[$i]."\n");

}

// Копирование временного файла

// в файл UserParms.txt

copy($tempFileName, $currentDir."UserParms.txt");

// Закрытие временного файла

fclose($tempFP);

// Если имя и пароль

// пользователя - правильные

if($isNameFound && $isRightPass)

{

%>

<h2>Пользователь <span><%=$userName%></span></h2>

<h2>Количество визитов: <span><%=$visitIndex%></span></h2>

<h2>Дата и время последнего визита: <span>

<%

echo timeOutput($lastVisitTime['mday']).'/'.

timeOutput(($lastVisitTime['mon'])).'/'.

$lastVisitTime['year'].' '.timeOutput($lastVisitTime['hours']).':'.

timeOutput($lastVisitTime['minutes']).':'.

timeOutput($lastVisitTime['seconds']);

%>

</span></h2>

<h1>Добро пожаловать на наш сайт</h1>

<%

}

else

{

%>

<h2>Неверное имя <span><%=$userName%></span>

и/или пароль.</h2>

<h1>Для входа в систему снова зайдите на сайт</h1>

<%

}

// Удаление временного файла

unlink($tempFileName);

}

}

%>

Вывод Web-страницы Example4-6-153.html при первом вызове и вводе имени и пароля нового пользователя имеет следующий вид:

После нажания на кнопку Регистрация страница Example4-6-153.php выведет следующее сообщение:

При повторном вызове Web-страницы, вводе имени и пароля, а затем нажатия кнопки Вход в систему страница Example4-6-153.php выведет следующее сообщение:

При неверном вводе имени и/или пароля пользователя будет выведено следующее сообщение:

При повторной попытке регистрации с тем же именем будет выведено следующее сообщение:

Если запись в файл и чтение из файла выполняются в сценарии неоднократно, удобнее ввести класс, свойствами которого являются поля записи. Созданные объекты класса при выводе преобразуются в строки с помощью функции serialize(), а обратное преобразование при вводе в объект того же класса выполняется с помощью функции unserialize() (см. 4.6.11.6).

Пример 4.6.154. Использование объектов в текстовом файле:

1. Сведения о пользователе сайта содержит следующие поля: имя пользователя $userName (типа string) – фамилия пользователя и его инициалы, $userPhone (типа string) – телефон пользователя и $userEMail (типа string) – адрес e-mail пользователя. Эти поля являются свойствами объекта класса UserRecord.

Поля данных хранятся в текстовом файле UserData.txt в каталоге "D:/PHPData/".

Документ HTML Example4-6-154-1.html выполняет регистрацию новых пользователей на Web-сервере.

В документе содержится функция clickEventHandler() задания обработчика события щелчка мышью по элементу imgButton:

function clickEventHandler()

{

document.getElementById("imgButton").onclick=

imageClickEvent;

}

Функция imageClickEvent() проверяет введенные данные и, если ошибки в иходных данных отсутствуют, вызывает страницу PHP для регистрации данных о новом пользователе:

function imageClickEvent(evt)

{

// Получение имени пользователя

userName = document.getElementById("userName").value;

// Получение телефона пользователя

userPhone = document.getElementById("userPhone").value;

// Получение e-mail пользователя

userEMail = document.getElementById("userEMail").value;

// Если не задано хотя бы одно из полей

if(userName == "" || userPhone == "" ||

userEMail == "")

{

// Вывод сообщения об ошибке

alert("Заданы не все поля");

// Выход из функции

return;

}

// Ошибок в данных нет

isError = false;

// Шаблон для фамилии и инициалов

reName = /[А-Я][а-я]{2,} [А-Я]\.[А-Я]\./;

// Если фамилия и инициалы

/ не соответствуют шаблону

if(!reName.test(userName))

{

// Во входных данных есть ошибки

isError = true;

// Вывод сообщения об ошибке

alert("Неверно задана фамилия и инициалы");

}

// Шаблон для номера телефона

rePhone = /\d\d\d-\d\d\d-\d\d-\d\d/;

// Если номер телефона не соответствует шаблону

if(!rePhone.test(userPhone))

{

// Во входных данных есть ошибки

isError = true;

// Вывод сообщения об ошибке

alert("Неверно задан номер телефона");

}

// Шаблон для адреса e-mail

reEMail =

/([A-Za-z]|\d){2,}@([a-z]|\d){2,}\.([a-z]|\d){2,}/;

// Если адрес e-mail не соответствует шаблону

if(!reEMail.test(userEMail))

{

// Во входных данных есть ошибки

isError = true;

// Вывод сообщения об ошибке

alert("Неверно задан адрес e-mail");

}

// Если в данных есть ошибки

if(isError)

// Выход из функции

return;

// Вызов страницы Example4-6-154-1.php

location.href =

"https://127.0.0.1/PHP/Example4-6-154-1.php?" +

"userName=" + userName + "&userPhone=" + userPhone +

"&userEMail=" + userEMail;

}

Тело документа HTML Example4-6-154-1.html содержит текстовые поля для ввода имени, телефона и адреса e-mail пользователя, а также изображение, при щелчке по которому выполняется вызов функции imageClickEvent():

<body onload="clickEventHandler()">

<h4>После ввода данных нажмите кнопку<br/>

для регистрации или входа в систему:</h4>

<form id="userData">

<table>

<tr>

<td>Введите фамилию и инициалы: </td>

<td><input type="text" name="userName"

id="userName" value="Фамилия И.О."/></td>

</tr><tr>

<td>Введите номер телефона: </td>

<td><input type="text" name="userPhone"

value="XXX-XXX-XX-XX" id="userPhone"/></td>

</tr>

<tr>

<td>Введите адрес e-mail: </td>

<td><input type="text" name="userEMail"

value="xxxxxx@xxxx.xxx" id="userEMail"/></td>

</tr>

</table>

</form>

<br/>

<img src="images/RegistrationButton.png"

style="cursor: pointer" id="imgButton"/>

</body>

Объявление класса UserRecord хранится в отдельном файле UserRecord.php в каталоге D:/PHPData/:

<%

// Объявление класса UserRecord

// для записи данных о пользователе

class UserRecord

{

// Функция-конструктор класса

function __construct($userName = "",

$userPhone = "", $userEMail = "")

{

// Получение фамилии и

// инициалов пользователя

$this->userName = $userName;

// Получение номера телефона пользователя

$this->userPhone = $userPhone;

// Получение адреса e-mail пользователя

$this->userEMail = $userEMail;

}

}

%>

Обработка запроса выполняется на сервере страницей Example4-6-154-1.php.

Для вывода заголовка h1 и элемента span в этой странице заданы следующие правила стилей:

h2 {color: green}

span {color: navy}

Сценарий PHP на странице содержит следующие предложения:

<%

// Текущий каталог

$currentDir ="D:/PHPData/";

// Переход в каталог "D:/PHPData/"

chdir($currentDir);

// Вставка определения класса UserRecord

require 'UserRecord.php';

// Получение имени пользователя

$userName = $_REQUEST['userName'];

// Получение номера телефона пользователя

$userPhone = $_REQUEST['userPhone'];

// Получение адреса e-mail пользователя

$userEMail = $_REQUEST['userEMail'];

// Создание объекта класса UserRecord

$newUserRecord = new UserRecord($userName,

$userPhone, $userEMail);

// Сериализация объекта $newUserRecord

// в строку

$outputString = serialize($newUserRecord);

if(!file_exists("UserData.txt"))

{

// Открытие файла UserData.txt для записи

$userFileFP = fopen("UserData.txt", "w");

// Вывод строки в файл

fputs($userFileFP, $outputString);

}

else

{

// Открытие файла UserData.txt для добавления

$userFileFP = fopen("UserData.txt", "a");

// Вывод строки в файл

fputs($userFileFP, "\n".$outputString);

}

%>

<h2>Пользователь <span><%=$userName%></span>

зарегистрирован</h2>

Вывод Web-страницы Example4-6-154-1.html при вводе имени, телефона и адреса e-mail нового пользователя имеет следующий вид:

После нажания на кнопку Регистрация страница Example4-6-154-1.php выведет следующее сообщение:

2. Поиск в файле UserData.txt, созданном в предыдущем примере 4.6.154(1), записей, в поле имени пользователя $userName которого содержится заданная строка.

Документ HTML Example4-6-154-2.html выполняет запрос на поиск пользователей на Web-сервере.

Функция clickEventHandler() в документе аналогична одноименной функции в примере 4.6.154(1), а функция Функция imageClickEvent() получает строку поиска и вызывает страницу PHP для для поиска и вывода записей пользователей:

function imageClickEvent(evt)

{

// Получение строки поиска

searchString =

document.getElementById("searchString").value;

// Вызов страницы Example4-6-154-2.php

location.href =

"https://127.0.0.1/PHP/Example4-6-154-2.php?" +

"searchString=" + searchString;

}

Обработка запроса выполняется на сервере страницей Example4-6-154-2.php.

Для вывода заголовка h1 и элемента span в этой странице заданы следующие правила стилей:

H1 {color: red}

h2 {color: green}

span {color: navy; font-weight: bold}

Сценарий PHP на странице содержит следующие предложения (файл UserRecord.php в каталоге D:/PHPData/ описан в примере 4.6.154(1)):

<%

// Текущий каталог

$currentDir ="D:/PHPData/";

// Переход в каталог "D:/PHPData/"

chdir($currentDir);

// Вставка определения класса UserRecord

require 'UserRecord.php';

// Получение строки поиска

$searchString = $_REQUEST['searchString'];

// Если файл UserData.txt не существует

if(!file_exists("UserData.txt"))

{

%>

<h2>Не зарегистрировано ни одного пользователя</h2>

<%

}

else

{

// Чтение строк файла UserData.txt

// в массив

$parmArray = file("UserData.txt",

FILE_IGNORE_NEW_LINES);

// Имя пользователя не найдено в файле

$isNameFound = false;

// Просмотр данных в файле по строкам

for($i = 0; $i < count($parmArray); $i++)

{

// Десериализация текущей строки

// в объект $newUserRecord

$currentUserRecord = unserialize($parmArray[$i]);

// Если имя пользователя в строке

// содержит строку поиска

if(strpos($currentUserRecord->userName,

$searchString)!== false)

{

// Если имя пользователя найдено

// первый раз

if(!$isNameFound)

{

// Имя пользователя найдено в файле

$isNameFound = true;

// Вывод заголовка таблицы

%>

<h2>Пользователи, содержащие в поле<br/>фамилии и инициалов

строку "<span><%=$searchString%></span>":</h2>

<table border="2">

<tr>

<th>Фамилия и инициалы</th>

<th>Номер телефона</th>

<th>Адрес e-mail</th>

</tr>

<%

}

// Вывод строки таблицы

%>

<tr>

<td><span><%=$currentUserRecord->userName%></span></td>

<td><span><%=$currentUserRecord->userPhone%></span></td>

<td><span><%=$currentUserRecord->userEMail%></span></td>

</tr>

<%

}

}

// Если имя пользователя найдено в файле

if($isNameFound)

{

%>

</table>

<%

}

else

{

%>

<h1>В поле фамилии и инициалов пользователей<br/>не найдена

строка "<span><%=$searchString%></span>":<h2>

<%

}

}

%>

Вывод Web-страницы Example4-6-154-2.html при вводе строки поиска имеет следующий вид:

После нажания на кнопку Поиск страница Example4-6-154-2.php выведет следующее сообщение:

Если же в поле поиска будет сседена строка "Ивани", то будет выведено следующее сообщение:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: