Работа с файлами в PHP
Под работой с файлами в PHP подразумевается чтение из файла и запись в файл различной информации. Совершенно очевидно, что работать с файлами приходится много, поэтому любой PHP-программист обязан уметь считывать из файла и записывать в файл.
Последовательность работы с файлами в PHP такая:
- Открыть файл.
- Выполнить необходимые действия.
- Закрыть файл.
Как видите, последовательность работы с файлами напоминает работу с файлами через обычный проводник. Только здесь вся работа выполняется автоматически самим PHP-скриптом.
Начнём с первого пункта - открытие файла. Файл открывается с помощью функции fopen(). Первый параметр - это путь к файлу, а второй параметр - модификатор. Давайте сразу разберём возможные модификаторы:
- a - открывает файл только для записи, причём указатель помещается в конец файла.
- a+ - то же самое, что и модификатор a, но также файл открывается ещё и для чтения.
- r - открывает файл только для чтения, а указатель устанавливается в начало файла.
- r+ - то же самое, что и модификатор r, но также файл открывается ещё и для записи.
- w - открывает файл только для записи, указатель устанавливает в начало файла и стирает всё содержимое файла.
- w+ - то же самое, что и модификатор w, только файл открывается также и для чтения.
Также различают два режима работы с файлами: бинарный (обозначается b) и текстовый (обозначается t). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.
Это все основные модификаторы, которых Вам вполне хватит. Теперь давайте узнаем, как закрыть файл. Закрывается файл с помощью функции fclose().
Теперь перейдём к чтению файла с помощью функции fread(). И давайте, наконец-то, приведу пример:
<?php
$handle = fopen("files/a.txt", "rt");
$contents = '';
while (!feof($handle))
$contents .= fread($handle, 4096);
fclose($handle);
?>
В данном примере мы сначала открываем файл для чтения в текстовом режиме (модификатор rt). Функция fopen() возвращает так называемый дескриптор, с помощью которого можно общаться с файлом, и записываем его в переменную handle. Затем мы в цикле while() до тех пор, пока не достигнут конец файл, считываем содержимое каждый раз по 4096 символов, которые записываем в переменную contents. После завершения процесса считывания - закрываем файл, вновь с помощью дескриптора файла.
Теперь перейдём к записи с помощью функции fwrite():
<?php
$handle = fopen("files/a.txt", "at");
$string = "This is text";
fwrite($handle, $string);
fclose($handle);
?>
После запуска этого скрипта, в файле a.txt добавится строка "This is text".
Особо внимательные читатели обратили внимание на указатели, о которых я писал чуть выше. Указатель - это текущая позиция воображаемого "курсора" в файле. Именно с него и начинается работа с файлом. Изменить положение указателя можно с помощью функции fseek():
<?php
$handle = fopen("files/a.txt", "rt");
$contents = fread($handle, 3);
echo $contents."<br />";
fseek($handle, 0, SEEK_SET);
$contents = fread($handle, 3);
echo $contents."<br />";
?>
Таким образом, мы сначала считываем 3 символа (в результате, текущее положение указателя сдвигается на 3 позиции). Затем мы устанавливаем указатель на начало файла. И вновь считываем 3 символа. Как Вы и догадались, мы два раза считали одно и тоже. То есть первый раз 3 символа, потом вернулись назад, и вновь считали 3 символа. Также если у функции fseek() заменить SEEK_SET на SEEK_CUR, то тогда второй параметр будет не устанавливать позицию указателя, а сдвигать относительно текущего местоположения. Советую даже попрактиковаться с указателями, потому что для понимания это не так просто. Также рекомендую попытаться записать что-нибудь в файл при позиции указателя, например, в самом начале файла. И обязательно объясните полученный результат.
И, напоследок, хочется привести ещё пару функций, которые позволяют работать с файлами на самом простом уровне: file_put_contens() и file_get_contents(). Функция file_put_contents() записывает в файл, а функция file_get_contents() считывает содержимое из файла. Эти функции очень просты в применении, но возможностей там уже меньше (хотя, как правило, они и не нужны):
<?php
file_put_contents("files/a.txt", "This is text 2");
echo file_get_contents("files/a.txt");
?>
В данном скрипте мы сначала записали строку "This is text 2" в файл, а потом считываем полученное содержимое и выводим его. Как видите, трудно придумать более простой способ чтения из файла и запись в файл.
Вот и все основные моменты работы с файлами в PHP.
Спасибо за внимание!
-
- Михаил Русаков
Комментарии (62):
В этом програмном коде "while (!feof($handle))" перед "feof" стоит символ "!"... почему??
Ответить
Потому что feof проверяет: достигнут конец файла или нет. Пока он не будет достигнут, будет возвращаться false. Отрицание делает true, а дальше while(true) выполняет следующую итерацию цикла.
Ответить
Спасибо=)
Ответить
Можно ли использовать это для вывода комментариев?
Ответить
Подскажите, а что делать, если открываешь файл на запись (модификатор 'w'), а браузер пишет: HTTP wrapper does not support writeable connections?
Ответить
А какой путь Вы указываете?
Ответить
Вы правы, путь некорректно указал. $DOCUMENT_ROOT рулит))
Ответить
Я разобрался с тем, как записать текст из формы у файл a.txt. Даже понял как вызывать этот текст с файла a.txt. Но ведь этот текст (напечатанный в форме) не добавляется на страницу (например index.php), а всеголишь отображается в браузере. Что я ещё не понял???
Ответить
Так Вы должны выводить его на той странице и в том месте, где должны быть комментарии.
Ответить
Тойсть, если html-форма на странице index.php, то и скрипт обработчик должен быть на этой странице? Сразу под закрывающим тегом </form> ? И тогда запись с формы добавится на страницу?
Ответить
Всё-таки PHP Вы совсем не знаете, не понимаете его. Обработчик может быть, где угодно. Его задача лишь добавить в текстовый файл новый комментарий, и, возможно, сделать редирект обратно. А вот место, где выводятся комментарии, вот там и должны считываться комментарии из файлов и выводиться.
Ответить
Вы правы. Я его не знаю! Если бы знал, то не позорился бы здесь!!! И всё-таки; В Месте Где Должны Выводится Комментарии, Какой Должен Быть Скрипт (Код)??
Ответить
<?php $text = file_get_contents("comments.txt"); echo $text; ?> Самый простой вариант вывода комментариев из файла.
Ответить
Помоги. Вторые сутки не выходит! Хочю записать Имя и Фамилию с формы у "один файл" - form.txt Использую для этого метод "Сериализация". Обработчик и форма лежат в одном файле - test.php Вот код: <?php if ( $_POST ) { file_put_contents("form.txt", serialize($_POST])); } ?> <form metho="POST"> Имя:<br> <input type="text" name="first_name"><br> Фамилия:<br> <input type="text" name="last_name"><br><br> <input type="submit" value="Отправить"> </form> Что здесь не хватает или не так? Выбрасывает ошибку: Parse error: syntax error, unexpected ']' in Z:\home\localhost\www\test.php on line 5
Ответить
$_POST] - у Вас так, а нужно $_POST[]. Отсюда и ошибка.
Ответить
А теперь выбрасывает: Fatal error: Cannot use [] for reading in Z:\home\localhost\www\test.php on line 5 Записал вот так: file_put_contents("form.txt", serialize($_POST[])); Что ещё можно попробовать?
Ответить
Потому что [] может использоваться только для записи, а не для использования в функциях. Поэтому вместо $_POST[] в данном случае надо просто писать $_POST.
Ответить
Заработало. Но не всё! Ничего не записывается в этот файл (form.txt). Что делать?
Ответить
Ещё ошибка в атрибутах <form>: metho="POST" Правильно писать: method="POST"
Ответить
вот моя проблема. Работаю в линукс убунту, не под рутом. Сервер апач. php5. Пишу это: <?php $myFile = "testFile.txt"; $fh = fopen($myFile, 'w') or die("can't open file"); $stringData = "Bobby Bopper\n"; fwrite($fh, $stringData); $stringData = "Tracy Tanner\n"; fwrite($fh, $stringData); fclose($fh); ?> не записывает. проверил права, выставил 777, не помогло. Проверял на чтение, все в порядке. это виртуальный хост. Пробовал и с вашим примером, тоже самое, читает, но не пишет.
Ответить
А почему вы про unlink() ничего не написали?
Ответить
Посмотрите в логах, что это за ошибка была. Если там будет Permission denied, то всё-таки проблема с правами, скорее всего, она и есть, поскольку в Windows Ваш код прекрасно работает. Попробуйте задать 777 не только на файл, но и на все родительские каталоги.
Ответить
Решил. Проблема в правах была, частично. Именно на каталоги и выставил. Причина в другом. В настройках виртуального хоста, "php_admin_value upload_tmp_dir /www/site.org/tmp php_admin_value error_log /www/site.org/log/php.log php_admin_value session.save_path /www/site.org/sess" было site.local. Жаль что в логах этого не отражается.
Ответить
Это все в Linux, в Windows я этого не делаю.
Ответить
У вас в предпоследнем примере опечатка Код: <?php $handle = fopen("files/a.txt", "rt");?>
Ответить
Подправил, спасибо!
Ответить
А что нужно записать в переменной string, чтобы в файле a.txt появилась не строка This is text, а комментарий с формы? Или в file_put_contents. Пожалуйста. За месяц не понял.
Ответить
Нужно записывать не переменную string, а переменную, в которой содержится текст комментария.
Ответить
Михаил, можешь написать самый простой код, который запишет в файл a.txt запись с формы? На примере мне будет легче разобраться.
Ответить
Он абсолютно аналогичен примеру в данной статье, но вместо $string = "This is text"; Будет $string = $_POST["text_comment"]; Или ещё какая-нибудь другая переменная.
Ответить
Файл a.txt создается, но в нем не появляется запись с формы! Вот форма: <form method="post" action="obrabotka.php"> <textarea name="otziv" cols="60" rows="10" wrap="virtual"></textarea> <input name="submit" type="submit" value="Добавить комментарий"></form> Чего не хватает в форме?
Ответить
$string = $_POST["otziv"];
Ответить
Ура ура ура! Записал несколько комментов у файл a.txt и вывел их на странице при помощи кода: <?php $text = file_get_contents("a.txt"); echo $text; ?> А теперь надо понять, как и где нужно вставить какой-нибуть разделитель этих комментов (например линия)? Или же подскажи как можно записывать каждый новый коммент одной и той же страницы в разные файлы (a.txt b.txt v.txt...)?
Ответить
Это Вы выбирайте, в каком формате хранить комментарии. А уже потом думайте, как основываясь на данном формате, извлекать данные. Вообще если делать всё адекватно, то надо хранить не в текстовых файлах, а в базе данных.
Ответить
Я не правильно задал вопрос! 1.Как вместе с новым комментом, который записывается в один и тот же файл (a.txt) записать текущее время и дату? 2.Как отсортировать и разделить комменты с файла a.txt по времени и дате их добавления? Если можно, то поделись этим кодом. А если нет, то дай ссылку именно на эту статью.
Ответить
Я именно на этот вопрос и ответил. Если Вы не понимаете ответ, то изучайте PHP дальше. Готовые скрипты можете поискать в Интернете. Я ими не пользуюсь, поэтому посоветовать готовых вариантов не могу.
Ответить
Как правильно записать строчьку fwrite($hdl,htmlspecialchars($HTTP_POST_VARS['otziv'])); если в форме добавления комментов есть ещё поле для ввода имени? 1. name="maks" - Имя 2. name="otziv" - сообщение. Хочу записать имя и сообщение в один файл. Записываю вот так: <?php $dirct="gb"; if ($HTTP_POST_VARS['otziv']!="") { $otznam=$ind.time(); $hdl = fopen("$dirct/$otznam", "w+"); fwrite($hdl,htmlspecialchars($HTTP_POST_VARS['otziv'])); fclose($hdl);
Ответить
<?php $handle = fopen("users/a.txt", "rt"); $contents = ''; while (!feof($handle)) $contents .= fread($handle, 4096); fclose($handle); ?> только у меня происходит зацикливание на этом скрипте? http://narod.ru/disk/46140222001.b080d80bf9d23b9f3682074ec69cb385/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9.png.html вот ссылка на скрин
Ответить
Здесь может быть зацикливание только если путь к файлу указан неправильно (users/a.txt).
Ответить
ну так путь к файлу у меня правильно написан!!!!
Ответить
Значит, файл очень длинный. Другого быть НЕ может!
Ответить
Вы имеете ввиду код файла слишком длинный?
Ответить
Да.
Ответить
Михаил, такой вопрос: я ради интереса вставил в текст кода строчку вывода echo "$handle"; Броузер на это выдал мне Resource id #3. Поясните, пожалуйста!
Ответить
Всё правильно, Вы выводите дескриптор файла, а не содержимое файла.
Ответить
Михаил, подскажите, а с помощью php возможна ли реализация следующей задачи: на страницу сайта выводить текст из файла .txt или .html. Задача в том, чтобы редактировать текст не в коде страницы, а в отдельном файле, и тем более если этот текст отображается на всех страницах - не переписывать один и тот же текст на всех страницах, а один раз изменить в отдельном файле. Особенно актуально - если это делает сторонний человек. Если такой возможности нет на html, css, php - подскажите, как это реализовать, пожалуйста. У меня не получилось это сделать.
Ответить
Для того, чтобы не переписывать всё подряд, можно использовать require_once и подключать блоки с повторяющимся контентом.
Ответить
Нигде не могу найти (у тебя на сайте) статью о том, как добавить запись в таблицу (БД) из формы (Имя, сообщение) Дай ссылку.
Ответить
У меня что-то совсем не получается, можете объяснить, как правильно указать путь к файлу и показать простейший скрипт вывода его содержимого на экран для чтения?
Ответить
Как задавать пути, проходится в HTML. А вывод файла показан в этой статье.
Ответить
Михаил, я хочу сделать для сайта небольшую админ панель, MySQL уже полностью готова к работе, текст, название, ID добавляет нормально, только я не могу записать в файл, создаваемый после записи в MySQL, длинный набор тегов, пишет, что синтаксическая ошибка, например, $php = " <?php echo "OK!"; ?>"; Выдает ошибку сервера и всё! Можно ли записать в файл переменные без /n, /" и подобным php тегам? Потому что проще вручную создавать файлы на хостинге.
Ответить
При выводе кавычек внутри кавычек, нужно экранировать внутренние. echo "<?php \"?>";
Ответить
А если у меня в файле находятся числа можно каким либо образом складывать их с теми которые я добавил?
Ответить
Складывать как числа или как строки? Если как числа, то получите число из файла, сложите его с новым и перезапишите файл.
Ответить
Михаил,можно ли сделать в php так, чтобы создавался файл, а в него записывались данные из формы?
Ответить
Можно. Нужно получить данные из формы, а дальше воспользоваться этой статьёй.
Ответить
Хорошо, что есть комментарии. Не мог решить задачу из курса "PHP С нуля до гуру". Почитал комментарии, сразу все понял и решил.
Ответить
Код print_r ($_POST); echo "<br />---------------------------------<br />"; $fp = fopen("file.txt", "a+t"); $text = "\r\n$_POST[name]"; $test = fwrite ($fp, $text); if ($test){ echo "В файл $fp успешно записано $text"; } else { echo "Ошибка записи в файл"; } fclose ($fp); Браузер выводит мне какой-то Resource id #3 заместо имени файла. Подскажите как вывести название файла на екран?
Ответить
Вы занесите название файла в переменную и в итоге указывайте её,вместо file.txt тогда и название сможете вывести
Ответить
А как сделать так, чтобы когда вторая запись в файл заносилась, старая не стиралась?
Ответить
Незначительная ошибка - " на самом простом уровне: file_put_contens()" *contenTs
Ответить
Здравствуйте Михаил. Не знаю, ответети ли вы, но я постараюсь объяснить :-) Дело вот в чем, есть такой вот код <?php $f = fopen("docc.txt", "w"); fwrite($f, $_POST["text"]); fclose($f); $f = fopen("docc.txt", "r"); echo fgets($f); fclose($f); ?> Как вы поняли, я с начало открываю файл для записи, записываю, закрываю. Потом опять открываю, читаю и закрываю. Приделал к этому скрипту форму <form method="post" action="sc.php"> <textarea name="text"></textarea> <button type="submit">Написать</textarea> </form> Все работает, с формы записывается в файл, но как только я выхожу с страницы, файл забывает что в него было записано и просто стерается. Когда я хочу что-то новое написать, оно просто перезаписывает. И я вот читал комментарии и не смог понять, как все таки сделать так, чтоб комментарии хранились в одном файле. И ещё, это получается, что я могу создать php страницу и txt документ, в txt документе могу хранить php скрипт и другие скрипты, а потом просто с помощью чтения файлов вывести на php странице? Если так возможно, то как сделать так, чтоб я мог через форму редактировать txt документ, но чтоб при вызове формы, код с txt документа содержался в форме? Или лучше не заморачиваться?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.