Запись в файл
Запись в файл в РНР выполняется сравнительно просто. Для этого можно воспользоваться функцией fwrite() или fputs()
. fputs()
— это псевдоним fwrite()
. Функцию fwrite()
вызывается следующим образом:
fwrite ($fp, $outputstring);
Этот вызов указывает РНР на необходимость записи строки из переменной $outputstring
в файл, на который указывает $fp
.
Новой альтернативой fwrite()
является функция file_put_contents()
, которая имеет следующий прототип:
int file_put_contents (string filename,
string data
[, int flags
[, resource context]])
Эта функция записывает строку, передаваемую в параметреdata
, в файл с именемfilename
без необходимости его открытия и закрытия с помощью функции fopen()
и fclose()
. Функция появилась в РНР 5 и к ней имеется связанная функция file_put_contents()
, которая будет обсуждаться далее. Необязательные параметрыflags
и context
используются, в основном, для записи в удаленные файлы с помощью, например, HTTP или FTP.
Параметры функции fwrite()
Фактически функция fwrite()
принимает три параметра, при этом третий из них является необязательным. Прототип функции fwrite ()
имеет следующий вид:
int fwrite (resource handle, string string [, int length])
Третий параметрlength
задает максимальное число байт, которые требуются записать. Если этот параметр в вызове функции fwrite ()
присутствует, она будет записывать строкуstring
в файл, на который указывает параметр handle
, до тех пор, пока не достигнет конца строки или не запишет length
байт, в зависимости от того, что произойдет раньше.
Длину строки в РНР можно получить с помощью функции strlen()
, например, так:
fwrite ($fp, $outputstring, strlen ($outputstring));
Третий параметр может понадобиться при записи в бинарном режиме, поскольку он помогает избежать некоторых проблем несовместимости между платформами.
Форматы файлов
Когда вы создаете файл данных, подобный используемому в рассматриваемом примере, выбор формата, в котором данные будут храниться, целиком зависит от вас.
Создадим строку, которая представляет одну запись в нашем файле данных. Это можно сделать следующим образом:
$outputstring = $date. "\t".$filtr."фильтров\t"
.$filtr_v. " воздушных фильтров \t"
.$sparkqty. " свечей зажигания \t\$" .$total. "\t" .$address. "\n";
В этом простом примере каждая запись заказа сохраняется в отдельной строке файла. Мы приняли решение размещать в каждой строке по одной записи в связи с тем, что в таком случае в качестве простого разделителя строк используется символ новой строки. Поскольку символы новой строки невидимы, мы представим их в виде управляющей последовательности "\n"
.
Поля данных будут всегда записываться в одном и том же порядке, а в качестве разделителя полей используется символ табуляции. Опять-таки, в связи с тем, что этот символ невидим, он также будет представлен управляющей последовательностью "\t"
. В качестве разделителя можно использовать любой легко читаемый символ.
Разделителем, или ограничителем, должен быть любой символ, который наверняка не будет встречаться в исходных данных, иначе придется подвергнуть исходные данные дополнительной обработке с целью удаления или преобразования всех вхождений такого ограничителя. Обработка пользовательского ввода рассматривается дальше. Пока же предположим, что никто не будет вводить символы табуляции в будущую форму заказа.
Использование специального разделителя полей упрощает разделение данных на отдельные переменные во время повторного чтения. Подробнее этот вопрос рассматривается дальше. Пока каждый заказ мы будем рассматривать как отдельную строку.
Файл orders.txt — пример содержимого файла
16:52, 28 September 100 фильтров масляных 300 фильтров воздушных 500 свечей зажигания 8260 RUB ул. Гоголя д. 4 а
16:53, 28 September 500 фильтров масляных 500 фильтров воздушных 2500 свечей зажигания 29500 RUB ул. Южная д.8 кор.2
16:53, 28 September 500 фильтров масляных 1000 фильтров воздушных 2000 свечей зажигания 33040 RUB ул.Северная д.8 кор.3
Закрытие файла
По завершении использования файла его следует закрыть. Для этой цели служит функция fclose()
, которая вызывается так:
fclose ($fp);
Эта функция возвращает true в случае успешного закрытия файла и false
, если что-то этому помешало. Вероятность ошибки при этом намного меньше, чем при открытии файла, поэтому в данном случае мы решили не производить проверку результата ее выполнения.
Полная версия сценария processorder.php
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС. Результаты заказа</title>
</head>
<body>
<h2>Компания АВС</h2>
<h3>Результаты заказа</h3>
<?php
echo "<p>Заказ обработан</p>";
?>
</body>
</html>
Считывание из файла
Уже сейчас клиенты компании АВС могут отправлять свои заказы через веб, однако если сотрудники компании захотят просмотреть заказы, им придется открывать файлы самостоятельно.
Для того, чтобы служащие компании могли читать заявки, создадим веб-интерфейс, код которого представлен ниже.
vieworders.php —интерфейс персонала для просмотра файлов
<?php
//создать короткое имя переменной
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС. Заказы клиентов</title>
<link href="../../svd.css" rel="stylesheet" type="text/css">
</head>
<body class="text_blok">
<h2>Заказы клиентов</h2>
<?php
@ $fp = fopen ("$DOCUMENT_ROOT/phpstroy/test/orders.txt", 'rb');
if (!$fp)
{
echo '<p><strong>Нет ожидающих заказов. '
.'Пожалуйста, попытайтесь позже. </strong></p>';
exit;
}
while (!feof($fp))
{
$order = fgets ($fp,999);
echo $order. '<br>';
}
fclose ($fp);
?>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
В этом сценарии выполняется последовательность действий, которая упоминалась выше: открытие файла, чтение из файла, закрытие файла.
Теперь подробно рассмотрим функции, используемые в этом сценарии.
Открытие файла для чтения: функция fopen ()
И снова мы открываем файл с помощью функции fopen()
. На этот раз файл открывается только для чтения, поэтому используется режим файла 'r'
:
$fp = fopen ("$DOCUMENT_ROOT/phpstroy/test/orders.txt", 'rb');
Где остановиться: функция feof()
В этом примере мы использовали цикл while
для чтения из файла до тех пор, пока не будет достигнут конец файла. Цикл while
проверяет, достигнут ли конец файла, с помощью функции feof()
:
while (!feof($fp))
Функция feof()
принимает один параметр, и в качестве которого передается указатель файла. Она будет возвращать значение truе
, если указатель файла находится в конце файла.
В данном случае (и вообще при чтении из файла) считывание продолжается до тех пор, пока не будет достигнут символ EOF
.
Построчное чтение: функции fgets (), fgetss (), fgetcsv ()
В рассматриваемом примере для считывания из файла используется функция fgets()
:
$order = fgets ($fp, 999);
Эта функция используется для чтения из файла строк по одной за раз. В данном случае будет считывание выполняться до тех пор, пока не встретится символ новой строки (\n
), символ EOF
или из файла не будут прочитаны 998 байт. Максимальная длина строки равна указанной длине минус 1 байт.
Существует много различных функций, которые используются для чтения файлов. Функция fgets()
vполезна при работе с файлами, содержащими обычный текст, который требуется обрабатывать по частям.
Интересной разновидностью функции fgets()
является функция fgetss()
, имеющая следующий прототип:
string fgetss (resource fp, int lenght, string [allowble_tags]);
Эта функция во многом подобна функции fgets()
и отличается от нее только тем, что она будет удалять любые РНР и HTML-дескрипторы, обнаруженные в строке. Если вы хотите сохранить в файле какие-то конкретные дескрипторы, то вам следует поместить их в строку разрешенных дескрипторов allowble_tags
. Функцию fgetss()
следует использовать для достижения большей безопастности во время чтения файла, записанного кем-то другим или содержащего данные, введенные пользователем. Включение в файл HTML-кода без каких -либо ограничений может привести к нарушению тчательно спланированного форматирования. Отсутствие ограничений на наличие в файле РНР-кода может предоставить злоумышленнику практически полную свободу действий на вашем сервере.
Функция fgetcsv()
представляет собой еще одну разновидность функции fgets ()
. Она имеет следующий прототип:
array fgetcsv (resource fp, int length [, string delimiter [, string enclosure]]);
Эта функция разбивает строки файлов при использовании некоторого символа в качестве разделителя, например, табуляции (как предлагалось ранее) или запятой (которая обычно применяется в электронных таблицах и других приложениях). Если требуется восстановить переменные заказа по отдельности, а не иметь дело со строкой текста, следует прибегнуть к услугам функции fgetcsv()
, но ей необходимо передать разделитель, который служит разделителем полей. Например, оператор
$order = fgetcsv ($fp, 100, "\t");
извлекает строку из файла и разделяет ее при каждом обнаружении символа табуляции (\t
). Полученные при этом строки помещаются в массив (в данном примере это массив $order
).
Параметр длины length
должен быть больше длины самой длинной строки считываемого файла, выраженной в символах.
Параметр вложения enclosure
используется для описания символов, в которые заключается каждое поле в строке. Если эти символы не заданы, по умолчанию принимается символ " (двойные кавычки).
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться