В этом уроке мы научимся записывать данные в текстовые файлы, извлекать данные из файлов ну и все в таком роде.
Итак, для начала нарисуем простую форму с текстовым полем, не будем выдумывать велосипед и возьмем форму с одного из прошлых уроков
<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”, соответственно, мы прекрасно можем использовать его как разделитель.
Пока все, любые вопросы не стесняясь пишите в комментарии.
Жалко, что при копировании кода из браузера и вставке в файл, все сливается в одну строку и делается нечетабельным. Было бы хорошо, чтобы Вы разместили готовые файлы в архиве с переносом строк.
Странно что у вас все идет одной строкой, рекомендую использовать нормальный редактор, например этот.
Не вижу смысла загромождать файлами в данном случае, да и в предыдущих уроках, кода мало, он легко копируется.
p.s. для нормального копирования двойной клик по области кода – легче копировать.
Спасибо, про двойной клик не знал. Когда выделял вручную и копировал в буфер, разметка терялась.