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

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

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

<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», соответственно, мы прекрасно можем использовать его как разделитель.

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

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

  1. dobrmir

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

    1. ОзимОзим Автор записи

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

  2. dobrmir

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

Комментарии запрещены.