Вообще говоря, в PHP не существует функции, предназначенной именно для . Что значит "открывает файл"? Это значит, что
resource fopen ( имя_файла, тип_доступа
[, use_include_path])
В результате работы эта функция возвращает указатель (типа ресурс) на открытый ею файл. В качестве параметров этой функции передаются: имя файла, который нужно открыть, . Есть еще один опциональный параметр, но о нем мы говорить не будем, дабы не усложнять изложение. Обсудим подробнее каждый из этих трех параметров.
Параметр имя_файла должен быть строкой, содержащей правильное локальное имя файла или URL-адрес файла в сети. Если имя файла начинается с указания протокола доступа (например, http://... или ftp://...), то интерпретатор считает это имя адресом URL и ищет обработчик указанного в URL протокола. Если обработчик найден, то PHP проверяет, разрешено ли работать с объектами URL как с обычными файлами (директива allow_url_fopen ). Если allow_url_fopen=off, то функция
Параметр use_include_path, установленный в значение 1 или TRUE, заставляет интерпретатор искать указанный в файл в . Напомним, что - это директива из она используется функциями include() и require().
Параметр тип_доступа может принимать одно из следующих значений (см. таб. 9.1).
Итак, чтобы создать файл, нужно, как бы нелепо это ни звучало, открыть несуществующий файл на запись.
<?php
$h = fopen("my_file.html","w");
/* открывает на запись файл my_file.html,
если он существует, или создает пустой
файл с таким именем, если его еще нет */
$h = fopen("dir/another_file.txt","w+");
/* открывает на запись и чтение или создает
файл another_file.txt в директории dir */
$h = fopen(
"http://www.server.ru/dir/file.php","r");
/* открывает на чтение файл, находящийся по
указанному адресу*/
?>
Создавая файл, нужно учитывать, под какой операционной системой вы работаете, и под какой ОС предположительно этот файл будет читаться. Дело в том, что разные операционные системы по-разному отмечают конец строки. В Unix-подобных ОС конец строки обозначается \n, в системах типа Windows - \r\n. Windows предлагает специальный флаг t для перевода b, используемый чаще всего для r следует использовать rt, чтобы перекодировать все \r\n. Если не использовать флаг b при открытии b при открытии файлов с помощью .
| Тип доступа | Описание |
|---|---|
| r | Открывает файл только для чтения; устанавливает указатель позиции в файле на начало файла. |
| r+ | Открывает файл для чтения и записи; устанавливает указатель файла на его начало. |
| w | Открывает файл только для записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его. |
| w+ | Открывает файл для чтения и записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его. |
| a | Открывает файл только для записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его. |
| a+ | Открывает файл для чтения и записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его. |
| x | Создает и открывает файл только для записи; помещает указатель файла на его начало. Если файл уже
существует, то возвращает false и генерируется
предупреждение. Если файл не существует, то делается попытка создать его.
Этот тип доступа поддерживается начиная с версии PHP 4.3.2 и работает только с
локальными файлами. |
| x+ | Создает и открывает файл для чтения и записи;
помещает указатель файла на его начало. Если файл
уже существует, то возвращает false и генерируется
предупреждение. Если файл не существует, то делается
попытка создать его. Этот тип доступа поддерживается,
начиная с версии PHP 4.3.2, и работает только с локальными файлами. |
Что происходит, если открыть или создать файл с помощью не удается? В этом случае PHP генерирует предупреждение, а функция возвращает как результат своей работы значение false. Такого рода предупреждения можно "подавить" (запретить) с помощью символа
Например, такая команда не выведет предупреждения, даже если открыть файл не удалось:
$h = @fopen("dir/another_file.txt","w+");
Таким образом, функция позволяет создать только лишь пустой файл и сделать его
Прежде чем ответить на эти вопросы, рассмотрим, как соединение.
После выполнения необходимых действий с файлом, будь то , нужно fclose(). Синтаксис у нее следующий:
fclose (указатель на файл)
Эта функция возвращает TRUE, если соединение успешно FALSE - в противном случае. Параметр этой функции должен указывать на файл, успешно открытый, например, с помощью функции .
<?php
$h = fopen("my_file.html","w");
fclose($h);
?>
Конечно, если не закрывать соединение с файлом, никаких ошибок выполнения скрипта не произойдет. Но в целом для сервера это может иметь серьезные последствия. Например, хакер может воспользоваться открытым соединением и записать в файл вирус, не говоря уже о лишней трате ресурсов сервера. Так что советуем всегда закрывать соединение с файлом после выполнения необходимых действий.
Для того чтобы , можно использовать функцию fwrite(). Синтаксис у нее следующий:
int fwrite ( указатель на файл,
строка [, длина])
Эта функция записывает содержимое строки в файл, на который указывает указатель на файл. Если указан дополнительный аргумент, то запись заканчивается после того, как записано количество символов, равное значению этого аргумента, или когда будет достигнут конец строки.
В результате своей работы функция fwrite() возвращает число записанных байтов или false, в случае ошибки.
Пример 9.3. Пусть в нашей рабочей директории нет файла my_file.html. Создадим его и запишем в него строку текста:
<?php
$h = fopen("my_file.html","w");
$text = "Этот текст запишем в файл.";
if (fwrite($h,$text))
echo "Запись прошла успешно";
else
echo "Произошла ошибка при записи данных";
fclose($h);
?>
В результате работы этого скрипта в браузере мы увидим сообщение о том, что запись прошла успешно, а в файле my_file.html появится строка "Этот текст запишем в файл.". Если бы этот
Если же мы напишем такой скрипт:
<?php
$h = fopen("my_file.html","a");
$add_text = "Добавим текст в файл.";
if(fwrite($h,$add_text,7))
echo "Добавление текста прошло
успешно<br>";
else echo "Произошла ошибка при
добавлении данных<br>";
fclose($h);
?>
то к строке, уже существующей в файле my_file.html, добавится еще семь символов из строки, содержащейся в переменной $add_text, т.е. слово "Добавим"
Функция fwrite() имеет псевдоним fputs(), используемый таким же образом, что и сама функция.
Далее мы рассмотрим, какие методы
Если мы хотим прочитать данные из существующего файла, одной функции , как и в случае с file, и т.п.
Эта функция осуществляет такой:
string fread (указатель на файл, длина)
При вызове этой функции происходит . Чтение данных происходит до тех пор, пока не встретится конец файла или пока не будет прочитано указанное параметром длина число байтов.
В результате работы функция возвращает строку со
Как вы заметили, в этой функции параметр длина - обязательный. Следовательно, если мы хотим filesize(имя файла). В случае ошибки эта функция вернет false. К сожалению, ее можно использовать только для получения
Пример 9.4. Прочитаем содержимое файла my_file.html
<?php
$h = fopen("my_file.html","r+");
// открываем файл на запись и чтение
$content = fread($h,
filesize("my_file.html"));
// считываем содержимое файла в строку
fclose($h); // закрываем соединение с файлом
echo $content;
// выводим содержимое файла
// на экран браузера
?>
Для того чтобы rb или ему подобных, содержащих символ b в конце.
Функция filesize() кэширует результаты своей работы. Если изменить содержимое файла my_file.html и снова запустить приведенный выше скрипт, то результат его работы не изменится. Более того, если запустить скрипт, считывающий данные из этого файла с помощью другой функции (например, fgets ), то результат может оказаться таким, как если бы файл не изменился. Чтобы этого избежать, нужно очистить статический кэш, добавив в код программы команду clearstatcache() ;
С помощью функции fgets() можно , за исключением того, что длину
string fgets ( указатель на файл, [ длина])
В результате работы функция fgets() возвращает строку длиной ( длина-1 ) байт из файла, на который указывает указатель на файл. Чтение заканчивается, если прочитано ( длина-1 ) символов или встретился символ перевода строки или конец файла. Напомним, что в PHP один символ - это один байт. Если длина fgets() возвращает false. Для версий PHP начиная с 4.3 эта
<?php
$h = fopen("my_file.html","r+");
$content = fgets($h,2);
// считает первый символ из
// первой строки файла my_file.html
fclose($h);
echo $content;
?>
Обе функции, и fgets(), прекращают считывание данных из файла, если встречают конец файла. В PHP есть специальная функция, проверяющая, смотрит ли указатель позиции файла на конец файла. Это булева функция feof(), в качестве параметра которой передается указатель на соединение с файлом.
Например, вот так можно my_file.html:
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgets($h);
echo $content,"<br>";
}
fclose($h);
?>
Существует разновидность функции fgets() - функция fgetss(). Она тоже позволяет fgetss() такой:
string fgetss(указатель на файл, длина [, допустимые теги])
Обратите внимание, что здесь аргумент длина обязательный.
Пример 9.6. Пусть у нас имеется файл my_file.html следующего содержания:
<h1>Без труда не вынешь и рыбку из пруда.</h1> <b>Тише едешь - дальше будешь</b> У семи нянек<i> дитя без глазу</i>.
Выведем на экран все строки файла my_file.html, удалив из них все теги, кроме <b> и <i>:
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgetss($h,1024,'<b><i>');
echo $content,"<br>";
}
fclose($h);
?>
В результате работы этого скрипта получим:
Без труда не вынешь и рыбку из пруда. Тише едешь - дальше будешь У семи нянек дитя без глазу.
Естественно, если можно считывать информацию из файла построчно, то можно fgetc(). Легко догадаться, что синтаксис у нее следующий:
string fgetc ( указатель на файл )
Эта функция возвращает символ из файла, на который ссылается указатель на файл, и значение, вычисляемое как FALSE, если встречен конец строки.
Вот так, например, можно
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgetc($h);
echo $content,"<br>";
}
fclose($h);
?>
На самом деле для того чтобы прочитать содержимое файла, открывать соединение с ним посредством функции совсем не обязательно. В PHP есть функции, которые позволяют делать это, используя лишь имя файла. Это функции и . Рассмотрим каждую из них подробнее.
Синтаксис:
int readfile ( имя_файла
[, use_include_path])
Функция считывает файл, имя которого передано ей в качестве параметра имя_файла, и выводит его содержимое на экран. Если дополнительный аргумент use_include_path имеет значение TRUE, то поиск файла с заданным именем производится и по директориям, входящим в .
В программу эта функция возвращает число FALSE. Сообщения об ошибке в этой функции можно подавить оператором
Пример 9.7. Следующий скрипт выведет на экран содержимое файла my_file1.html и "Error in .
<?php
$n = @readfile ("my_file1.html");
/* выводит на экран содержимое файла и
записывает его размер в переменную $n */
if (!$n) echo "Error in readfile";
/* если функция readfile() выполнилась
с ошибкой, то $n=false и выводим
сообщение об ошибке */
else echo $n;
// если ошибки не было, то выводим число
// считанных символов
?>
С помощью функции можно читать содержимое удаленных файлов, указывая их URL-адрес в качестве имени файла, если эта опция не отключена в настройках сервера.
Сразу же выводить содержимое файла на экран не всегда удобно. Порой нужно записать информацию из файла в переменную, чтобы в дальнейшем произвести с ней какие-либо действия. Для этого можно использовать функцию file() или .
Функция предназначена для считывания информации из файла в переменную типа , за исключением того, что в результате работы она возвращает массив:
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
Что за массив возвращает эта функция? Каждый элемент данного массива является строкой в файле, информацию из которого мы считываем (его имя задано аргументом имя_файла ). , как и все уже рассмотренные, возвращает false. Дополнительный аргумент use_include_path опять же определяет, искать или нет данный файл в директориях . Открывать удаленные файлы с помощью этой функции тоже можно, если не запрещено сервером. Начиная с PHP 4.3 работа с
Например, у нас имеется файл my_file.html следующего содержания:
<h1>Без труда не вынешь
и рыбку из пруда.</h1>
<b>Тише едешь - дальше будешь</b>
Прочитаем его содержимое с помощью функции file():
<?php
$arr = file ("my_file.html");
foreach($arr as $i => $a) echo $i,": ",
htmlspecialchars($a), "<br>";
?>
В результате на экран будет выведено следующее сообщение:
0: <h1>Без труда не вынешь
и рыбку из пруда.</h1>
1: <b>Тише едешь - дальше будешь</b>
В версиях PHP начиная с 4.3 появилась возможность считывать содержимое файла в строку. Делается это с помощью функции . Как и две предыдущие функции, в качестве параметров она принимает значение имени файла и, возможно, указание искать его в директориях . Для порядка все равно приведем ее синтаксис:
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
Эта функция абсолютно идентична функции file(), только возвращает она содержимое файла в виде строки. Кроме того, она безопасна для обработки бинарных данных и может считывать информацию из удаленных файлов, если это не запрещено настройками сервера.
Итак, создавать файл мы научились, записывать данные в него - научились, считывать данные из файла - тоже научились. Но вот вопрос: а что если файла, с которым мы пытаемся проделать все эти операции, не существует? Или он недоступен для чтения или записи? Очевидно, что в таком случае ни одна из изученных нами функций работать не будет и PHP выдаст сообщение об ошибке. Чтобы отслеживать такого рода ошибки, можно использовать функции file_exists(), is_writable(), is_readable().
Синтаксис:
bool file_exists (имя файла или директории)
Функция file_exists() проверяет, существует ли файл или директория, имя которой передано ей в качестве аргумента. Если директория или файл в файловой системе сервера существует, то функция возвращает TRUE, в противном случае - FALSE. Результат работы этой функции кэшируется. Соответственно очистить кэш можно, как уже отмечалось, с помощью функции clearstatcache(). Для нелокальных файлов использовать функцию file_exists() нельзя.
<?php
$filename = 'c:/users/files/my_file.html';
if (file_exists($filename)) {
print "Файл <b>$filename</b> существует";
} else {
print "Файл <b>$filename</b>
НЕ существует";
}
?>
Если кроме проверки is_writable() или ее псевдоним - функцию is_writeable().
Синтаксис:
bool is_writable (имя файла или директории)
Эта функция возвращает TRUE, если файл (или директория) существует и is_writable кэшируются.
Если кроме проверки is_readable().
Синтаксис:
bool is_readable (имя файла)
Эта функция работает подобно функции is_writable().
<?php
$filename = 'c:/users/files/my_file.html';
if (is_readable($filename)) {
print "Файл <b>$filename</b> существует
и доступен для чтения";
} else {
print "Файл <b>$filename</b>
НЕ существует или
НЕ доступен для чтения";
}
?>
Последнее, что мы хотим изучить из действий над файлами, - это unlink(). Синтаксис этой функции можно описать следующим образом:
bool unlink ( имя_файла)
Данная функция удаляет файл, имеющий имя имя_файла, возвращает TRUE в случае успеха этой операции и FALSE - в случае ошибки. Чтобы удалить файл, нужно тоже иметь соответствующие права доступа к нему (например,
<?php $filename = 'c:/users/files/my_file.html'; unlink($filename); // удаляем файл с именем // c:/users/files/my_file.html ?>
Теперь решим более сложную и часто возникающую на практике задачу enctype в теге form со значением multipart/form-data, а также элемент input типа file.
Пример 9.11.
<form enctype="multipart/form-data"
action="parse.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE"
value="30000" />
Загрузить файл: <input type="file"
name="myfile" /><br>
<input type="submit"
value="Отправить файл" />
</form>
Заметим, что мы добавили в форме
(рис 9.1) Пример формы для загрузки файла на серверТеперь нужно написать скрипт, который будет обрабатывать полученный файл.
Вся информация о загруженном на сервер файле содержится в глобальном массиве $_FILES. Этот массив появился начиная с PHP 4.1.0. Если включена директива , то значения переданных переменных доступны просто по их именам.
Если мы загрузили с компьютера-клиента файл с именем print_r($_FILES) ; выведет на экран следующее:
Array ( [myfile] =>
Array ( [name] => critics.htm
[type] => text/html
[tmp_name] => C:\WINDOWS\TEMP\php49F.tmp
[error] => 0
[size] => 15136
)
)
Вообще говоря, массив $_FILES всегда имеет следующие элементы:
$_FILES['myfile']['name'] - имя, которое имел файл на машине клиента.$_FILES['myfile']['type'] - mime-тип отправленного файла, если браузер предоставил эту информацию. В нашем примере это text/html.$_FILES['myfile']['size'] - $_FILES['myfile']['tmp_name'] - временное имя файла, под которым он был сохранен на сервере.$_FILES['myfile']['error'] - Здесь 'myfile' - это имя элемента формы, с помощью которого была произведена name, type и т. д.) остаются неизменными для любой формы.
Если , то доступны также дополнительные переменные, такие как $myfile_name, которая эквивалентна $_FILES['myfile']['name'], и т.п.
$_FILES['myfile']['error'] может иметь пять значений:
0 - ошибки не произошло, файл загружен успешно
1 - загружаемый файл превышает upload_max_filesize в
2 - загружаемый файл превышает MAX_FILE_SIZE формы html
3 - файл был загружен частично
4 - файл загружен не был
По умолчанию загруженные файлы сохраняются во временной директории сервера, если другая директория не указана с помощью опции upload_tmp_dir в . Переместить загруженный файл в нужную директорию можно с помощью функции move_uploaded_file().
Функция move_uploaded_file() имеет следующий синтаксис:
bool move_uploaded_file (временное_имя_файла,
место_назначения )
Эта функция проверяет, действительно ли файл, обозначенный строкой временное_имя_файла, был загружен через механизм загрузки HTTP методом POST. Если это так, то файл перемещается в файл, заданный параметром место_назначения (этот параметр содержит как путь к новой директории для хранения, так и новое имя файла).
Если временное_имя_файла задает неправильный загруженный файл, то никаких действий произведено не будет, и move_uploaded_file() вернет FALSE. То же самое произойдет, если файл по каким-то причинам не может быть перемещен. В этом случае интерпретатор выведет соответствующее предупреждение. Если файл, заданный параметром место_назначения, существует, то функция move_uploaded_file() перезапишет его.
<?
/* В версиях PHP, более ранних,
чем 4.1.0, вместо массива
$_FILES нужно использовать
массив $HTTP_POST_FILES */
$uploaddir = 'c:/uploads/';
// будем сохранять загружаемые
// файлы в эту директорию
$destination = $uploaddir .
$_FILES['myfile']['name'];
// имя файла оставим неизменным
print "<pre>";
if (move_uploaded_file(
$_FILES['myfile']['tmp_name'],
$destination)) {
/* перемещаем файл из временной папки
в выбранную директорию для хранения */
print "Файл успешно загружен <br>";
} else {
echo "Произошла ошибка при загрузке файла.
Некоторая отладочная информация:<br>";
print_r($_FILES);
}
print "</pre>";
?>
Подведем итоги. В этой лекции мы изучили, как создавать файлы с помощью языка PHP, как
Вообще говоря, в PHP не существует функции, предназначенной именно для . Что значит "открывает файл"? Это значит, что
resource fopen ( имя_файла, тип_доступа
[, use_include_path])
В результате работы эта функция возвращает указатель (типа ресурс) на открытый ею файл. В качестве параметров этой функции передаются: имя файла, который нужно открыть, . Есть еще один опциональный параметр, но о нем мы говорить не будем, дабы не усложнять изложение. Обсудим подробнее каждый из этих трех параметров.
Параметр имя_файла должен быть строкой, содержащей правильное локальное имя файла или URL-адрес файла в сети. Если имя файла начинается с указания протокола доступа (например, http://... или ftp://...), то интерпретатор считает это имя адресом URL и ищет обработчик указанного в URL протокола. Если обработчик найден, то PHP проверяет, разрешено ли работать с объектами URL как с обычными файлами (директива allow_url_fopen ). Если allow_url_fopen=off, то функция
Параметр use_include_path, установленный в значение 1 или TRUE, заставляет интерпретатор искать указанный в файл в . Напомним, что - это директива из она используется функциями include() и require().
Параметр тип_доступа может принимать одно из следующих значений (см. таб. 9.1).
Итак, чтобы создать файл, нужно, как бы нелепо это ни звучало, открыть несуществующий файл на запись.
<?php
$h = fopen("my_file.html","w");
/* открывает на запись файл my_file.html,
если он существует, или создает пустой
файл с таким именем, если его еще нет */
$h = fopen("dir/another_file.txt","w+");
/* открывает на запись и чтение или создает
файл another_file.txt в директории dir */
$h = fopen(
"http://www.server.ru/dir/file.php","r");
/* открывает на чтение файл, находящийся по
указанному адресу*/
?>
Создавая файл, нужно учитывать, под какой операционной системой вы работаете, и под какой ОС предположительно этот файл будет читаться. Дело в том, что разные операционные системы по-разному отмечают конец строки. В Unix-подобных ОС конец строки обозначается \n, в системах типа Windows - \r\n. Windows предлагает специальный флаг t для перевода b, используемый чаще всего для r следует использовать rt, чтобы перекодировать все \r\n. Если не использовать флаг b при открытии b при открытии файлов с помощью .
| Тип доступа | Описание |
|---|---|
| r | Открывает файл только для чтения; устанавливает указатель позиции в файле на начало файла. |
| r+ | Открывает файл для чтения и записи; устанавливает указатель файла на его начало. |
| w | Открывает файл только для записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его. |
| w+ | Открывает файл для чтения и записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его. |
| a | Открывает файл только для записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его. |
| a+ | Открывает файл для чтения и записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его. |
| x | Создает и открывает файл только для записи; помещает указатель файла на его начало. Если файл уже
существует, то возвращает false и генерируется
предупреждение. Если файл не существует, то делается попытка создать его.
Этот тип доступа поддерживается начиная с версии PHP 4.3.2 и работает только с
локальными файлами. |
| x+ | Создает и открывает файл для чтения и записи;
помещает указатель файла на его начало. Если файл
уже существует, то возвращает false и генерируется
предупреждение. Если файл не существует, то делается
попытка создать его. Этот тип доступа поддерживается,
начиная с версии PHP 4.3.2, и работает только с локальными файлами. |
Что происходит, если открыть или создать файл с помощью не удается? В этом случае PHP генерирует предупреждение, а функция возвращает как результат своей работы значение false. Такого рода предупреждения можно "подавить" (запретить) с помощью символа
Например, такая команда не выведет предупреждения, даже если открыть файл не удалось:
$h = @fopen("dir/another_file.txt","w+");
Таким образом, функция позволяет создать только лишь пустой файл и сделать его
Прежде чем ответить на эти вопросы, рассмотрим, как соединение.
После выполнения необходимых действий с файлом, будь то , нужно fclose(). Синтаксис у нее следующий:
fclose (указатель на файл)
Эта функция возвращает TRUE, если соединение успешно FALSE - в противном случае. Параметр этой функции должен указывать на файл, успешно открытый, например, с помощью функции .
<?php
$h = fopen("my_file.html","w");
fclose($h);
?>
Конечно, если не закрывать соединение с файлом, никаких ошибок выполнения скрипта не произойдет. Но в целом для сервера это может иметь серьезные последствия. Например, хакер может воспользоваться открытым соединением и записать в файл вирус, не говоря уже о лишней трате ресурсов сервера. Так что советуем всегда закрывать соединение с файлом после выполнения необходимых действий.
Для того чтобы , можно использовать функцию fwrite(). Синтаксис у нее следующий:
int fwrite ( указатель на файл,
строка [, длина])
Эта функция записывает содержимое строки в файл, на который указывает указатель на файл. Если указан дополнительный аргумент, то запись заканчивается после того, как записано количество символов, равное значению этого аргумента, или когда будет достигнут конец строки.
В результате своей работы функция fwrite() возвращает число записанных байтов или false, в случае ошибки.
Пример 9.3. Пусть в нашей рабочей директории нет файла my_file.html. Создадим его и запишем в него строку текста:
<?php
$h = fopen("my_file.html","w");
$text = "Этот текст запишем в файл.";
if (fwrite($h,$text))
echo "Запись прошла успешно";
else
echo "Произошла ошибка при записи данных";
fclose($h);
?>
В результате работы этого скрипта в браузере мы увидим сообщение о том, что запись прошла успешно, а в файле my_file.html появится строка "Этот текст запишем в файл.". Если бы этот
Если же мы напишем такой скрипт:
<?php
$h = fopen("my_file.html","a");
$add_text = "Добавим текст в файл.";
if(fwrite($h,$add_text,7))
echo "Добавление текста прошло
успешно<br>";
else echo "Произошла ошибка при
добавлении данных<br>";
fclose($h);
?>
то к строке, уже существующей в файле my_file.html, добавится еще семь символов из строки, содержащейся в переменной $add_text, т.е. слово "Добавим"
Функция fwrite() имеет псевдоним fputs(), используемый таким же образом, что и сама функция.
Далее мы рассмотрим, какие методы
Если мы хотим прочитать данные из существующего файла, одной функции , как и в случае с file, и т.п.
Эта функция осуществляет такой:
string fread (указатель на файл, длина)
При вызове этой функции происходит . Чтение данных происходит до тех пор, пока не встретится конец файла или пока не будет прочитано указанное параметром длина число байтов.
В результате работы функция возвращает строку со
Как вы заметили, в этой функции параметр длина - обязательный. Следовательно, если мы хотим filesize(имя файла). В случае ошибки эта функция вернет false. К сожалению, ее можно использовать только для получения
Пример 9.4. Прочитаем содержимое файла my_file.html
<?php
$h = fopen("my_file.html","r+");
// открываем файл на запись и чтение
$content = fread($h,
filesize("my_file.html"));
// считываем содержимое файла в строку
fclose($h); // закрываем соединение с файлом
echo $content;
// выводим содержимое файла
// на экран браузера
?>
Для того чтобы rb или ему подобных, содержащих символ b в конце.
Функция filesize() кэширует результаты своей работы. Если изменить содержимое файла my_file.html и снова запустить приведенный выше скрипт, то результат его работы не изменится. Более того, если запустить скрипт, считывающий данные из этого файла с помощью другой функции (например, fgets ), то результат может оказаться таким, как если бы файл не изменился. Чтобы этого избежать, нужно очистить статический кэш, добавив в код программы команду clearstatcache() ;
С помощью функции fgets() можно , за исключением того, что длину
string fgets ( указатель на файл, [ длина])
В результате работы функция fgets() возвращает строку длиной ( длина-1 ) байт из файла, на который указывает указатель на файл. Чтение заканчивается, если прочитано ( длина-1 ) символов или встретился символ перевода строки или конец файла. Напомним, что в PHP один символ - это один байт. Если длина fgets() возвращает false. Для версий PHP начиная с 4.3 эта
<?php
$h = fopen("my_file.html","r+");
$content = fgets($h,2);
// считает первый символ из
// первой строки файла my_file.html
fclose($h);
echo $content;
?>
Обе функции, и fgets(), прекращают считывание данных из файла, если встречают конец файла. В PHP есть специальная функция, проверяющая, смотрит ли указатель позиции файла на конец файла. Это булева функция feof(), в качестве параметра которой передается указатель на соединение с файлом.
Например, вот так можно my_file.html:
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgets($h);
echo $content,"<br>";
}
fclose($h);
?>
Существует разновидность функции fgets() - функция fgetss(). Она тоже позволяет fgetss() такой:
string fgetss(указатель на файл, длина [, допустимые теги])
Обратите внимание, что здесь аргумент длина обязательный.
Пример 9.6. Пусть у нас имеется файл my_file.html следующего содержания:
<h1>Без труда не вынешь и рыбку из пруда.</h1> <b>Тише едешь - дальше будешь</b> У семи нянек<i> дитя без глазу</i>.
Выведем на экран все строки файла my_file.html, удалив из них все теги, кроме <b> и <i>:
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgetss($h,1024,'<b><i>');
echo $content,"<br>";
}
fclose($h);
?>
В результате работы этого скрипта получим:
Без труда не вынешь и рыбку из пруда. Тише едешь - дальше будешь У семи нянек дитя без глазу.
Естественно, если можно считывать информацию из файла построчно, то можно fgetc(). Легко догадаться, что синтаксис у нее следующий:
string fgetc ( указатель на файл )
Эта функция возвращает символ из файла, на который ссылается указатель на файл, и значение, вычисляемое как FALSE, если встречен конец строки.
Вот так, например, можно
<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
$content = fgetc($h);
echo $content,"<br>";
}
fclose($h);
?>
На самом деле для того чтобы прочитать содержимое файла, открывать соединение с ним посредством функции совсем не обязательно. В PHP есть функции, которые позволяют делать это, используя лишь имя файла. Это функции и . Рассмотрим каждую из них подробнее.
Синтаксис:
int readfile ( имя_файла
[, use_include_path])
Функция считывает файл, имя которого передано ей в качестве параметра имя_файла, и выводит его содержимое на экран. Если дополнительный аргумент use_include_path имеет значение TRUE, то поиск файла с заданным именем производится и по директориям, входящим в .
В программу эта функция возвращает число FALSE. Сообщения об ошибке в этой функции можно подавить оператором
Пример 9.7. Следующий скрипт выведет на экран содержимое файла my_file1.html и "Error in .
<?php
$n = @readfile ("my_file1.html");
/* выводит на экран содержимое файла и
записывает его размер в переменную $n */
if (!$n) echo "Error in readfile";
/* если функция readfile() выполнилась
с ошибкой, то $n=false и выводим
сообщение об ошибке */
else echo $n;
// если ошибки не было, то выводим число
// считанных символов
?>
С помощью функции можно читать содержимое удаленных файлов, указывая их URL-адрес в качестве имени файла, если эта опция не отключена в настройках сервера.
Сразу же выводить содержимое файла на экран не всегда удобно. Порой нужно записать информацию из файла в переменную, чтобы в дальнейшем произвести с ней какие-либо действия. Для этого можно использовать функцию file() или .
Функция предназначена для считывания информации из файла в переменную типа , за исключением того, что в результате работы она возвращает массив:
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
Что за массив возвращает эта функция? Каждый элемент данного массива является строкой в файле, информацию из которого мы считываем (его имя задано аргументом имя_файла ). , как и все уже рассмотренные, возвращает false. Дополнительный аргумент use_include_path опять же определяет, искать или нет данный файл в директориях . Открывать удаленные файлы с помощью этой функции тоже можно, если не запрещено сервером. Начиная с PHP 4.3 работа с
Например, у нас имеется файл my_file.html следующего содержания:
<h1>Без труда не вынешь
и рыбку из пруда.</h1>
<b>Тише едешь - дальше будешь</b>
Прочитаем его содержимое с помощью функции file():
<?php
$arr = file ("my_file.html");
foreach($arr as $i => $a) echo $i,": ",
htmlspecialchars($a), "<br>";
?>
В результате на экран будет выведено следующее сообщение:
0: <h1>Без труда не вынешь
и рыбку из пруда.</h1>
1: <b>Тише едешь - дальше будешь</b>
В версиях PHP начиная с 4.3 появилась возможность считывать содержимое файла в строку. Делается это с помощью функции . Как и две предыдущие функции, в качестве параметров она принимает значение имени файла и, возможно, указание искать его в директориях . Для порядка все равно приведем ее синтаксис:
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
Эта функция абсолютно идентична функции file(), только возвращает она содержимое файла в виде строки. Кроме того, она безопасна для обработки бинарных данных и может считывать информацию из удаленных файлов, если это не запрещено настройками сервера.
Итак, создавать файл мы научились, записывать данные в него - научились, считывать данные из файла - тоже научились. Но вот вопрос: а что если файла, с которым мы пытаемся проделать все эти операции, не существует? Или он недоступен для чтения или записи? Очевидно, что в таком случае ни одна из изученных нами функций работать не будет и PHP выдаст сообщение об ошибке. Чтобы отслеживать такого рода ошибки, можно использовать функции file_exists(), is_writable(), is_readable().
Синтаксис:
bool file_exists (имя файла или директории)
Функция file_exists() проверяет, существует ли файл или директория, имя которой передано ей в качестве аргумента. Если директория или файл в файловой системе сервера существует, то функция возвращает TRUE, в противном случае - FALSE. Результат работы этой функции кэшируется. Соответственно очистить кэш можно, как уже отмечалось, с помощью функции clearstatcache(). Для нелокальных файлов использовать функцию file_exists() нельзя.
<?php
$filename = 'c:/users/files/my_file.html';
if (file_exists($filename)) {
print "Файл <b>$filename</b> существует";
} else {
print "Файл <b>$filename</b>
НЕ существует";
}
?>
Если кроме проверки is_writable() или ее псевдоним - функцию is_writeable().
Синтаксис:
bool is_writable (имя файла или директории)
Эта функция возвращает TRUE, если файл (или директория) существует и is_writable кэшируются.
Если кроме проверки is_readable().
Синтаксис:
bool is_readable (имя файла)
Эта функция работает подобно функции is_writable().
<?php
$filename = 'c:/users/files/my_file.html';
if (is_readable($filename)) {
print "Файл <b>$filename</b> существует
и доступен для чтения";
} else {
print "Файл <b>$filename</b>
НЕ существует или
НЕ доступен для чтения";
}
?>
Последнее, что мы хотим изучить из действий над файлами, - это unlink(). Синтаксис этой функции можно описать следующим образом:
bool unlink ( имя_файла)
Данная функция удаляет файл, имеющий имя имя_файла, возвращает TRUE в случае успеха этой операции и FALSE - в случае ошибки. Чтобы удалить файл, нужно тоже иметь соответствующие права доступа к нему (например,
<?php $filename = 'c:/users/files/my_file.html'; unlink($filename); // удаляем файл с именем // c:/users/files/my_file.html ?>
Теперь решим более сложную и часто возникающую на практике задачу enctype в теге form со значением multipart/form-data, а также элемент input типа file.
Пример 9.11.
<form enctype="multipart/form-data"
action="parse.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE"
value="30000" />
Загрузить файл: <input type="file"
name="myfile" /><br>
<input type="submit"
value="Отправить файл" />
</form>
Заметим, что мы добавили в форме
(рис 9.1) Пример формы для загрузки файла на серверТеперь нужно написать скрипт, который будет обрабатывать полученный файл.
Вся информация о загруженном на сервер файле содержится в глобальном массиве $_FILES. Этот массив появился начиная с PHP 4.1.0. Если включена директива , то значения переданных переменных доступны просто по их именам.
Если мы загрузили с компьютера-клиента файл с именем print_r($_FILES) ; выведет на экран следующее:
Array ( [myfile] =>
Array ( [name] => critics.htm
[type] => text/html
[tmp_name] => C:\WINDOWS\TEMP\php49F.tmp
[error] => 0
[size] => 15136
)
)
Вообще говоря, массив $_FILES всегда имеет следующие элементы:
$_FILES['myfile']['name'] - имя, которое имел файл на машине клиента.$_FILES['myfile']['type'] - mime-тип отправленного файла, если браузер предоставил эту информацию. В нашем примере это text/html.$_FILES['myfile']['size'] - $_FILES['myfile']['tmp_name'] - временное имя файла, под которым он был сохранен на сервере.$_FILES['myfile']['error'] - Здесь 'myfile' - это имя элемента формы, с помощью которого была произведена name, type и т. д.) остаются неизменными для любой формы.
Если , то доступны также дополнительные переменные, такие как $myfile_name, которая эквивалентна $_FILES['myfile']['name'], и т.п.
$_FILES['myfile']['error'] может иметь пять значений:
0 - ошибки не произошло, файл загружен успешно
1 - загружаемый файл превышает upload_max_filesize в
2 - загружаемый файл превышает MAX_FILE_SIZE формы html
3 - файл был загружен частично
4 - файл загружен не был
По умолчанию загруженные файлы сохраняются во временной директории сервера, если другая директория не указана с помощью опции upload_tmp_dir в . Переместить загруженный файл в нужную директорию можно с помощью функции move_uploaded_file().
Функция move_uploaded_file() имеет следующий синтаксис:
bool move_uploaded_file (временное_имя_файла,
место_назначения )
Эта функция проверяет, действительно ли файл, обозначенный строкой временное_имя_файла, был загружен через механизм загрузки HTTP методом POST. Если это так, то файл перемещается в файл, заданный параметром место_назначения (этот параметр содержит как путь к новой директории для хранения, так и новое имя файла).
Если временное_имя_файла задает неправильный загруженный файл, то никаких действий произведено не будет, и move_uploaded_file() вернет FALSE. То же самое произойдет, если файл по каким-то причинам не может быть перемещен. В этом случае интерпретатор выведет соответствующее предупреждение. Если файл, заданный параметром место_назначения, существует, то функция move_uploaded_file() перезапишет его.
<?
/* В версиях PHP, более ранних,
чем 4.1.0, вместо массива
$_FILES нужно использовать
массив $HTTP_POST_FILES */
$uploaddir = 'c:/uploads/';
// будем сохранять загружаемые
// файлы в эту директорию
$destination = $uploaddir .
$_FILES['myfile']['name'];
// имя файла оставим неизменным
print "<pre>";
if (move_uploaded_file(
$_FILES['myfile']['tmp_name'],
$destination)) {
/* перемещаем файл из временной папки
в выбранную директорию для хранения */
print "Файл успешно загружен <br>";
} else {
echo "Произошла ошибка при загрузке файла.
Некоторая отладочная информация:<br>";
print_r($_FILES);
}
print "</pre>";
?>
Подведем итоги. В этой лекции мы изучили, как создавать файлы с помощью языка PHP, как
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.