В текстовый файл можно записывать, а затем считывать данные следующих типов 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 выведет следующее сообщение:
Если же в поле поиска будет сседена строка "Ивани", то будет выведено следующее сообщение: