Окт 102011
 

В этом уроке мы научимся записывать данные в текстовые файлы, извлекать данные из файлов ну и все в таком роде.

Итак, для начала нарисуем простую форму с текстовым полем, не будем выдумывать велосипед и возьмем форму с одного из прошлых уроков

<form id="form1" name="form1" method="post" action="">
  <p>
    <label for="myinput"></label>
    <input type="text" name="myinput" id="myinput" />
  </p>
  <p>
    <input type="submit" name="go" id="go" value="Отправить" />
  </p>
</form>

наша задача: обработать введенные пользователем данные, и записать их в файл, для этого пишем php код
(сам код взят с оф сайта php, скажу по секрету: все самый крутые варианты работы с php находятся именно там)

<?php
$filename = 'test.txt';
if ($_POST){
$somecontent = $_POST['myinput'];

// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {

    // In our example we're opening $filename in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $somecontent will go when we fwrite() it.
    if (!$handle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($handle);

} else {
    echo "The file $filename is not writable";
}
}
?>

и этот самый код вставляем повыше нашей формы на странице. Давайте создадим руками файл test.txt — он должен находиться в той же директории, что и наша программа.
Теперь переведем програмный код на человеческий язык:
if (is_writable($filename)) — если файл $filename (а именно test.txt) доступен для записи (если его не существует — он тоже не будет доступен для записи) делаем следующее
if (!$handle = fopen($filename, ‘a’)) если открытие файла для записи не удалось
echo «Cannot open file ($filename)»; — выводим сообщение с ошибкой на экран
exit; — прерываем выполнение php кода на странице после возникновения данной ошибки
if (fwrite($handle, $somecontent) === FALSE) { если попытка записать содержимое переменной $somecontent (в нашем случае — переданные через форму данные) в файл, открытый выше не удалась
echo «Cannot write to file ($filename)»; — выводим сообщение об ошибке
exit; — прерываем выполнение php кода на странице после возникновения данной ошибки
echo «Success, wrote ($somecontent) to file ($filename)»; выводим сообщение об успешной записи в файл
fclose($handle); — закрываем файл

Думаю тут все понятно. Теперь давайте обратим внимание на второй параметр функции fopen().
В нашем примере это a, ниже я тупо осуществлю перевод таблички с сайта php т.к. тут отсебятина не нужна
‘r’- открывает файл только для чтения, ставит курсор в начало файла
‘r+’ — открывает файл для чтения и записи, курсор ставит в начало файла
‘w’ — открывает файл только для записи, стирает все содержимое файла, соответственно, курсов ставится в начало файла. Если файла не существует — пытается создать его.
‘w+’ — аналогично предыдущему, но открывает и для чтения и для записи
‘a’ — открывает файл для записи, курсор ставится в конец файла, если файла нет — пытается его создать
‘a+’ — тоже самое, но открывает и для записи и для чтения

Лично мне всегда хватало вышеописанных, если вам нужно еще — добро пожаловать на сайт php.net

Опробуйте работу всего скрипта: введите в текстовое поле какие то данные, нажмите кнопку, проверьте содержимое файла. Попробуйте изменить второй параметр функции fopen() и понаблюдать за результатом.

Отлично. Теперь нам надо что-то делать с полученными данными, а именно — считать их из файла. Опять лезем на php.net и тырим у них готовый код, для этого кода создадим отдельный файл, назовем его, к примеру, read.php, и разместим вместе с предыдущим.

$filename = "test.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

сохраняем, переходим по адресу read.php и видим содержимое нашего файла.

перевод кода на русский:
$handle = fopen($filename, «r»); — открываем файл для чтения
$contents = fread($handle — считываем данные из файла
filesize($filename) — в количестве равному количеству бит данного файла.
fclose($handle);— закрываем файл

Краткое пояснение: функция fread() имеет два обязательных параметра: файл и количество байт, которое нужно прочесть из него. Вот количество байт мы и читаем функцией filesize()

А если нам нужно получить не все содержимое файла в куче, а по отдельности, так как в нем, например, могут быть записаны имена и фамилии

Петр Иванов
А.С. Пушкин
Ф.М. Достоевский

это можно сделать так

// get contents of a file into a string
$filename = "test.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));

$result=explode("\n",$contents);
$i=0;
foreach($result as $res)
{
	$i++;
	echo 'Номер '.$i.' - '.	$res.'<br>';
}

fclose($handle);

Пояснения: функция explode() разбивает строку (а мы из файла получаем ни что иное как строку) и в качестве опорного пункта (разделителя) использует любую часть той же строки, например: у нас есть строка
Мой дядя самых честных правил,
Когда не в шутку занемог

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

$newvar = explode(",","Мой дядя самых честных правил, Когда не в шутку занемог");

первым параметром функции мы пишем разделитель (запятую), вторым — саму строку.
Что мы получаем в результате? Правильно, массив.
все что нам осталось сделать — разобрать массив, что мы уже умеем.

Возникает вопрос: что, собственно, такое это «\n» — а это скрытый символ, который указывает на перенос строки, некоторые редакторы позволяют включить отображение этих символов, но в принципе, вы и так можете понимать, что если в файле строка начинается с новой строки (во закрутил), то там присутствует «\n», соответственно, мы прекрасно можем использовать его как разделитель.

Пока все, любые вопросы не стесняясь пишите в комментарии.

Дорогие читатели! Мною было принято решение закрыть комментарии на блоге. Теперь все обсуждения переносятся на недавно открытый форум, ввиду того, что формат сообщений там намного удобней для обсуждения. Не стесняйтесь задавать любые вопросы по тематике блога! Я всегда на связи.
Перейти на форум
.
 Опубликовано в 3:57 пп

  3 комментария в “Изучение PHP – урок 5: работа с файлами”

  1. Жалко, что при копировании кода из браузера и вставке в файл, все сливается в одну строку и делается нечетабельным. Было бы хорошо, чтобы Вы разместили готовые файлы в архиве с переносом строк.

    • Странно что у вас все идет одной строкой, рекомендую использовать нормальный редактор, например этот.
      Не вижу смысла загромождать файлами в данном случае, да и в предыдущих уроках, кода мало, он легко копируется.
      p.s. для нормального копирования двойной клик по области кода — легче копировать.

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

Извините, форма комментирования закрыта в данный момент.