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